《项目10单片机LCD液晶显示器实验测试.docx》由会员分享,可在线阅读,更多相关《项目10单片机LCD液晶显示器实验测试.docx(28页珍藏版)》请在三一办公上搜索。
1、项目10、单片机LCD液晶显示器实验测试教学内容:任务1: 1602液晶显示器的原理及电路设计任务2: 程序设计与仿真调试教学目的:一、了解LCD液晶显示器的工作原理。二、掌握LCD液晶显示器的编程控制方法。任务1: 1602液晶显示器的原理及电路设计LCD是Liquid Crystal Display 的简称是一种利用液晶的扭曲/向列制成的新型显示器。一、LCD的特点:()显示质量高,由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新亮点,因此,液晶显示器画质量高且不会闪烁。()数字式接口液晶显示器都是数字式的,与单片机系统
2、的接口更加喜欢简单可靠,操作更加方便。()体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同的显示面积的传统显示器要轻的多。(4)、功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其他显示要少得多。二、液晶显示器原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样就可以显示出图形,液晶显示器具有厚度薄、适用于大规模集成电路直接驱动和易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机和PDA移动通信工具等众多领域。三、LCD的分类、显示方式:(1)段式(2)字符式(3)点
3、阵式(1)段式的应用:计算器、电子表、数字万用表等;显示类型与数码管类似,靠7个字段拼凑数字显示;一般只能显示09,AF16种字符;驱动简单,耗电量小;在仅需要显示数字的场合应用较多;也用来在便携式应用的场合来代替数码管 。(2)、点阵字符式:有192种内置字符,包括数字、字母、常用标点符号等。另外用户也可以自定义5*7点阵的字符等。(3)、点阵图形式:除可以显示字符外,还可显示各种图形信息、汉字等。区别:(1)点阵型Lcd就是整个Lcd由若干个点构成,如240128就是240*128个点,可以显示图形和汉字、字母、符号等,要显示的内容大小可以自己定义(2)字符型Lcd固定每行显示多少个字符,
4、每个字符显示的位置固定。 (3)段式一般没有专门的控制器,显示的东西都是相对固定的,一般把显示的内容直接开模做。有专门的多段码液晶驱动控制芯片。(4)字符型、图形式的液晶则有控制器(要翻译MCU送来的控制命令)。 不同的控制器指令不一样。而具体的液晶结构,也需要不同的控制器。主要是点阵结构、扫描模式。 2、色彩度(1)黑白(2)多灰度(3)彩色显示3、驱动方式:(1)主动矩阵驱动优点:.广阔的视角LCD是被动显示技术,需要强的背景光线穿过液晶层来形成图像。LCD的特性决定不会产生视觉疲劳的优良性能,同时用为它需要定向的背景光限制了可视角度。LUXEON LCD采用的A-si 主动矩阵技术结合其
5、原创的SuperviewTM技术从两个方面有效解决了可视角的难题:a. 显示屏漫射增益技术:利用菲涅尔透镜原理,显示屏对特殊的处理,以增大漫反射;在扩大视角的同时可提升显示对比度和亮度均匀性。需要极高的工艺水准。b. 液晶微单元技术:将每个液晶单元分割成大量微小的部分,事先将这些微小子单元以不同的方向倾斜,这就使得传播光线在到达这些微小面板的时候向各个方向散射,从而增大可视角度。.丰富色域表现,可以真正达到16.7M色液晶本身没有颜色,每个LCD的子像素显示的颜色取决于色彩过滤器。LCD Panel的数字信号控制器控制滤色片产生各种颜色。主动矩阵LCD采用8位控制器,可以产生256级灰度。每个
6、子像素能够表现256级,那么你就能够得到2563种色彩,每个像素能够表现16,777,216种颜色。由于人的眼睛对亮度的感觉并不是线性变化的,人眼对低亮度的变化更加敏感,所以普通的24位的色度并不能完全达到理想要求。框架速率控制(FRC):通常只应用于高端专业产品;通过时间控制在显示每屏图像时多次刷新像素;与高频振动中将灰度的混合用空间来显示不同色彩过渡层。如果显示一幅画面需要的时间分为很多帧,像素就可以在帧的切换当中造成一种灰度的过渡态,四帧就可以造成三个过渡态。可以不降低图像的分辨率,实现完美的色彩表现。(2)静态驱动静态驱动法是指在像素前后电极士几施加驱动电压时呈显示状态,不施加驱动电压
7、时则呈非显示状态的一种直接驭动方法从前面叙述可知,液晶显示器不宜施加直流电压.故静态驱动法施加到电极上的电压信号为交变信号,也就是说静态驱动方法的基本思想是在相对应的一对电极间连续外加电场或不外加电场。(3)单纯矩阵驱动4、采光方式LCD可公为带背光源和不带背光源两类不带背光源LCD是靠显示器背面的反射膜将射入的自然光从下面反射出来完成的。大部分设备的LCD是用自然光的光源,可选用不带背光的LCD。若产品工作在弱光或黑暗条件下时,则选择带背光的LCD。在电子工业中,背光是一种照明的形式,常被用于LCD显示上。背光式和前光式不同之处在于背光是从侧边或是背后照射,而前光顾名思义则从前方照射。他们被
8、用来增加在低光源环境中的照明度和电脑显示器、液晶荧幕上的亮度,以和CRT显示类似的方式产生出光。 其光源可能是白炽灯泡、电光面板(ELP)、发光二极管(LED)、冷阴极管(CCFL)等。电光面板提供整个表面均匀的光,而其他的背光模组则使用散光器从不均匀的光源中来提供均匀的光线。 背光可以是任何一种颜色,单色液晶通常有黄、绿、蓝、白等背光。而彩色显示采用白色白光,因其涵盖最多色光。 LED背光被用在小巧、廉价的LCD面板上。他的光通常是有颜色的,虽然白色背光已经愈来愈普遍了。电光面板经常被使用在大型显示上,这时均匀的背光是很重要的。电光面板需要经由高压的交流电来驱动,这部份由反用换流器回路来提供
9、。冷阴极管被用在像是电脑显示器上,颜色上通常是白色的,这同样也需要反用换流器和散光器。白炽背光则在需要高亮度时被使用,但是其缺点则是白炽灯泡的寿命相当有限,而且会产生相当多的热量。 LED背光可增进LCD显示的色彩表现。LED光是经由三个各别的LED所产生出来,提供相当吻合LCD像点滤色器自身的色光谱。四、图形显示的原理1、线段:点阵图形式液晶由M*N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16*8=128个点组成,屏上64*16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如:屏的第一行
10、的亮暗由RAMaq的000100FH的16字节的内容决定,当(000H)=(FFH)时,则屏幕左上角显示一条短亮线。(1024)10=(400)16000H3FFH2、字符的显示:用LCD显示一个字符时比较复杂,因为一个字符由6*8或8*8点阵组成,既要找到屏幕上某几个位置对应的显示RAM区的8字节,还有使每字节的不同位为“1”,其他的为“”。这样就组成了某个字符,但对于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示器RAM对应的地址,设立光标,在此送上该字符对应的代码即可。、显示汉字(1)汉字编码汉字的输入法:
11、音码、形码、区位码区位码:1980年,为了使每一个汉字有一个全国统一的代码,我国颁布了第一个汉字编码 的国家标准: GB2312-80信息交换用汉字编码字符集。将其中的汉字和其他符号按照一定的规则排列成为一个大的表格,在这个个表格中,第一(横)行称为一个“区”,每一(竖)列称为一个“位”,整个表格共有94区,每区有94位,并将“区”和“位”用十进制数字进行编号:即区号为01-94,位号为01-94。第01-09区:分别存放了682个标点符号运算符号制表符号数字序号英文字母俄文字母日文假名希腊字母汉语拼音字母汉语注音字母等第10-15区有待扩展的空白区第16-55区: (最常用的汉字)按照汉语拼
12、音的顺序依次存放了3755个一级汉字第56-87区: (次常用的汉字)按照部首顺序依次存放了3008个二级汉字第88区以后有待扩展的空白区例如:保:区位码:十进制:1703D 十六进制:1103H为了去除ASCII表里的前30D(20H)个控制符,在区位码的基础上加上2020H形成国标码。国标码是3123H。但ASCII码表里:西文字符“1”和“#”的ASCII也为31H和23H 所以就产生了二义性。计算机在RAM读取时,无法判断。决定把最高位置1,这样保的机内码就形成了:B1A3H最终的公式:区位码H + 2020H =国标码 + 8080 H=机内码或:区位码+A0A0H=机内码得出以下两
13、个结论:结论1:汉字机内码的每个字节都大于128(FFH),这就解决了与西文字符的ASCII码冲突的问题 结论2:汉字机内码一个汉字占两个字节ANSI为使计算机支持更多语言,通常使用 0x800xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 中 在 ANSI编码中文操作系统中,使用 0xD6,0xD0 这两个字节存储。 不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编
14、码代表 JIS 编码。 不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。当然对于ANSI编码而言,0x000x7F之间的字符,依旧是1个字节代表1个字符。这一点是ASNI编码与Unicode编码之间最大也最明显的区别。举例:在桌面上新建一文本文档。内容为:联通,如果按照ANSI方式存盘将会出现什么问题?Unicode编码(具体内容学生可下去自已了解)Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有11
15、14112个码位。码位就是可以分配给字符的数字。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。 通用字符集(Universal Character Set,UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集。UCS-2用两个字节编码,UCS-4用4个字节编码。 历史上存在两个独立的尝试创立单一字符集的组织,即国际标准化组织(ISO)和多语言软件制造商组成的统一码联盟。前者开发的 ISO/IEC 10646 项目,后者开发的统一码项目。因此最初制定了不同的标准。 1991年前后,两个项目的参与者都认识到,世界不需要两个不
16、兼容的字符集。于是,它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。从Unicode 2.0开始,Unicode采用了与ISO 10646-1相同的字库和字码;ISO也承诺,ISO 10646将不会替超出U+10FFFF的UCS-4编码赋值,以使得两者保持一致。两个项目仍都存在,并独立地公布各自的标准。但统一码联盟和ISO/IEC JTC1/SC2都同意保持两者标准的码表兼容,并紧密地共同调整任何未来的扩展。在发布的时候,Unicode一般都会采用有关字码最常见的字型,但ISO 10646一般都尽可能采用Century字型。 UCS-4根据最高位为0的最高字节分成27=128个g
17、roup。每个group再根据次高字节分为256个平面(plane)。每个平面根据第3个字节分为256行 (row),每行有256个码位(cell)。group 0的平面0被称作BMP(Basic Multilingual Plane)。将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。每个平面有216=65536个码位。Unicode计划使用了17个平面,一共有17*65536=1114112个码位。在Unicode 5.0.0版本中,已定义的码位只有238605个,分布在平面0、平面1、平面2、平面14、平面15、平面16。其中平面15和平面16上只是定义了两个各占65534个码
18、位的专用区(Private Use Area),分别是0xF0000-0xFFFFD和0x100000-0x10FFFD。所谓专用区,就是保留给大家放自定义字符的区域,可以简写为PUA。 平面0也有一个专用区:0xE000-0xF8FF,有6400个码位。平面0的0xD800-0xDFFF,共2048个码位,是一个被称作代理区(Surrogate)的特殊区域。代理区的目的用两个UTF-16字符表示BMP以外的字符。在介绍UTF-16编码时会介绍。 如前所述在Unicode 5.0.0版本中,238605-65534*2-6400-2408=99089。余下的99089个已定义码位分布在平面0、
19、平面1、平面2和平面14上,它们对应着Unicode目前定义的99089个字符,其中包括71226个汉字。平面0、平面1、平面2和平面14上分别定义了52080、3419、43253和337个字符。平面2的43253个字符都是汉字。平面0上定义了27973个汉字。(2)汉字显示64*64点阵LCD上多采用16*16点阵0x40,0x40,0x20,0x20,0x27,0xFE,0x84,0x04,0x40,0x38,0x01,0xC0,0x11,0x00,0x11,0xFC,0x21,0x10,0x21,0x10,0xC7,0xFE,0x40,0x00,0x40,0x10,0x41,0x08,
20、0x42,0x04,0x4C,0x04,64*128点阵的LCD可以显示的字符个数的计算64*128点阵=8192个点64*128点阵=8192个点/16*16点阵=3216个字符*2行=32显示汉字要取汉字的字模。可以自己手工操作,也可以网上下载共享软件。要了解汉字取模的方式。并要掌握字节表示的含义。任务2: 程序设计与仿真一、教学目标:1、制作一个用LCD显示字符的单片机系统。2、制作一个用LCD显示汉字的单片机系统。3、掌握单片机的LCD显示接口电路工作原理及其应用。4、初步掌握单片机应用系统分析和软硬件设计的基本方法,建立单片机系统设计的基本概念。二、1602字符型简介1、1602字符
21、型技术参数:显示容量:16*2个字符芯片工作电压:4.55.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.95*4.35mm指令:11种2、引脚功能:1602字符型LCD采用标准的14脚或16脚接口,各引脚接口说明如下表:编号符号引脚说明编号符号引脚说明1Vss电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极第1脚:Vss 为地电源。第2脚:VDD 接5V正电源。第3脚:VL 为液晶显示器对比度
22、调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影“,使用时可通过一个10K殴的电位器调整对比度。第4脚:RS为数据/命令选择线,高电平时选择数据寄存器,低电平时选择指令寄存器。第5脚:R/W为读写选择线,高电平时进行读操作,低电平时进行写操作,当RS和R/W共同为低电平时可以写入指令或显示地址,当RS为低电平时而R/W为高电平时可以读忙信号,当RS为高电平而R/W为低电平时可以写入数据。第6 脚:Eumd为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7 14脚:D0-D7为8位数据线第15 脚:背光源正极第16脚:背光源负极3、指令说明: 清屏指令:使DD
23、RAM的内容全部被清除,屏幕光标回原位,地址计数器AC=0。运行时间(250KHz):1.64ms。 归位指令:使光标和光标所在位的字符回原点(屏幕的左上角)。但DDRAM单元内容不变。地址计数器AC=0。运行时间(250KHz):1.64ms。 输入方式设置。 该指令设置光标、画面的移动方式。 I/D=l:数据读写操作后,AC自动增1; I/D=0:数据读写操作后,AC自动减l; S=1:当数据写入DDRAM,显示将全部左移(I/D=1)或全部右移 (I/D=0),此时光标看上去未动,仅仅是显示内容移动,但从DDRAM中读取数据时,显示不移动; S0:显示不移动,光标左移(I/D=1)或右移
24、(I/D=0)。 显示开关控制。 该指令设置显示、光标及闪烁开、关。 D:显示控制,D=1,开显示(Display ON),D=0,关显示(Display OFF); C:光标控制,C=1,开光标显示,C=0,关光标显示; B:闪烁控制,B=1,光标所指的字符同光标一起以0.4s交变闪烁,B=0,不闪烁。运行时间(250KHz):40s 。 光标或画面移位。该指令使光标或画面在没有对DDRAM进行读写操作时被左移或右移,不影响DD RAM。S/C=0、R/L1,光标左移一个字符位,AC自动减1;S/C=0、R/L=1,光标右移一个字符位,AC自动加1;S/C=1、R/L=0,光标和画面一起左移
25、一个字符位;S/C=I、R/L1,光标和画面一起右移一个字符位。运行时间(250KHz):40s。 功能设置。该指令为工作方式设置命令(初始化命令)。对HD44780初始化时,需要设置数据接口位数DL(4位或8位)、显示行数N、点阵模式F(57或510)。DL:设置数据接口位数,DL=1,8位数据总线DB7DB0;DL=0,4位数据总线DB7DB4,而DB3DB0不用,在此方式下数据操作需两次完成; N:设置显示行数,N=1,2行显示;N=0,1行显示。 F:设置点阵模式,F=0,57点阵,F=1,510点阵。 运行时间(250KHz):40s。 CGRAM地址设置。该指令设置CGRAM地址指
26、针。A5A0=00 000011 1111。地址码A5A0被送入AC中,在此后,就可以将用户自定义的显示字符数据写入CGRAM或从CGRAM中读出。 运行时间(250KHz):40s。 DDRAM地址设置。 该指令设置DDRAM地址指针。若是一行显示,地址码A6A0004FH有效;若是二行显示,首行址码A6A00027H有效,次行址码A6A04067H有效。在此后,就可以将显示字符码写入DDRAM或从DDRAM中读出。运行时间(250KHz):40s 。读忙标志BF和AC值,该指令读取BF及AC。BF为内部操作忙标志,BF=1,忙,BF=0,不忙。AC6AC0为地址计数器AC的值。当BF=0时
27、,送到DB6DB0的数据(AC6AC0)有效。 写数据到DDRAM或CGRAM,该指令根据最近设置的地址性质,将数据写入DDRAM或CGRAM中。实际上,数据被直接写入DR,再由内部操作写入地址指针所指的DDRAM或CGRAM。运行时间(250KHz):4s 。11读DDRAM或CGRAM数据,该指令根据最近设置的地址性质,从DDRAM或CGRAM读数据到总线DB7DB0上。运行时间(250KHz):40s。读操作时序:写操作时序:应用举例:例1:在LCD1602字符型液晶第一行显示网站名:;在第二行显示联系电话:053282228222。电路图如下图:程序流程图:软件代码:#include
28、#include sbit rs=P20;sbit rw=P21;sbit ep=P22;unsigned char code dis1=;unsigned char code dis2=0532-82228222;void delay(unsigned char ms)unsigned char i;while (ms-)for(i=0;i250;i+)_nop_();_nop_();_nop_();_nop_();bit lcd_bz()bit result;rs=0;rw=1;ep=1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P0&0x8
29、0);ep=0;return result;void lcd_wcmd(unsigned char cmd)while(lcd_bz();rs=0;rw=0;ep=0;_nop_();_nop_();P0=cmd;_nop_();_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;void lcd_pos(unsigned char pos)lcd_wcmd(pos|0x80);void lcd_wdat(unsigned char dat)while(lcd_bz();rs=1;rw=0;ep=0;P0=dat;
30、_nop_();_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;void lcd_init()lcd_wcmd(0x38);delay(1);lcd_wcmd(0x0c);delay(1);lcd_wcmd(0x06);delay(1);lcd_wcmd(0x01);delay(1);void main(void)unsigned char i;lcd_init();delay(10);lcd_pos(0x01);i=0;while(dis1i!=0)lcd_wdat(dis1i);i+;lcd_pos(0x4
31、2);i=0;while (dis2i!=0)lcd_wdat(dis2i);i+;while(1);仿真实现:例2:显示汉字:电路图如下图:程序代码:#include #include #define uchar unsigned char#define uint unsigned int#define LCD_databus P0 /LCD8 位数据口uchar num;sbit RS=P22; /RS为0命令,1数据sbit RW=P21; /RW为1 写,0-读sbit EN=P20; / 使能端sbit CS1=P24; / 片选1低电平有效,控制左半屏sbit CS2=P23; /
32、片选1低电平有效,控制右半屏char code huan=0x00,0xA0,0x20,0x10,0xF0,0x00,0x40,0x38,0xA7,0x10,0x50,0x30,0x10,0x00,0x00,0x00,0x10,0x08,0x05,0x02,0x05,0x20,0x10,0x0C,0x03,0x04,0x08,0x10,0x30,0x20,0x20,0x00,;char code ying=0x40,0x40,0x44,0xC8,0x00,0xF8,0x08,0x84,0x06,0xF0,0x08,0x88,0xF8,0x00,0x00,0x00,0x08,0x08,0x09,
33、0x0E,0x08,0x09,0x09,0x08,0x10,0x17,0x10,0x30,0x30,0x10,0x10,0x00,;char code fang =0x40,0x40,0x20,0xE2,0x04,0x00,0x20,0x20,0x22,0xE2,0x94,0x90,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x0F,0x14,0x0A,0x04,0x02,0x11,0x20,0x18,0x07,0x00,0x00,0x00,0x00,;char code wen=0x40,0x40,0x20,0xE2,0x04,0x00,0x20,0x20,0x2
34、2,0xE2,0x94,0x90,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x0F,0x14,0x0A,0x04,0x02,0x11,0x20,0x18,0x07,0x00,0x00,0x00,0x00,;char code shan=0x40,0x40,0x20,0xE2,0x04,0x00,0x20,0x20,0x22,0xE2,0x94,0x90,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x0F,0x14,0x0A,0x04,0x02,0x11,0x20,0x18,0x07,0x00,0x00,0x00,0x00,;char c
35、ode dong=0x40,0x40,0x20,0xE2,0x04,0x00,0x20,0x20,0x22,0xE2,0x94,0x90,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x0F,0x14,0x0A,0x04,0x02,0x11,0x20,0x18,0x07,0x00,0x00,0x00,0x00,;char code qing=0x40,0x40,0x20,0xE2,0x04,0x00,0x20,0x20,0x22,0xE2,0x94,0x90,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x0F,0x14,0x0A,0x04,
36、0x02,0x11,0x20,0x18,0x07,0x00,0x00,0x00,0x00,;char code dao=0x40,0x40,0x20,0xE2,0x04,0x00,0x20,0x20,0x22,0xE2,0x94,0x90,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x0F,0x14,0x0A,0x04,0x02,0x11,0x20,0x18,0x07,0x00,0x00,0x00,0x00,;char code bin=0x40,0x40,0x20,0xE2,0x04,0x00,0x20,0x20,0x22,0xE2,0x94,0x90,0x10,
37、0x10,0x10,0x00,0x00,0x00,0x00,0x0F,0x14,0x0A,0x04,0x02,0x11,0x20,0x18,0x07,0x00,0x00,0x00,0x00,;char code hai=0x40,0x40,0x20,0xE2,0x04,0x00,0x20,0x20,0x22,0xE2,0x94,0x90,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x0F,0x14,0x0A,0x04,0x02,0x11,0x20,0x18,0x07,0x00,0x00,0x00,0x00,;char code xue=0x00,0xC0,0x70,
38、0x22,0x24,0xA0,0x52,0x54,0xD0,0x58,0x17,0x10,0x30,0x10,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x24,0x43,0x3E,0x02,0x02,0x02,0x02,0x00,0x00,0x00,;char code yuan=0x00,0xFC,0x44,0xB4,0xCC,0x20,0x18,0x50,0x4A,0xAC,0xA8,0x88,0x18,0x00,0x00,0x00,0x00,0x3F,0x00,0x20,0x10,0x08,0x05,0x03,0x01,0x1F,0x20,0x20
39、,0x20,0x1C,0x00,0x00,;void delay(uint i)while(-i);void Read_busy() /读“忙”函数-数据最高位DB71则忙P0=0x00;RS=0;RW=1;EN=1;while(P0 & 0x80);EN=0;void write_LCD_command(uchar value)Read_busy(); /每次读写都要忙判断RS=0;/ 选择命令RW=0;/读操作LCD_databus=value;EN=1; / EN由10锁存有效数据_nop_();_nop_();EN=0;void write_LCD_data(uchar value)
40、/ 写数据函数Read_busy();RS=1;/选择数据RW=0;LCD_databus=value;EN=1; / EN由10锁存有效数据_nop_();_nop_();EN=0;void Set_page(uchar page) /设置页,LCD12864共8页,一页是8行点阵点page=0xb8|page;/页的首地址为0XB8write_LCD_command(page);void Set_line(uchar startline) /设置显示的起始行startline=0xC0|startline; /起始行的地址为0XC0write_LCD_command(startline);
41、 / 设置从哪行开始,共063,一般从0行开始显示void Set_column(uchar column) / 设置显示的列column=column&0x3f; /列的最大值是64column=0x40|column; /列的首地址为0X40write_LCD_command(column);void SetOnOff(uchar onoff)/显示开关函数,0X3E是关显示,0X3F是开显示onoff=0x3e|onoff;write_LCD_command(onoff);void SelectScreen(uchar screen) / 选屏switch(screen)case 0:
42、CS1=0;CS2=0;break; / 全屏case 1: CS1=0;CS2=1;break; / 左半屏case 2: CS1=1;CS2=0;break; / 右半屏default:break;void ClearScreen(uchar screen)/清屏uchar i,j;SelectScreen(screen);for(i=0;i8;i+)Set_page(i);Set_column(0);for(j=0;j64;j+)write_LCD_data(0x00);void InitLCD()Read_busy();SelectScreen(0);SetOnOff(0);Selec
43、tScreen(0);SetOnOff(1);SelectScreen(0);ClearScreen(0);Set_line(0);void Display(uchar ss,uchar page,uchar column,uchar *p)uchar i;SelectScreen(ss);Set_page(page);Set_column(column);for(i=0;i16;i+)write_LCD_data(pi);Set_page(page+1);Set_column(column);for(i=0;i16;i+)write_LCD_data(pi+16);void main()InitLCD();ClearScreen(0);Set_line(0);Display(1,0,2*16,huan);Display(1,0,3*16,ying);Display(2,0,0*16,fang);Display(2,0,1*16,wen);Display(1,2,0*16,shan);Display(1,2,1*16,dong);Display(1,2,2*16,qing);Display(1,2,3*16,dao);Display(2,2,0*16,bin);Display(2,2,1*16,hai);Display(2,2,2*16,xue);Dis