《第11章单片机与液晶显示器的接口电路.ppt》由会员分享,可在线阅读,更多相关《第11章单片机与液晶显示器的接口电路.ppt(129页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第11章章 单片机与液晶显示器的接口电路单片机与液晶显示器的接口电路11.1 液晶显示器LCD1602在日常生活中,我们对液晶显示器并不陌生。液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。在单片机系统中应用晶液显示器作为输出器件有以下几个优点:1.显示质量高由于液晶显示器每一个点在收到信号后就一直保持那
2、种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。2.数字式接口2021/9/211液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。4.功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。11.1.1 液晶显示简介液晶显示简介1.液晶显示原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经
3、被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。2.液晶显示器的分类液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。除了黑白显示外,液晶显示器还有多灰度有彩色显示等。如果根据驱动方式来分,可2021/9/212以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。3.液晶显示器各种图形的显示原理1)线段的显示点阵图形式液晶由MN个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共168=128个点组成,屏上6416个显示单元与显示R
4、AM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的000H00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。2)字符的显示用LCD显示一个字符时比较复杂,因为一个字符由68或88点阵组成,既要找到和2021/9/213显示屏幕上某几个位置对应的显
5、示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。3)汉字的显示汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5右边为2、4、6根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,
6、光标位置加1,送第二个字节,换行按列对齐,送第三个字节直到32B显示完就可以LCD上得到一个完整汉字。2021/9/21411.1.2 字符型液晶字符型液晶LCD1602简介简介字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。下面以XX电子有限公司的1602字符型液晶显示器为例,介绍其用法。一般1602字符型液晶显示器实物如下图11-1所示。图图11-1 LCD1602字符型液晶显示器实物图字符型液晶显示器实物图2021/9/2151.LCD1602的基本参数及引脚功能LCD1602分为带背光和不带背光两种,其控制器
7、大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图11-2所示。2021/9/216LCD1602主要技术参数:显示容量:162个字符芯片工作电压:4.55.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.954.35(WH)mm2.引脚功能说明LCD1602采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表11-1所示。2021/9/217第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可
8、以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。2021/9/218第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,来判断是否可以刷新液晶,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。3.LCD1602的指令说明及时序LCD1602液晶模块内部的控制器共有11条控制指
9、令,如表11-2所示。2021/9/219 2021/9/2110LCD1602里面是有CGARM和CGROM的。LCD1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)。指令1:清显示,指令码01H,光标复位到地址00H位置。指令2:光标复位,光标返回到地址00H。指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。指令4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标
10、 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。指令6:功能设置命令 DL:高电平时为8位总线,低电平时为4位总线 N:低电平时为单行显示,高电平时双行显示 F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。2021/9/2111指令7:字符发生器RAM地址设置。指令8:DDRAM地址设置。指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10:写数据。指令11:读数据。4.与HD44780相兼容的芯片时序表如下所表11-3示。表表11-
11、3 LCD1602基本操作时序表基本操作时序表2021/9/2112图图11-3 读操作时序读操作时序2021/9/2113图图11-4 写操作时序写操作时序2021/9/21145.LCD1602的RAM地址映射及标准字库表液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,图11-5是1602的内部显示地址。2021/9/2115例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D
12、7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图11-6所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字
13、母“A”。2021/9/2116 2021/9/2117图图11-6 字符代码与图形对应图字符代码与图形对应图6.LCD1602的一般初始化(复位)过程延时15mS写指令38H(不检测忙信号)延时5mS写指令38H(不检测忙信号)延时5mS写指令38H(不检测忙信号)以后每次写指令、读/写数据操作均需要检测忙信号写指令38H:显示模式设置写指令08H:显示关闭写指令01H:显示清屏写指令06H:显示光标移动设置写指令0CH:显示开及光标设置2021/9/211811.1.3 LCD1602的软硬件设计实例的软硬件设计实例1.硬件原理图1602液晶显示模块可以和单片机AT89C51直接接口,电路
14、如图11-7所示。2021/9/2119图图11-7 硬件原理图硬件原理图2021/9/2120例例11-1 如图11-8所示,在LCD1602的第一行显示happy every day!,第二行显示gugu1979candy448。2021/9/2121图图11-8 单片机和单片机和LCD1602的连线图的连线图程序如下:#include#include sbit LCD_RS=P10;/RS寄存器选择;高电平选数据;低电平选指令;sbit LCD_RW=P11;/读写信号线;高电平读操作;低电平写操作;sbit LCD_E=P12;/E使能端#define LCD_Data P2 /液晶数
15、据D7-D0#define Busy 0 x80 /用于检测LCD状态字中的Busy标识void WriteDataLCD(unsigned char WDLCD);/写数据void WriteCommandLCD(unsigned char WCLCD,BuysC);/写指令unsigned char ReadDataLCD(void);/读数据unsigned char ReadStatusLCD(void);/读状态void LCDInit(void);/LCD初始化2021/9/2122void DisplayOneChar(unsigned char X,unsigned char
16、Y,unsigned char DData);/显示一个字符void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code*DData);/显示一串字符void Delay5Ms(void);void Delay400Ms(void);unsigned char code uctech=happy every day!;unsigned char code net=gugu1979candy448;void main(void)Delay400Ms();/启动等待,等LCD进入工作状态 LCDInit();/LCD
17、初始化2021/9/2123Delay5Ms();/延时片刻(可不要)DisplayListChar(0,0,uctech);/显示第0行 DisplayListChar(0,1,net);/显示第1行 ReadDataLCD();/测试用句无意义 while(1);/写数据void WriteDataLCD(unsigned char WDLCD)ReadStatusLCD();/检测忙 LCD_Data=WDLCD;LCD_RS=1;LCD_RW=0;LCD_E=0;/若晶振速度太高可以在这后加小的延时 LCD_E=0;/延时 Delay5Ms();/不加延时通不过PROTEUS仿真202
18、1/9/2124LCD_E=1;/写指令void WriteCommandLCD(unsigned char WCLCD,BuysC)/BuysC为0时忽略忙检测 if(BuysC)ReadStatusLCD();/根据需要检测忙 LCD_Data=WCLCD;LCD_RS=0;LCD_RW=0;LCD_E=0;LCD_E=0;Delay5Ms();LCD_E=1;2021/9/2125/读数据unsigned char ReadDataLCD(void)LCD_RS=1;LCD_RW=1;LCD_E=0;LCD_E=0;Delay5Ms();LCD_E=1;return(LCD_Data);
19、/读状态unsigned char ReadStatusLCD(void)LCD_Data=0 xFF;2021/9/2126LCD_RS=0;LCD_RW=1;LCD_E=0;LCD_E=0;Delay5Ms();LCD_E=1;while(LCD_Data&Busy);/检测忙信号 return(LCD_Data);void LCDInit(void)/LCD初始化 LCD_Data=0;WriteCommandLCD(0 x38,0);/三次显示模式设置,不检测忙信号 Delay5Ms();WriteCommandLCD(0 x38,0);2021/9/2127Delay5Ms();Wr
20、iteCommandLCD(0 x38,0);Delay5Ms();WriteCommandLCD(0 x38,1);/显示模式设置,开始要求每次检测忙信号 WriteCommandLCD(0 x08,1);/关闭显示 WriteCommandLCD(0 x01,1);/显示清屏 WriteCommandLCD(0 x06,1);/显示光标移动设置 WriteCommandLCD(0 x0C,1);/显示开及光标设置/按指定位置显示一个字符void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData)Y&=0 x
21、01;2021/9/2128X&=0 x0F;/限制X不能大于15,Y不能大于1 if(Y)X|=0 x40;/当要显示第二行时地址码+0 x40;X|=0 x80;/算出指令码 WriteCommandLCD(X,0);/这里不检测忙信号,发送地址码 WriteDataLCD(DData);/按指定位置显示一串字符/指向数组的指针:int a10;int*p;p=&a0,p指向a0,是因为将a0的地址赋给了pvoid DisplayListChar(unsigned char X,unsigned char Y,unsigned char code*DData)unsigned char L
22、istLength;ListLength=0;Y=Y&0 x01;/行标志符号,第0行,或者第1行;X=X&0 x0F;/限制X不能大于15,0-15显示16个字符 2021/9/2129while(ListLength=0 x0F)/若到达字串尾则退出 if(X=0 x0F)/X坐标应小于0 xF DisplayOneChar(X,Y,DDataListLength);/显示单个字符 ListLength+;X+;/5ms延时void Delay5Ms(void)unsigned int TempCyc=5552;while(TempCyc-);2021/9/2130/400ms延时void
23、 Delay400Ms(void)unsigned char TempCycA=5;unsigned int TempCycB;while(TempCycA-)TempCycB=7269;while(TempCycB-);2021/9/2131例例11-2 如图11-9所示,在LCD1602的显示I Will Always Love You!。图图11-9 单片机和单片机和LCD1602的连线图的连线图2021/9/2132程序如下:#include#include sbit LCD_RS=P1 0;sbit LCD_RW=P1 1;sbit LCD_E =P1 2;#define LCD_D
24、ATA P2 /LCD DATA/函数声明void lcd_init(void);void display_string(unsigned char x,unsigned char y,unsigned char*s);/功能描述:短暂延时,使用12MHZ晶体,约0.01MSvoid dellay(unsigned int h)while(h-);/0.01MS2021/9/2133/功能描述:写数据到LCDvoid WriteDataLcd(unsigned char wdata)LCD_DATA=wdata;LCD_RS=1;LCD_RW=0;LCD_E=0;dellay(200);/短暂
25、延时,代替检测忙状态 LCD_E=1;/功能描述:写命令到LCDvoid WriteCommandLcd(unsigned char wdata)2021/9/2134LCD_DATA=wdata;LCD_RS=0;LCD_RW=0;LCD_E=0;dellay(200);/短暂延时,代替检测忙状态 LCD_E=1;/LCD初始化void lcd_init(void)LCD_DATA=0;WriteCommandLcd(0 x38);dellay(1000);WriteCommandLcd(0 x38);/显示模式设置 WriteCommandLcd(0 x08);/关闭显示 WriteCom
26、mandLcd(0 x01);/显示清屏 2021/9/2135WriteCommandLcd(0 x06);/显示光标移动设置 WriteCommandLcd(0 x0c);/显示开及光标移动设置/功能描述:设置光标位置,x是列号,y是行号void display_xy(unsigned char x,unsigned char y)if(y=1)x=x+0 x40;x=x+0 x80;WriteCommandLcd(x);/功能描述:在具体位置显示单个字符,x是列号,y是行号 void display_char(unsigned char x,unsigned char y,unsigne
27、d char dat)display_xy(x,y);2021/9/2136 WriteDataLcd(dat);/功能描述:在具体位置显示字符串,字符串是以/0代表结束的,x是列号,y是行号void display_string(unsigned char x,unsigned char y,unsigned char*s)char n=0;if(y1)y=1;display_xy(x,y);while(*(s+n)/若到达字符串尾则推出 if(x=16)/第一行超出则在第二行继续写 display_xy(x-16,1);if(x=32)/写满两行则退出2021/9/2137return;W
28、riteDataLcd(*(s+n);n+;x+;void main()lcd_init();/液初始化 display_string(0,0,I Will Always Love You!);/显示 while(1);/停止2021/9/213811.2 液晶液晶LCD12232 HS12232-9内置ST7920A驱动控制器,点阵为 12232点,每行7个半汉字,共2行。内部字型ROM 包括8192个1616点阵的中文字型和126个168点阵的字母符号字型,另外还提供一个64256点的绘图区域(GDRAM)及240点的 ICON RAM,可以和文字画面混合显示。内含的CGRAM有4组可编程
29、的16X16点阵的造字功能。与单片机的接口有8位并行、4位并行、2/3线串行。它采用低功率电源消耗,电压范围2.75.5V,功能齐全,汉字、点阵图形、ASCII码、曲线同屏显示;上下左右移动当前显示屏幕、清屏、光标显示、闪烁、睡眠、唤醒、关闭显示功能齐备,适合许多场合应用。它内置8192个16*16点汉字库和128个16*8点ASCII字符集图形点阵液晶显示器,它主要由行驱动器/列驱动器及12832全点阵液晶显示器组成。可完成图形显示,也可以显示7.52个(1616点阵)汉字.与外部CPU接口采用并行或串行方式控制。本文介绍点阵式液晶显示器HS12232-9和它与单片机的接口及编程的方法,同时
30、给出显示器常用的字符显示和汉字显示程序。2021/9/213911.2.1 液晶驱动液晶驱动IC基本特性基本特性 1.具有低功耗、供应电压范围宽等特点。2.具有串行和并行输出,并可外接驱动IC扩展驱动。3.具有2560位显示RAM(DD RAM),即8084位 4.具有与68系列或80系列相适配的MPU接口功能,并有专用的指令集,可完成文本显示或图形显示的功能设置5.视域尺寸:,60.518.0mm(12232-1/-2),54.818.3mm(12232-3)6.显示类型:黄底黑字7.LCD显示角度:6点钟直观8.驱动方式:1/32 duty(功率比),1/6 bias(偏压比)9.连接方式
31、:导电胶条,铁框2021/9/214010.补充说明:模块外观尺寸可根据用户的要求进行适度调整。11.2.2 工作参数电气特性工作参数电气特性(测试条件测试条件 Ta=25,Vdd=5.00.25V)1、逻辑工作电压(VDD-VSS):2.46.0V2、LCD驱动电压(Vdd-Vlcd):3.013.5V3、工作温度(Ta):055(常温)/-2070(宽温)4、保存温度(Tstg):-10701、输入高电平(Vih):3.5Vmin 2、输入低电平(Vil):0.55Vmax 3、输出高电平(Voh):3.75Vmin 4、输出低电平(Vol):1.0Vmax5、工作电流:2.0mAmax1
32、1.2.3 接口说明接口说明2021/9/2141 2021/9/214211.2.4 LCD12232管脚说明管脚说明1.VDD:逻辑电源正2.GND(VSS):逻辑电源地3.VLCD(VEE,V0):LCD驱动电源4.RET:复位端,对于68系列MPU:上升沿(L-H)复位,且复位后电平须保持为高电平(H);对于80系列MPU:下降沿(H-L)复位,且复位后电平须保持为低电平(L)。5.CS1:读写使能。对于68系列MPU,连接使能信号引脚,高电平有效;对于80系列MPU,连接/RD引脚,低电平有效。6.CS2:使能端。7./RD:读允许,低电平有效。2021/9/2143 8./WR:写
33、允许,低电平有效。9.R/W:读写选择,对于68系列MPU,高电平时读数据,低电平时写数据;对于80系列MPU,低电平时允许数据传输,上升沿时锁定数据。10.A0:数据/指令选择。高电平:数据D0-D7将送入显示RAM;低电平:数据D0-D7将送入指令执行器执行。11.D0-D7:数据输入输出引脚。11.2.5 指令描述指令描述 1.显示模式设置2021/9/2144R/WA0/RD/WRD7D6D6D4D3D2D1D00101010111D功能:开/关屏幕显示,不改变显示RAM(DD RAM)中的内容,也不影响内部状态。D=0,开显示;D=1,关显示。如果在显示关闭的状态下选择静态驱动模式,
34、那么内部电路将处于安全模式。2.设置显示起始行 R/WA0/RD/WRD7D6D6D4D3D2D1D0010110A4A3A2A1A0功能:执行该命令后,所设置的行将显示在屏幕的第一行。起始地址可以是0-31范围内任意一行。行地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一。3.页地址设置 R/WA0/RD/WRD7D6D6D4D3D2D1D0010HLHHHLA1A0功能:设置页地址。2021/9/2145 2021/9/2146 2021/9/2147当“读-修改-写模式”关闭时,每执行一次读指令,列地址自动加1,所以可以连续从DD RAM读出数据而不用设置列地址。注
35、意:再设置完列地址后,首次读显示数据前必须执行一次空的“读显示数据”。这是因为设置完列地址后,第一次读数据时,出现在数据总线上的数据是列地址而不是所要读出的数据。8.设置显示方向设置显示方向2021/9/2148 2021/9/2149功能:使模块内部初始化。初始化内容:设置显示初始行为第一行;页地址设置为第三页。复位指令对显示RAM没有影响。14 设置安全模式通过关闭显示并打开静态显示的方法,可以设置安全模式,以减小功耗。2021/9/2150安全模式下的内部状态:停止LCD驱动。Segment和Common输出VDD电平。停止晶体震荡并禁止外部时钟输入,晶振输入OSC2引脚处于不确定状态。
36、显示数据和内部模式不变。可通过打开显示或关闭静态显示的方法关闭安全模式。11.2.6 LCD12232指令码功能表指令码功能表LCD12232指令码功能表如表11-4所示。表表11-4 LCD12232指令码功能表指令码功能表2021/9/2151 2021/9/215211.2.7 LCD12232应用举例应用举例例11.3 用C51编程,实现在12232液晶的第一行显示“Big Big World!”第二行显示“世界无限大!”。#include#define uint unsigned int#define uchar unsigned charsbit CS=P12;sbit SID=P
37、11;sbit SCLK=P10;uchar code disps=Big Big World!;uchar code dispx=世界无限大!;2021/9/2153void delay(uint xms)uint i,j;for(j=0;jxms;j+)for(i=0;i110;i+);void send_command(uchar command_data)/命令发送uchar i;uchar i_data;i_data=0 xf8;/写指令CS=1;SCLK=0;for(i=0;i8;i+)/第1字节SID=(bit)(i_data&0 x80);SCLK=0;2021/9/2154S
38、CLK=1;i_data=i_data1;i_data=command_data;i_data&=0 xf0;for(i=0;i8;i+)/第2字节SID=(bit)(i_data&0 x80);SCLK=0;SCLK=1;i_data=i_data1;i_data=command_data;i_data=4;for(i=0;i8;i+)/第3字节2021/9/2155SID=(bit)(i_data&0 x80);SCLK=0;SCLK=1;i_data=i_data1;CS=0;delay(10);void send_data(uchar command_data)/数据发送uchar i
39、;uchar i_data;i_data=0 xfa;/写数据2021/9/2156CS=1;for(i=0;i8;i+)/第1字节SID=(bit)(i_data&0 x80);SCLK=0;SCLK=1;i_data=i_data1;i_data=command_data;i_data&=0 xf0;for(i=0;i8;i+)/第2字节SID=(bit)(i_data&0 x80);SCLK=0;SCLK=1;i_data=i_data1;2021/9/2157i_data=command_data;i_data=4;for(i=0;i8;i+)/第3字节SID=(bit)(i_data
40、&0 x80);SCLK=0;SCLK=1;i_data=i_data1;CS=0;delay(10);void init()delay(100);2021/9/2158send_command(0 x06);/游标及显示右移一位send_command(0 x0c);/整体显示开,游标关,反白关send_command(0 x01);/写入空格清屏幕send_command(0 x80);/设定首次显示位置void display_s()uchar a;send_command(0 x80);for(a=0;a11;a+)send_data(dispsa);2021/9/2159void d
41、isplay_x()uchar a;send_command(0 x92);for(a=0;a11;a+)send_data(dispxa);void main()init();display_s();display_x();while(1);2021/9/2160程序说明:1、发送命令和发送数据分别用send_command()和send_data()函数实现,由前面的描述可知,无论是发送一条命令还是发送一条数据都是由三个字节组成,若发送指令则第一个字节为0 xf8,若发送数据则第一个字为0 xfa,从上面两个函数可看出,它们的不同之处。2、“SID=(bit)(i_data&0 x80)”
42、中(bit)表示将后面括号里的数强制转换成位,当把一个字节强制转换成一位时,使用(bit),这里只取这个字节的最高位。整条语句的意思是,将i_data的最高位取出来赋给SID,从而发送给液晶。3、“i_data=command_data;”和“i_data&=0 xf0;”这两句的意思是,将所发送字节的高4位取出,低4位补0。“i_data=command_data;”和“i_data4;”这两句的意思是,将所发送的低4位移到高4位的位置上,原来的低4位自动补0。4、“lcd_init();”是对12232液晶的初始化设置,只有对液晶进行了正确的初始化设置,液晶才能正常运行。2021/9/21
43、61例例11.4 用C51编程,实现第一行从右侧移入“You are not alone!”,同时第二行从右侧移入“你并不孤独!”,移入速度自定,最后停留在屏幕上。#include#define uint unsigned int#define uchar unsigned charsbit CS=P12;sbit SID=P11;sbit SCLK=P10;uchar code disps=You are not alone!;uchar code dispx=你并不孤独!;void delay(uint xms)uint i,j;for(i=xms;i0;i-)for(j=110;j0;j
44、-);void send_command(uchar command_data)2021/9/2162uchar i;uchar i_data;i_data=0 xf8;CS=1;SCLK=0;for(i=0;i8;i+)SID=(bit)(i_data&0 x80);SCLK=0;SCLK=1;i_data=i_data1;i_data=command_data;i_data&=0 xf0;for(i=0;i8;i+)2021/9/2163SID=(bit)(i_data&0 x80);SCLK=0;SCLK=1;i_data=i_data1;i_data=for(i=0;i8;i+)SID
45、=(bit)(i_data&0 x80);SCLK=0;SCLK=1;i_data=i_data1;2021/9/2164CS=0;delay(1);void send_data(uchar command_data)uchar i;uchar i_data;i_data=0 xfa;CS=1;for(i=0;i8;i+)SID=(bit)(i_data&0 x80);SCLK=0;SCLK=1;i_data=i_data1;2021/9/2165i_data=command_data;i_data&=0 xf0;for(i=0;i8;i+)SID=(bit)(i_data&0 x80);SC
46、LK=0;SCLK=1;i_data=i_data1;i_data=command_data;i_data=4;for(i=0;i8;i+)SID=(bit)(i_data&0 x80);SCLK=0;SCLK=1;i_data=i_data1;2021/9/2166CS=0;delay(1);void lcd_init()delay(100);send_command(0 x30);/设置8位数据口,基本指令模式send_command(0 x02);/清DDRAMsend_command(0 x06);/游标及显示右移一位send_command(0 x0c);/整体显示开,游标关,反白关
47、send_command(0 x01);/写入空格清屏幕 send_command(0 x80);/设定首次显示位置2021/9/2167void display_s(uchar num)uchar a;send_command(0 x88-num);for(a=0;a15;a+)send_data(dispxa);void display_x(uchar num)uchar a;send_command(0 x98-num);for(a=0;a15;a+)2021/9/2168send_data(dispxa);void main()uchar aa;lcd_init();for(aa=0;
48、aa9;aa+)display_s(aa);display_x(aa);delay(300);while(1);2021/9/2169程序说明:1.由于12232液晶没有专门的移屏指令,因此我们使用for循环来实现移屏效果,实际上这种效果是重复向不同的地方写入显示字符而实现的。用这种方法看上去是从右往左移动,也可以从左向右移动。2.Delay(300)延时函数决定屏幕移动的速度,自行调节。11.3 液晶显示器LCD1286411.3.1 液晶LCD12864显示模块概述JM12864M-2汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X1
49、6点阵)及64X256点阵显示RAM(GDRAM)。主要技术参数和显示特性:1.电源:VDD 3.3V+5V(内置升压电路,无需负压);2.显示内容:128列 64行 3.显示颜色:黄绿2021/9/21704.显示角度:6:00钟直视 5.LCD类型:STN 6.与MCU接口:8位或4位并行/3位串行 7.配置LED背光 8.多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等 9.外观尺寸:937012.5mm 视域尺寸:7339mm 如图11-10和图11-11所示。2021/9/2171 11.3.2 LCD1286411.3.2 LCD12864模块引脚说明模块引脚说明 LCD
50、LCD128X64HZHZ引脚说明表如表引脚说明表如表11-5所示。所示。表表11-5 LCD128X64HZ引脚说明表引脚说明表2021/9/2172 2021/9/2173逻辑工作电压(VDD):4.55.5V电源地(GND):0V工作温度(Ta):-10 60(常温)/-2070(宽温)11.3.3 LCD12864接口时序 模块有并行和串行两种连接方法(时序如下)。1.并行连接时序图1)MPU写资料到模块如图11-12所示。2021/9/2174 2021/9/2175图11-14 串行连接时序图串行数据传送共分三个字节完成:第一字节:串口控制格式 11111ABC A为数据传送方向控