好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

12864液晶显示图片原理(完整版).doc

78页
  • 卖家[上传人]:简****9
  • 文档编号:98235899
  • 上传时间:2019-09-09
  • 文档格式:DOC
  • 文档大小:1.48MB
  • / 78 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 51单片机综合学习    12864液晶原理分析1 辛勤学习了好几天,终于对12864液晶有了些初步了解~没有视频教程学起来真有些累,基本上内部程序写入顺序都是根据程序自我变动,然后逆向反推出原理……芯片:YM12864R P-1 控制芯片:ST7920A   带中文字库初步小结:1、 控制芯片不同,寄存器定义会不同2、 显示方式有并行和串行,程序不同3、 含字库芯片显示字符时不必对字符取模了4、 对芯片的结构地址一定要理解清楚5、 显示汉字时液晶芯片写入数据的顺序(即显示的顺序)要清楚6、 显示图片时液晶芯片写入数据的顺序(即显示的顺序)要清楚7、 显示汉字时的二级单元(一级为八位数据写入单元)要清楚8、 显示图片时的二级单元(一级为八位数据写入单元)要清楚   12864点阵液晶显示模块(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列每个显示点对应一位二进制数,1表示亮,0表示灭存储这些点阵信息的RAM称为显示数据存储器要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中图形或汉字的点阵信息由自己设计,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。

      由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8 bits显示数据RAM左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择显示点在64*64液晶屏上的位置由行号(line,0~63)与列号(column,0~63)确定512*8 bits RAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定每个存储单元存储8个液晶点的显示信息 为了使液晶点位置信息与存储地址的对应关系更直观关,将64*64液晶屏从上至下8等分为8个显示块,每块包括8行*64列个点阵每列中的8行点阵信息构成一个8bits二进制数,存储在一个存储单元中注意:二进制的高低有效位顺序与行号对应关系因不同商家而不同)存放一个显示块的RAM区称为存储页即64*64液晶屏的点阵信息存储在8个存储页中,每页64个字节,每个字节存储一列(8行)点阵信息因此存储单元地址包括页地址(Xpage,0~7)和列地址(Yaddress,0~63)例如点亮128*64的屏中(20,30)位置上的液晶点,因列地址30小于64,该点在左半屏第29列,所以CS1有效;行地址20除以8取整得2,取余得4,该点在RAM中页地址为2,在字节中的序号为4;所以将二进制数据00010000(也可能是00001000,高低顺序取决于制造商)写入Xpage=2,Yaddress=29的存储单元中即点亮(20,30)上的液晶点。

                                                        芯片的结构一定要清楚!  点阵LCD的显示原理        在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码而剩下的低128位则留给英文字符使用,即英文的内码       那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模的记载方式如图1所示:                                                                 图1 “A”字模图  而中文的“你”在字模中的记载却如图2所示:                                               图2 “你”字模图                                                                                                           图3                                                                 图4 字符二级单元(图3中阴影部分)                   一个汉字的二级单元是一个16*16的区域,因些128*64液晶可以显示4行8列共32个汉字(如图3)。

      而它的一个二级单元如图4(在无字库时,对汉字的取模有横向跟纵向两种,要注意),对于并行含有子库芯片的显示,只要设定好这个二级单元的地址(如0X80+i,这样设定i的范围为0~31,这里注意第一行会直接跳到第三行;或者根据自己需要如第二行0X90+i,i范围为0~7;第三行0X88+i,i范围为0~7;),然后直接把汉字写入就OK了~(串行无字符库的后面再做分析)                                                                       图5:垂直坐标:上半屏00~1F,总共为32          水平坐标:上半屏水平坐标分别为0X80+(00~07)          下半屏00~1F,总共为32                              下半屏水平坐标分别为0X88+(00~07)                                                                          图片显示芯片结构分块与汉字显示不一样             图象显示过程是这样的:首先设置垂直地址,再设水平地址(连续写入两个字节的资料来完成垂直与水平的坐标地址,然后在每个地址里写入16位数据)。

        垂直地址范围 AC5...AC0                            水平地址范围 AC3…AC0          绘图RAM 的地址计数器(AC)只会对水平地址(X 轴)自动加一,当水平地址=0FH 时会重新设为00H           但并不会对垂直地址做进位自动加一,故当连续写入多笔资料时,程序需自行判断垂直地址是否需重新设定GDRAM的坐标地址与资料排列顺序如图5:分上下屏写入for(i=0;i<32;i++)              // 上半屏32个垂直地址{ write_com(0x80 + i);    //  垂直地址 write_com(0x80);         //  水平地址 for(j=0;j<16;j++)      {          write_data(*adder);         adder++;                             }           }  带中文字库的128X64显示模块时应注意以下几点:          ①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。

                ②显示ASCII字符过程与显示中文字符过程相同不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置          ③当字符编码为2字节时,应先写入高位字节,再写入低位字节          ④模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成指令执行的时间请参考指令表中的指令执行时间说明⑤“RE”为基本指令集与扩充指令集的选择控制位当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位 程序———————并行(串行后面再分析)——————————————————————————#include #include #include #include #define uchar unsigned char#define uint unsigned intuchar code LCD_data1[];uchar code LCD_data2[];uchar code LCD_picture1[];uchar code LCD_picture2[];sbit RS = P2^4;sbit RW = P2^5;sbit EN = P2^6;sbit PSB = P2^1;sbit RES = P2^3;sbit Dataport = P0;sbit Busyport = P0^7;//////////////////////////////////////////////////////////////void    delay_ms(unsigned int n)            //延时10×n毫秒程序 {    unsigned int i,j;    for(i=0;i

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.