微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > LCD12864 打点求助

LCD12864 打点求助

时间:10-02 整理:3721RD 点击:
这个是在网上找的打点函数,其中有几点不太懂,希望有经验的指点一下,万分感谢!
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)        ,个人认为,读取一次不就可以了么,为什么还有读取两次啊,》》》       

坐等回帖!
希望单个你几分钟,来解救我的困惑我好久的难题

1。为什么要设置两个变量,个人解释为要读两次值,并储存起来
因为读取的数据时16位,而LCD只能单次发送8位,所以需要分两次发送,合并为一个16位数据。
2.的问题同一

谢谢啦,这个我下去有查了一下资料,确实是十六位数据,
由于我对扩展指令理解有点误解,导致我很多东西理解错误,走了很多弯路,
最后还是谢谢小编!

file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.jpg
这个是我找到的坐标表,仔细看的话可以发现存取的数据是十六位的,我是按照以往的模式理解的,结果走了弯路,哈哈,


MARK。

受益

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top