12864上打点及造字原理st7920

上传人:cl****1 文档编号:431184419 上传时间:2023-06-24 格式:DOC 页数:13 大小:741KB
返回 下载 相关 举报
12864上打点及造字原理st7920_第1页
第1页 / 共13页
12864上打点及造字原理st7920_第2页
第2页 / 共13页
12864上打点及造字原理st7920_第3页
第3页 / 共13页
12864上打点及造字原理st7920_第4页
第4页 / 共13页
12864上打点及造字原理st7920_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《12864上打点及造字原理st7920》由会员分享,可在线阅读,更多相关《12864上打点及造字原理st7920(13页珍藏版)》请在金锄头文库上搜索。

1、转载.教你在12864上打点(基于ST7920控制器) 基于ST7920控制的12864液晶用于字符显示很以便的,但它绘图时先要关闭显示,绘完后又要打开,速度会较慢,不如不带字库的,但也可用。一方面,绘图的基本其实就是画点。ST7920提供了用于绘图的GDRAM(graph display RAM)。共 6432 个字节的空间(由扩大指令设定绘图 RAM 地址),最多可以控制 25664点阵的二维绘图缓冲空间。在它的Datasheet给出了GDRAM的坐标地址对照表:用坐标表达,就是这样:它的横坐标每一种地址都是16 位的。共16个地址,256位。 很明显,它能控制256*64像素的液晶屏,而

2、我们的只是128*64像素液晶屏,显然只用到它的一部分。 我刚开始觉得它相应屏幕的绘图RAM是这样分布的(如红色部分):成果栽了大根头,后来终于弄明白,本来它相应屏幕的GDRAM是这样分布的:只要我们清晰了它的GDRAM和屏幕上像素点的映射(相应)关系,点亮相应的像素点就容易多了。要点亮某一种像素点,就是将这个像素点在GDRAM中相应的位置1打点环节-给你x,y的坐标,要你点亮一种点,一方面,我们要拟定这个点是在上半屏还是下半屏,然后拟定它是在那一行(纵坐标Y),再拟定它是在哪一种字节的哪一种位(也就是拟定它在那一列,即横坐标X),最后,将该位置1下面我们边写代码边讨论。 由于这里仅仅是讨论如

3、何在12864上打点的,而不是给12864写一种驱动,因此对于基本的数据读写函数,我们不做讨论,这里假设已有了如下基本函数:view sourceprint?1void lcd_write_cmd(unsigned char); /lcd 命令写 2void lcd_write_data(unsigned char); /lcd 数据写 3unsigend char lcd_read_data(void); /lcd 数据读 为了以便,我们定义如下宏:1#define BASIC_SET 0x00 /基本指令集, 2#define EXTEND_SET 0x00/扩展指令集 3#define

4、DRAW_ON 0x10/绘图显示开 4#define DRAW_OFF 0x00/绘图显示关点亮某一种点的函数(不完善):01void lcd_set_dot(unsigned char x, unsigned char y) 02 03unsigned char x_byet, x_bit; /在横坐标的哪一种字节,哪一种位 04unsigned char y_ping, y_bit; /在纵坐标的哪一屏,哪一行05x_byte = x / 16;/算出它在哪一种字节(地址) 06/注意一种地址是16位的 07x_bit = x % 16; /算出它在哪一种位 08y_ping = y /

5、32;/ 拟定在上半屏还是下半屏,0:上半屏 1:下半屏11y_bit = y % 32; /y_bit拟定它是在第几行 12lcd_write_cmd(EXTEND_SET); /扩展指令集 13lcd_write_cmd(DRAW_OFF); /绘图显示关闭,绘图前要先关闭 14lcd_write_cmd(0x80 + y_bit); /先写垂直地址(第几行),绘图要先写垂直地址 16lcd_write_cmd(0x80 + x_byte + 8 * y_ping); /再写水平地址,下半屏的水平坐标起始地址为0x88 ,(+8*y_byte)就是用来拟定在上半屏还是下半屏19if (x_

6、bit 8) /如果x_bit位数不不小于8 20 21lcd_write_data(0x01 (7 - x_bit); /写高字节。由于坐标是从左向右的 22/GDRAM高位在左,底位在右23lcd_write_data(0x00); /低字节所有填0 24 25else26 27lcd_write_data(0x00); /高字节所有填0低字节打入相应的点 28lcd_write_data(0x01 (15 - x_bit); 29 30lcd_write_cmd(DRAW_ON); /打开绘图显示 31lcd_write_cmd(BASIC_SET); /回到基本指令集,毕竟ST7920

7、是以字符为主的(不回也行) 32return ; 33 上面的程序会浮现问题,因素是由于我们画点时对其他的位所有填0解决了,导致对本来的信息的破坏。因此我们要读出要写的那个地址本来的数据,再进行加工,写回去就可以解决问题了。 改善后的代码:01void lcd_set_dot(unsigned char x, unsigned char y) 02 03unsigned char x_byet, x_bit; /在横坐标的哪一种字节,哪一种位 04unsigned char y_ping, y_bit; /在纵坐标的哪一屏,哪一行05unsigned char tmph, tmpl; / /定

8、义两个临时变量,用于寄存读出来的数据 06x &= 0x7F; /不太理解,不要行吗?、?、?07y &= 0x3F; 08x_byte = x / 16;/算出它在哪一种字节(地址),注意一种地址是16位的10x_bit = x&0x0F; /算出它在哪一种位 11Y_ping = y /32; /拟定它在上半屏还是下半屏, 0:上半屏 1:下半屏 14y_bit = y&0x3F; /y_bit拟定它是在第几行 15lcd_write_cmd(EXTEND_SET); /扩展指令集 16lcd_write_cmd(DRAW_OFF); /绘图显示关闭 17lcd_write_cmd(0x8

9、0 + y_bit); /先写垂直地址(最高位必须为1) 19lcd_write_cmd(0x80 + x_byte + 8 * y_ping); /水平坐标, 下半屏的水平坐标起始地址为0x88 , (+8*y_byte)就是用来拟定在上半屏还是下半屏23lcd_read_data(); /先空读一次??这样做对吗? 24tmph = lcd_read_data();/读高位 25tmpl = lcd_read_data(); /读低位26lcd_write_cmd(0x80 + y_bit); /读操作会变化AC,因此重新设立一次 27lcd_write_cmd(0x80 + x_byte

10、 + 8 * y_ping); 28if (x_bit 8) /如果x_bit位数不不小于8 29 30lcd_write_data(tmph | (0x01 (7 - x_bit); /写高字节。由于坐标是从左向右的,GDRAM高位在左,底位在右 32lcd_write_data(tmpl); /原低位数据送回 33 34else35 36lcd_write_data(tmph); /原高位数据送回 37lcd_write_data(tmpl | (0x01 (15 - x_bit); 38 39lcd_write_cmd(DRAW_ON); /打开绘图显示 40lcd_write_cmd(

11、BASIC_SET); /回到基本指令集,毕竟ST7920是以字符为主的 41return ; 42画点函数到此就完毕了,剩余的事情就是对函数的优化了。例如对入口参数的检查,对乘除法的优化等等。12864(绘图显示)画完一屏重画会浮现花屏现象,解决措施1.花屏因素:带中文字库的LCD,使用图形模式时,应对所有GDRAM写0x00才算清屏,清屏命令是对使用自带字库显示时用的,对于画图不合用。2.GDRAM清屏程序:void LCD12864_DisplayCLR() uchar i, j, k ; LCD12864_IfBusy();/忙标检测LCD12864_WriteRom(0x34);/打开扩展指令集,8位数据传播lcd_write_cmd(DRAW_OFF); /绘图显示关闭 for( i = 0 ; i 2 ; i+ )/分上下两屏写 for( j = 0 ; j 32 ; j+ ) LCD12864_IfBusy(); LCD12864_WriteRom( 0x80 + j ) ;/写Y坐标 Delay_50us(1); if( i = 0 ) /写X坐标 LCD12864_WriteRom( 0x80 ) ; Delay_50us(1);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号