LCD12864 打点求助

2019-07-16 04:48发布

这个是在网上找的打点函数,其中有几点不太懂,希望有经验的指点一下,万分感谢!
void draw_dot(uchar x,uchar y)
{
        uchar x_byte,x_bit;                        //确定dot在横轴上的哪个字节内的哪个位
        uchar y_byte,y_bit;                        //确定dot在竖轴上的哪个字节内的哪个位
        uchar TempH,TempL;                        //用来存放读出来的原始数据的高8位和低8位,
                                                                //目的是为了避免新的数据点写进去后覆盖掉前面的点

        x=x&0x7f;                                        //限制横坐标所在范围,为0-127
        y=y&0x3f;                                        //限制纵坐标所在范围,为0-31(上半屏)  0-31(下半屏)

        x_byte=x/16;                                //确定该dot在哪一个字节       
        x_bit=x%16;                                        //确定该dot在哪一个点

       
        y_byte=y/32;                                //确定该dot在那个半屏,0:上半屏 1:下半屏
        y_bit=y%32;                                        //确定该dot在第几行(因为到了下半屏也是从0行开始到31行)

       
        wr_cmd(0x34);                                                        //打开扩展指令集,关闭基本功能模式,绘图显示关闭
        set_col(y_bit);                                                //先将光标纵坐标写到指定行
        set_row(x_byte+8*y_byte);                        //再将光标横坐标写到指定位置,若y_byte为1,则说明大于了31行(从0行算起)
                                                                                                //则需将AC指针写到0x88处即ST7920控制下的第3行
       
        Read_data();                                                    //当下设定AC地址指令后,若要读取数据需要预先dummy read一次,才会读到正确数据
                                                                                                //第2次读取时不需要dummy read,除非又重新设定AC位置才需再次dummy read

        TempH=Read_data();                                                        //读取高8位数据
        TempL=Read_data();                                                        //读取低8位数据                                                                                       
       
        set_col(y_bit);                                                //读操作会改变AC位置,所以需要重新写入1次
        set_row(x_byte+8*y_byte);       

        if(x_bit<8)
        {
                wr_data(1,TempH|(0x01<<(7-x_bit)));         //如果要写的dot在高8位,则这样写利用or运算避免新数据覆盖原先数据
                wr_data(1,TempL);                                                //原先的低8位数据照常写入
        }
        else
        {
                wr_data(1,TempH);                                                //如果要写的dot在低8位,原先的高8位数据照常写入
                wr_data(1,TempL|(0x01<<(15-x_bit)));        //低8位则这样写利用or运算避免新数据覆盖原先数据
        }
               
        wr_cmd(0x36);                                                        //开绘图显示                                                                       
        wr_cmd(0x30);                                                        //回到GDRAM显示模式
}




主要是这里有些疑问
        uchar TempH,TempL;                        //用来存放读出来的原始数据的高8位和低8位,
                                                                //目的是为了避免新的数据点写进去后覆盖掉前面的点

1。为什么要设置两个变量,个人解释为要读两次值,并储存起来

       
        Read_data();                                                    //当下设定AC地址指令后,若要读取数据需要预先dummy read一次,才会读到正确数据
                       
2.这个读取,可能是硬件问题,也可以理解

        TempH=Read_data();                                                        //读取高8位数据
        TempL=Read_data();                                                        //读取低8位数据                                                                        33.这里为什么要读取两次啊????十分不理解,解释说两次一次读取高位,一个读取低位,具体不太清除,希望能详解一下,也可以举下例子,比如说 draw_dot(0,0)        ,个人认为,读取一次不就可以了么,为什么还有读取两次啊,》》》       



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。