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) ,个人认为,读取一次不就可以了么,为什么还有读取两次啊,》》》
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。
受益