已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
转载.教你在12864上打点(基于ST7920控制器) 基于ST7920控制的12864液晶用于字符显示很方便的,但它绘图时先要关闭显示,绘完后又要打开,速度会较慢,不如不带字库的,但也可用。首先,绘图的基础其实就是画点。ST7920提供了用于绘图的GDRAM(graph display RAM)。共 6432 个字节的空间(由扩充指令设定绘图 RAM 地址),最多可以控制 25664点阵的二维绘图缓冲空间。在它的Datasheet给出了GDRAM的坐标地址对照表:用坐标表示,就是这样:它的横坐标每一个地址都是16 位的。共16个地址,256位。 很明显,它能控制256*64像素的液晶屏,而我们的只是128*64像素液晶屏,显然只用到它的一部分。 我刚开始以为它对应屏幕的绘图RAM是这样分布的(如红色部分):结果栽了大根头,后来终于弄明白,原来它对应屏幕的GDRAM是这样分布的:只要我们清楚了它的GDRAM和屏幕上像素点的映射(对应)关系,点亮对应的像素点就容易多了。要点亮某一个像素点,就是将这个像素点在GDRAM中对应的位置1打点步骤-给你x,y的坐标,要你点亮一个点,首先,我们要确定这个点是在上半屏还是下半屏,然后确定它是在那一行(纵坐标Y),再确定它是在哪一个字节的哪一个位(也就是确定它在那一列,即横坐标X),最后,将该位置1下面我们边写代码边讨论。 因为这里仅仅是讨论如何在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 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 /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_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是以字符为主的(不回也行) 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; / /定义两个临时变量,用于存放读出来的数据 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(0x80 + 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 + 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(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); else /写下半屏 LCD12864_WriteRom( 0x88 ) ; Delay_50us(1); for( k = 0 ; k 设置为扩充指令集;2设置SR=O(设定CGRAM地址的前提),允许设定CGRAM地址;3设置为基本指令集;4循环执行以下操作写入16个字节数据(设定CGRAM的存储地址;写入自定义数据);5设置DDRAM地址6写入显示CGRAM显示码也就是说只有后六位是CGRAM的地址范围是00 0000(0x00)-11 1111(0x3F),整个字节也就是0x40-0x7F,这就是CGRAM地址的范围,在进行设置CGRAM字库的过程中,进行的有如下三句操作,也就是在设置CGRAM地址时是在SR=0有效时进行的,SR=0,也就表明是对CGRAM地址的设置,依此来区分是设置的DDRAM地址或CGRAM地址;LcdWcom(0x34); /再次设置为8位并行口,扩展指令集LcdWcom(0x02); /SR=0,允许设置CGRAM地址LcdWcom(0x30); /恢复设置为8位并行口,基本指令集你写入的数据编码分为三种:一种是一个字节的HCGROM,也就是字符;一种是两字节的CGROM,也就是内部的中文汉字字库;最后一种就是两字节的CGRAM,也就是你自己造的字库;具体的编码是这样的:如果你第一个字节写入DDRAM的内容在0x02-0x7F之间,那么就会认为你要写入的是HCGROM编码;如果你第一个字节写入DDRAM的内容不在0x02-0x7F之间,在0xA1之上的,那就认为是CGROM编码,接收第二个字节,然后组合在一块显示出汉字;如果你第一个字节写入DDRAM的内容不属于以上的范围那自然就是CGRAM编码了,接收第二个字节,然后组合在一块显示出自造的16*16的字符;另外还对CGRAM的编码有详细的规定,只能是0x0000,0x0002,0x0004,0x0006四种编码,对应的是CGRAM中你写入的0x40-0x7F范围的数据,0x40-0x7f正好
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 标准厂房环保节能改造方案
- 写字楼食堂咖啡厅运营承包实施方案
- 快递行业仓储物流分拣流程优化方案
- 车间生产调度管理方案设计
- 项目管理关键难点分析报告
- 酒店客户接待礼仪培训教材
- 英语课程说课稿编写技巧分享
- 幼儿园搓汤圆亲子活动教案
- 班主任高效管理技巧四字口诀
- 二十四节气与现代健康养生指南
- 2025年医院感染暴发应急处置演练流程(脚本)(以ICU为例)
- 形势与政策台湾问题课件
- 安责险和安全知识培训课件
- 楷书入门教学课件
- 关于A公司资本结构优化研究
- 2025至2030中国核废料管理行业项目调研及市场前景预测评估报告
- DB52∕T 1842-2024 更年期健康教育规范
- 妊娠合并肺动脉高压的护理
- 2025年青少年科技创新比赛考核试卷及答案
- 2025年人教版小学五年级语文(上册)期中试卷及答案
- 杜邦安全理念培训课件
评论
0/150
提交评论