
12864液晶显示图片原理.doc
34页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#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调整图片的宽高比大致为 2:1 ;2>将图片缩小到 128*64 像素;3>保存为单色位图;图片的大小缩放不太好操作,我通常是这样做的:你用画图程序打开你要显示的图片后,首先要操作的查看属性(点击菜单栏的图像->属性,单位选择为像素后,宽高值就出来了),比如:宽:603 ,高:444,这显然宽高比不是 2:1,你就要调整了,444*2=888,现在为 603,所以 888/603=1.47,所以宽要放大为 147%(点击菜单栏的图像->拉伸/扭曲,在拉伸里面的水平处改为 147),现在就调整为 2:1了;接下来就要将图片缩小到 128*64 像素,先计算缩放的比例,128/888=0.144,所以相同的操作(点击菜单栏的图像->拉伸/扭曲,在拉伸里面的水平处改为 14,垂直里面也要改为 14);最后就是保存为单色位图(文件->另存为->文件类型选择为:单色位图(.bmp ))?试过颜色比较单一的,效果还可以,复杂的彩色图片效果就很不理想了...说明:在调整图片的宽高比大致为 2:1 的过程中图片会被拉伸变形,不过缩小到 128*64 像素后也不是太明显...图片取模图片代码——————————————————————————————————uchar code LCD_picture1[]={0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x07,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x03,0x00,0x07,0xEC,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x37,0x80,0x03,0x00,0x00,0xEC,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x18,0x3F,0xC0,0x03,0x00,0x0F,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x18,0x79,0x80,0x03,0x00,0x0F,0x6B,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x18,0x7F,0x00,0x1F,0xF4,0x01,0xE9,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0xE0,0x18,0xFF,0x80,0x1F,0xFC,0x00,0xFB,0x30,0x00,0x00,0x00,0x00,0x00,0x01,0xC6,0x70,0x1B,0x1E,0xC0,0x03,0x38,0x01,0xB3,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x86,0x38,0xDB,0xFF,0xE0,0x03,0x70,0x07,0x9E,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x26,0x18,0xDB,0x8C,0x70,0x7F,0xFF,0x87,0x27,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x01,0xFF,0xFF,0xB8,0x7F,0xFF,0x80,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x0C,0x18,0x07,0x80,0x00,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0xFF,0xE0,0x0F,0x00,0x00,0xFB,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xF0,0xFF,0xE0,0x1F,0x30,0x01,0xCF,0xFF,0xFF,0x09,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0x0C,0x00,0x3B,0x36,0x03,0x07,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xCC,0x00,0x73,0x76,0x03,0x3F,0xFF,0xFF,0xF7,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFC,0x00,0x63,0xE6,0x00,0x3F,0xFF,0xFF。
