单片机与液晶显示器的接口电路_第1页
单片机与液晶显示器的接口电路_第2页
单片机与液晶显示器的接口电路_第3页
单片机与液晶显示器的接口电路_第4页
单片机与液晶显示器的接口电路_第5页
已阅读5页,还剩120页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机与液晶显示器的接口电路第一页,共一百二十五页,2022年,8月28日

3.体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。4.功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。11.1.1液晶显示简介1.液晶显示原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。2.液晶显示器的分类液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。除了黑白显示外,液晶显示器还有多灰度有彩色显示等。如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(SimpleMatrix)和主动矩阵驱动(ActiveMatrix)三种。第二页,共一百二十五页,2022年,8月28日3.液晶显示器各种图形的显示原理1)线段的显示点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。2)字符的显示用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和第三页,共一百二十五页,2022年,8月28日显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。但对于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。

3)汉字的显示汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5……右边为2、4、6……根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就可以LCD上得到一个完整汉字。第四页,共一百二十五页,2022年,8月28日11.1.2字符型液晶LCD1602简介字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。下面以XX电子有限公司的1602字符型液晶显示器为例,介绍其用法。一般1602字符型液晶显示器实物如下图11-1所示。图11-1LCD1602字符型液晶显示器实物图第五页,共一百二十五页,2022年,8月28日1.LCD1602的基本参数及引脚功能LCD1602分为带背光和不带背光两种,其控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图11-2所示。第六页,共一百二十五页,2022年,8月28日LCD1602主要技术参数:显示容量:16×2个字符芯片工作电压:4.5—5.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.95×4.35(W×H)mm2.引脚功能说明LCD1602采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表11-1所示。第七页,共一百二十五页,2022年,8月28日第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择。高电平时选择数据寄存器、低电平时选择指令寄存器。第八页,共一百二十五页,2022年,8月28日第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,来判断是否可以刷新液晶,当RS为高电平R/W为低电平时可以写入数据。

第4脚和第5脚的组合需要深刻理解第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。

3.LCD1602的指令说明及时序LCD1602液晶模块内部的控制器共有11条控制指令,如表11-2所示。第九页,共一百二十五页,2022年,8月28日

第十页,共一百二十五页,2022年,8月28日LCD1602里面是有CGARM和CGROM的。LCD1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)。

指令1:清显示。指令码01H,光标复位到地址00H位置。

指令2:光标复位。光标返回到地址00H。

指令3:光标和显示模式设置。I/D:光标移动方向,高电平右移,低电平左移。S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。

指令4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。

指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标。

指令6:功能设置命令DL:高电平时为8位总线,低电平时为4位总线N:低电平时为单行显示,高电平时双行显示F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。第十一页,共一百二十五页,2022年,8月28日指令7:字符发生器RAM地址设置。指令8:DDRAM地址设置。指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10:写数据。指令11:读数据。4.与HD44780相兼容的芯片时序表如下所表11-3示。表11-3LCD1602基本操作时序表第十二页,共一百二十五页,2022年,8月28日图11-3读操作时序第十三页,共一百二十五页,2022年,8月28日图11-4写操作时序第十四页,共一百二十五页,2022年,8月28日5.LCD1602的RAM地址映射及标准字库表液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,图11-5是1602的内部显示地址。第十五页,共一百二十五页,2022年,8月28日1)例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。2)在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。3)1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图11-6所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。第十六页,共一百二十五页,2022年,8月28日

第十七页,共一百二十五页,2022年,8月28日图11-6字符代码与图形对应图6.LCD1602的一般初始化(复位)过程延时5ms写指令38H(不检测忙信号)延时5ms写指令38H(不检测忙信号)延时5ms写指令38H(不检测忙信号)以后每次写指令、读/写数据操作均需要检测忙信号写指令38H:显示模式设置写指令08H:显示关闭写指令01H:显示清屏写指令06H:显示光标移动设置写指令0CH:显示开及光标设置第十八页,共一百二十五页,2022年,8月28日11.1.3LCD1602的软硬件设计实例

1.硬件原理图

1602液晶显示模块可以和单片机AT89C51直接接口,电路如图11-7所示。第十九页,共一百二十五页,2022年,8月28日图11-7硬件原理图第二十页,共一百二十五页,2022年,8月28日例11-1如图11-8所示,在LCD1602的第一行显示"happyeveryday!",第二行显示"gugu1979candy448"。第二十一页,共一百二十五页,2022年,8月28日图11-8单片机和LCD1602的连线图程序如下:#include<reg51.h>#include<intrins.h>sbitLCD_RS=P1^0;//RS寄存器选择;高电平选数据;低电平选指令;sbitLCD_RW=P1^1;//读写信号线;高电平读操作;低电平写操作;sbitLCD_E=P1^2;//E使能端#defineLCD_DataP2//液晶数据D7-D0#defineBusy0x80//用于检测LCD状态字中的Busy标识voidWriteDataLCD(unsignedcharWDLCD);//写数据voidWriteCommandLCD(unsignedcharWCLCD,BuysC);//写指令unsignedcharReadDataLCD(void);//读数据unsignedcharReadStatusLCD(void);//读状态voidLCDInit(void);//LCD初始化第二十二页,共一百二十五页,2022年,8月28日voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData);//显示一个字符voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData);//显示一串字符voidDelay5Ms(void);voidDelay400Ms(void);unsignedcharcodeuctech[]={"happyeveryday!"};unsignedcharcodenet[]={"gugu1979candy448"};voidmain(void){Delay400Ms();//启动等待,等LCD进入工作状态LCDInit();//LCD初始化第二十三页,共一百二十五页,2022年,8月28日Delay5Ms();//延时片刻(可不要)DisplayListChar(0,0,uctech);//显示第0行DisplayListChar(0,1,net);//显示第1行ReadDataLCD();//测试用句无意义while(1);}//写数据voidWriteDataLCD(unsignedcharWDLCD){ReadStatusLCD();//检测忙LCD_Data=WDLCD;LCD_RS=1;LCD_RW=0;LCD_E=0;//若晶振速度太高可以在这后加小的延时LCD_E=0;//延时Delay5Ms();//不加延时通不过PROTEUS仿真LCD_E=1;}第二十四页,共一百二十五页,2022年,8月28日//写指令voidWriteCommandLCD(unsignedcharWCLCD,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;}第二十五页,共一百二十五页,2022年,8月28日//读数据unsignedcharReadDataLCD(void){LCD_RS=1;LCD_RW=1;LCD_E=0;LCD_E=0;Delay5Ms();LCD_E=1;return(LCD_Data);}第二十六页,共一百二十五页,2022年,8月28日

//读状态unsignedcharReadStatusLCD(void){LCD_Data=0xFF;LCD_RS=0;LCD_RW=1;LCD_E=0;LCD_E=0;Delay5Ms();LCD_E=1;while(LCD_Data&Busy);//检测忙信号return(LCD_Data);}第二十七页,共一百二十五页,2022年,8月28日voidLCDInit(void)//LCD初始化{LCD_Data=0;WriteCommandLCD(0x38,0);//三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,1);//显示模式设置,开始要求每次检测忙信号WriteCommandLCD(0x08,1);//关闭显示WriteCommandLCD(0x01,1);//显示清屏WriteCommandLCD(0x06,1);//显示光标移动设置WriteCommandLCD(0x0C,1);//显示开及光标设置}第二十八页,共一百二十五页,2022年,8月28日//按指定位置显示一个字符voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData){Y&=0x01;X&=0x0F;//限制X不能大于15,Y不能大于1if(Y)X|=0x40;//当要显示第二行时地址码+0x40;X|=0x80;//算出指令码WriteCommandLCD(X,0);//这里不检测忙信号,发送地址码WriteDataLCD(DData);}第二十九页,共一百二十五页,2022年,8月28日//按指定位置显示一串字符//指向数组的指针:inta[10];int*p;p=&a[0],p指向a[0],是因为将a[0]的地址赋给了pvoidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData){unsignedcharListLength;ListLength=0;Y=Y&0x01;//行标志符号,第0行,或者第1行;X=X&0x0F;//限制X不能大于15,0-15显示16个字符while(ListLength<=0x0F)//若到达字串尾则退出{if(X<=0x0F)//X坐标应小于0xF{DisplayOneChar(X,Y,DData[ListLength]);//显示单个字符ListLength++;X++;}}}第三十页,共一百二十五页,2022年,8月28日//5ms延时voidDelay5Ms(void){unsignedintTempCyc=5552;while(TempCyc--);}//400ms延时voidDelay400Ms(void){unsignedcharTempCycA=5;unsignedintTempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);};}第三十一页,共一百二十五页,2022年,8月28日例11-2

如图11-9所示,在LCD1602的显示"IWillAlwaysLoveYou!"。图11-9单片机和LCD1602的连线图第三十二页,共一百二十五页,2022年,8月28日程序如下:#include<reg52.h>#include<intrins.h>sbitLCD_RS=P1^0;sbitLCD_RW=P1^1;sbitLCD_E=P1^2;#defineLCD_DATAP2//LCDDATA//函数声明voidlcd_init(void);voiddisplay_string(unsignedcharx,unsignedchary,unsignedchar*s);//功能描述:短暂延时,使用12MHZ晶体,约0.01MSvoiddellay(unsignedinth){while(h--);//0.01MS第三十三页,共一百二十五页,2022年,8月28日}//功能描述:写数据到LCDvoidWriteDataLcd(unsignedcharwdata){LCD_DATA=wdata;LCD_RS=1;LCD_RW=0;LCD_E=0;dellay(200);//短暂延时,代替检测忙状态

LCD_E=1;}//功能描述:写命令到LCDvoidWriteCommandLcd(unsignedcharwdata){第三十四页,共一百二十五页,2022年,8月28日LCD_DATA=wdata;LCD_RS=0;LCD_RW=0;LCD_E=0;dellay(200);//短暂延时,代替检测忙状态

LCD_E=1;}//LCD初始化voidlcd_init(void){LCD_DATA=0;WriteCommandLcd(0x38);dellay(1000);WriteCommandLcd(0x38);//显示模式设置

WriteCommandLcd(0x08);//关闭显示

WriteCommandLcd(0x01);//显示清屏第三十五页,共一百二十五页,2022年,8月28日WriteCommandLcd(0x06);//显示光标移动设置

WriteCommandLcd(0x0c);//显示开及光标移动设置}//功能描述:设置光标位置,x是列号,y是行号voiddisplay_xy(unsignedcharx,unsignedchary){if(y==1)x=x+0x40;x=x+0x80;WriteCommandLcd(x);}//功能描述:在具体位置显示单个字符,x是列号,y是行号

voiddisplay_char(unsignedcharx,unsignedchary,unsignedchardat){display_xy(x,y);第三十六页,共一百二十五页,2022年,8月28日

WriteDataLcd(dat);}//功能描述:在具体位置显示字符串,字符串是以/0代表结束的,x是列号,y是行号voiddisplay_string(unsignedcharx,unsignedchary,unsignedchar*s){charn=0;if(y>1)y=1;display_xy(x,y);while(*(s+n))//若到达字符串尾则推出

{ if(x>=16)//第一行超出则在第二行继续写

{ display_xy(x-16,1);}if(x>=32)//写满两行则退出第三十七页,共一百二十五页,2022年,8月28日return;WriteDataLcd(*(s+n));n++;x++;}}voidmain(){lcd_init();//液初始化

display_string(0,0,"IWillAlwaysLoveYou!");//显示

while(1);//停止}第三十八页,共一百二十五页,2022年,8月28日11.2液晶LCD122321)HS12232-9内置ST7920A驱动控制器,点阵为122×32点,每行7个半汉字,共2行。2)内部字型ROM包括8192个16×16点阵的中文字型和126个16×8点阵的字母符号字型,另外还提供一个64×256点的绘图区域(GDRAM)及240点的ICONRAM,可以和文字画面混合显示。内含的CGRAM有4组可编程的16X16点阵的造字功能。3)与单片机的接口有8位并行、4位并行、2/3线串行。它采用低功率电源消耗,电压范围2.7~5.5V,功能齐全,汉字、点阵图形、ASCII码、曲线同屏显示;上下左右移动当前显示屏幕、清屏、光标显示、闪烁、睡眠、唤醒、关闭显示功能齐备,适合许多场合应用。4)它内置8192个16*16点汉字库和128个16*8点ASCII字符集图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×32全点阵液晶显示器组成。可完成图形显示,也可以显示7.5×2个(16×16点阵)汉字.与外部CPU接口采用并行或串行方式控制。5)本文介绍点阵式液晶显示器HS12232-9和它与单片机的接口及编程的方法,同时给出显示器常用的字符显示和汉字显示程序。2讲第三十九页,共一百二十五页,2022年,8月28日11.2.1液晶驱动IC基本特性1.具有低功耗、供应电压范围宽等特点。2.具有串行和并行输出,并可外接驱动IC扩展驱动。3.具有2560位显示RAM(DDRAM),即80×8×4位4.具有与68系列或80系列相适配的MPU接口功能,并有专用的指令集,可完成文本显示或图形显示的功能设置5.视域尺寸:,60.5×18.0mm(12232-1/-2),54.8×18.3mm(12232-3)6.显示类型:黄底黑字7.LCD显示角度:6点钟直观8.驱动方式:1/32duty(功率比),1/6bias(偏压比)9.连接方式:导电胶条,铁框10.补充说明:模块外观尺寸可根据用户的要求进行适度调整。第四十页,共一百二十五页,2022年,8月28日

11.2.2工作参数电气特性(测试条件Ta=25,Vdd=5.0±0.25V)1、逻辑工作电压(VDD-VSS):2.4~6.0V2、LCD驱动电压(Vdd-Vlcd):3.0~13.5V3、工作温度(Ta):0~55℃(常温)/-20~70℃(宽温)4、保存温度(Tstg):-10~70℃5、输入高电平(Vih):3.5Vmin6、输入低电平(Vil):0.55Vmax7、输出高电平(Voh):3.75Vmin8、输出低电平(Vol):1.0Vmax9、工作电流:2.0mAmax11.2.3接口说明第四十一页,共一百二十五页,2022年,8月28日

第四十二页,共一百二十五页,2022年,8月28日11.2.4LCD12232管脚说明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:读允许,低电平有效。第四十三页,共一百二十五页,2022年,8月28日8./WR:写允许,低电平有效。9.R/W:读写选择。对于68系列MPU,高电平时读数据,低电平时写数据;对于80系列MPU,低电平时允许数据传输,上升沿时锁定数据。10.A0:数据/指令选择。高电平:数据D0-D7将送入显示RAM;低电平:数据D0-D7将送入指令执行器执行。11.D0-D7:数据输入输出引脚。11.2.5指令描述1.显示模式设置第四十四页,共一百二十五页,2022年,8月28日

R/W A0 /RD /WR D7 D6 D6 D4 D3 D2 D1 D00 1 0 1 0 1 0 1 1 1 D功能:开/关屏幕显示,不改变显示RAM(DDRAM)中的内容,也不影响内部状态。D=0,开显示;D=1,关显示。如果在显示关闭的状态下选择静态驱动模式,那么内部电路将处于安全模式。2.设置显示起始行R/W A0 /RD /WR D7 D6 D6 D4 D3 D2 D1 D00 1 0 1 1 0 A4 A3 A2 A1 A0功能:执行该命令后,所设置的行将显示在屏幕的第一行。起始地址可以是0-31范围内任意一行。行地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一。3.页地址设置R/W A0 /RD /WR D7 D6 D6 D4 D3 D2 D1 D00 1 0 H L H H H L A1 A0功能:设置页地址。第四十五页,共一百二十五页,2022年,8月28日

第四十六页,共一百二十五页,2022年,8月28日

第四十七页,共一百二十五页,2022年,8月28日当“读-修改-写模式”关闭时,每执行一次读指令,列地址自动加1,所以可以连续从DDRAM读出数据而不用设置列地址。注意:再设置完列地址后,首次读显示数据前必须执行一次空的“读显示数据”。这是因为设置完列地址后,第一次读数据时,出现在数据总线上的数据是列地址而不是所要读出的数据。

8.设置显示方向第四十八页,共一百二十五页,2022年,8月28日

第四十九页,共一百二十五页,2022年,8月28日功能:使模块内部初始化。初始化内容:①设置显示初始行为第一行;②页地址设置为第三页。复位指令对显示RAM没有影响。14设置安全模式通过关闭显示并打开静态显示的方法,可以设置安全模式,以减小功耗。第五十页,共一百二十五页,2022年,8月28日安全模式下的内部状态:停止LCD驱动。Segment和Common输出VDD电平。停止晶体震荡并禁止外部时钟输入,晶振输入OSC2引脚处于不确定状态。显示数据和内部模式不变。可通过打开显示或关闭静态显示的方法关闭安全模式。

11.2.6LCD12232指令码功能表LCD12232指令码功能表如表11-4所示。表11-4LCD12232指令码功能表第五十一页,共一百二十五页,2022年,8月28日

第五十二页,共一百二十五页,2022年,8月28日11.2.7LCD12232应用举例例11.3用C51编程,实现在12232液晶的第一行显示“BigBigWorld!”第二行显示“世界无限大!”。#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharsbitCS=P1^2;sbitSID=P1^1;sbitSCLK=P1^0;ucharcodedisps[]={"BigBigWorld!"};ucharcodedispx[]={"世界无限大!"};第五十三页,共一百二十五页,2022年,8月28日voiddelay(uintxms){ uinti,j; for(j=0;j<xms;j++) for(i=0;i<110;i++);}voidsend_command(ucharcommand_data)//命令发送{ uchari; uchari_data; i_data=0xf8;//写指令

CS=1; SCLK=0; for(i=0;i<8;i++)//第1字节

{ SID=(bit)(i_data&0x80); SCLK=0;

第五十四页,共一百二十五页,2022年,8月28日

SCLK=1; i_data=i_data<<1; }

i_data=command_data; i_data&=0xf0; for(i=0;i<8;i++)//第2字节

{ SID=(bit)(i_data&0x80); SCLK=0; SCLK=1; i_data=i_data<<1; } i_data=command_data; i_data<<=4; for(i=0;i<8;i++)//第3字节

{

第五十五页,共一百二十五页,2022年,8月28日SID=(bit)(i_data&0x80); SCLK=0; SCLK=1; i_data=i_data<<1; } CS=0; delay(10);}voidsend_data(ucharcommand_data)//数据发送{ uchari; uchari_data; i_data=0xfa;//写数据第五十六页,共一百二十五页,2022年,8月28日CS=1; for(i=0;i<8;i++)//第1字节 { SID=(bit)(i_data&0x80); SCLK=0; SCLK=1; i_data=i_data<<1; }

i_data=command_data; i_data&=0xf0; for(i=0;i<8;i++)//第2字节 { SID=(bit)(i_data&0x80); SCLK=0; SCLK=1; i_data=i_data<<1;

第五十七页,共一百二十五页,2022年,8月28日} i_data=command_data; i_data<<=4; for(i=0;i<8;i++)//第3字节

{ SID=(bit)(i_data&0x80); SCLK=0; SCLK=1; i_data=i_data<<1; } CS=0; delay(10);}voidinit(){ delay(100);

第五十八页,共一百二十五页,2022年,8月28日send_command(0x06);//游标及显示右移一位 send_command(0x0c);//整体显示开,游标关,反白关 send_command(0x01);//写入空格清屏幕 send_command(0x80);//设定首次显示位置}voiddisplay_s(){ uchara; send_command(0x80); for(a=0;a<11;a++) { send_data(disps[a]); }}第五十九页,共一百二十五页,2022年,8月28日voiddisplay_x(){ uchara; send_command(0x92); for(a=0;a<11;a++) { send_data(dispx[a]); }}voidmain(){ init(); display_s(); display_x(); while(1);}第六十页,共一百二十五页,2022年,8月28日程序说明:1、发送命令和发送数据分别用send_command()和send_data()函数实现,由前面的描述可知,无论是发送一条命令还是发送一条数据都是由三个字节组成,若发送指令则第一个字节为0xf8,若发送数据则第一个字为0xfa,从上面两个函数可看出,它们的不同之处。2、“SID=(bit)(i_data&0x80)”中(bit)表示将后面括号里的数强制转换成位,当把一个字节强制转换成一位时,使用(bit),这里只取这个字节的最高位。整条语句的意思是,将i_data的最高位取出来赋给SID,从而发送给液晶。3、“i_data=command_data;”和“i_data&=0xf0;”这两句的意思是,将所发送字节的高4位取出,低4位补0。“i_data=command_data;”和“i_data<<4;”这两句的意思是,将所发送的低4位移到高4位的位置上,原来的低4位自动补0。4、“lcd_init();”是对12232液晶的初始化设置,只有对液晶进行了正确的初始化设置,液晶才能正常运行。第六十一页,共一百二十五页,2022年,8月28日例11.4

用C51编程,实现第一行从右侧移入“Youarenotalone!”,同时第二行从右侧移入“你并不孤独!”,移入速度自定,最后停留在屏幕上。#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharsbitCS=P1^2;sbitSID=P1^1;sbitSCLK=P1^0;ucharcodedisps[]={"Youarenotalone!"};ucharcodedispx[]={"你并不孤独!"};voiddelay(uintxms){ uinti,j; for(i=xms;i>0;i--) for(j=110;j>0;j--);}voidsend_command(ucharcommand_data)第六十二页,共一百二十五页,2022年,8月28日{ uchari; uchari_data; i_data=0xf8; CS=1; SCLK=0; for(i=0;i<8;i++) { SID=(bit)(i_data&0x80); SCLK=0; SCLK=1; i_data=i_data<<1; }

i_data=command_data; i_data&=0xf0; for(i=0;i<8;i++) 第六十三页,共一百二十五页,2022年,8月28日{ SID=(bit)(i_data&0x80); SCLK=0; SCLK=1; i_data=i_data<<1; } i_data= for(i=0;i<8;i++) { SID=(bit)(i_data&0x80); SCLK=0; SCLK=1; i_data=i_data<<1; }第六十四页,共一百二十五页,2022年,8月28日CS=0; delay(1);}voidsend_data(ucharcommand_data){ uchari; uchari_data; i_data=0xfa; CS=1; for(i=0;i<8;i++) { SID=(bit)(i_data&0x80); SCLK=0; SCLK=1; i_data=i_data<<1; }第六十五页,共一百二十五页,2022年,8月28日i_data=command_data; i_data&=0xf0; for(i=0;i<8;i++) { SID=(bit)(i_data&0x80); SCLK=0; SCLK=1; i_data=i_data<<1; } i_data=command_data; i_data<<=4; for(i=0;i<8;i++) { SID=(bit)(i_data&0x80); SCLK=0; SCLK=1; i_data=i_data<<1;第六十六页,共一百二十五页,2022年,8月28日} CS=0; delay(1);}voidlcd_init(){ delay(100); send_command(0x30); //设置8位数据口,基本指令模式 send_command(0x02);//清DDRAM send_command(0x06);//游标及显示右移一位 send_command(0x0c);//整体显示开,游标关,反白关 send_command(0x01);//写入空格清屏幕send_command(0x80);//设定首次显示位置第六十七页,共一百二十五页,2022年,8月28日}voiddisplay_s(ucharnum){ uchara; send_command(0x88-num); for(a=0;a<15;a++) { send_data(dispx[a]); }}voiddisplay_x(ucharnum){ uchara; send_command(0x98-num); for(a=0;a<15;a++) {第六十八页,共一百二十五页,2022年,8月28日send_data(dispx[a]); }}voidmain(){ ucharaa; lcd_init(); for(aa=0;aa<9;aa++) { display_s(aa); display_x(aa); delay(300); } while(1);}第六十九页,共一百二十五页,2022年,8月28日程序说明:1.由于12232液晶没有专门的移屏指令,因此我们使用for循环来实现移屏效果,实际上这种效果是重复向不同的地方写入显示字符而实现的。用这种方法看上去是从右往左移动,也可以从左向右移动。2.Delay(300)延时函数决定屏幕移动的速度,自行调节。11.3液晶显示器LCD1286411.3.1液晶LCD12864显示模块概述JM12864M-2汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。主要技术参数和显示特性:1.电源:VDD3.3V~+5V(内置升压电路,无需负压);2.显示内容:128列×64行3.显示颜色:黄绿3讲第七十页,共一百二十五页,2022年,8月28日

4.LCD类型:STN5.与MCU接口:8位或4位并行/3位串行6.配置LED背光7.多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等8.外观尺寸:93×70×12.5mm视域尺寸:73×39mm如图11-10和图11-11所示。第七十一页,共一百二十五页,2022年,8月28日

11.3.2LCD12864模块引脚说明LCD128X64HZ引脚说明表如表11-5所示。表11-5LCD128X64HZ引脚说明表第七十二页,共一百二十五页,2022年,8月28日

第七十三页,共一百二十五页,2022年,8月28日逻辑工作电压(VDD):4.5~5.5V电源地(GND):0V工作温度(Ta):-10℃~60℃(常温)/-20℃~70℃(宽温)11.3.3LCD12864接口时序模块有并行和串行两种连接方法(时序如下)。

1.并行连接时序图

1)MPU写资料到模块如图11-12所示。第七十四页,共一百二十五页,2022年,8月28日

第七十五页,共一百二十五页,2022年,8月28日

图11-14串行连接时序图串行数据传送共分三个字节完成:第一字节:串口控制—格式11111ABCA为数据传送方向控制:H表示数据从LCD到MCU,L表示数据从MCU到LCDB为数据类型选择:H表示数据是显示数据,L表示数据是控制指令C固定为0第七十六页,共一百二十五页,2022年,8月28日第二字节:(并行)8位数据的高4位—格式DDDD0000第三字节:(并行)8位数据的低4位—格式0000DDDD11.3.4LCD12864用户指令集

1.指令表1:(RE=0:基本指令集)第七十七页,共一百二十五页,2022年,8月28日

第七十八页,共一百二十五页,2022年,8月28日

第七十九页,共一百二十五页,2022年,8月28日备注:1.当模块在接受指令前,微处理顺必须先确认模块内部处于非忙碌状态,即读取BF标志时BF需为0,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成,指令执行的时间请参考指令表中的个别指令说明。

第八十页,共一百二十五页,2022年,8月28日

2.“RE”为基本指令集与扩充指令集的选择控制位元,当变更“RE”位元后,往后的指令集将维持在最后的状态,除非再次变更“RE”位元,否则使用相同指令集时,不需每次重设“RE”位元。具体指令介绍:

1、清除显示第八十一页,共一百二十五页,2022年,8月28日功能:把DDRAM地址计数器调整为“00H”,游标回原点,该功能不影响显示DDRAM功能:执行该命令后,所设置的行将显示在屏幕的第一行。显示起始行是由Z地址计数器控制的,该命令自动将A0-A5位地址送入Z地址计数器,起始地址可以是0-63范围内任意一行。Z地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一。4、显示状态开/关第八十二页,共一百二十五页,2022年,8月28日

第八十三页,共一百二十五页,2022年,8月28日

第八十四页,共一百二十五页,2022年,8月28日

第八十五页,共一百二十五页,2022年,8月28日

第八十六页,共一百二十五页,2022年,8月28日

第八十七页,共一百二十五页,2022年,8月28日

1.文本显现RAM(DDRAM)文本显示RAM提供4行(每行8个)的汉字空间,当写入文本显示RAM时,可以分别显示CGROM、HCGROM与CGRAM的字型;ST7920A可以显示三种字型,分别是半宽的HCGROM字型、CGRAM字型及中文CGROM字型。三种字型的选择,由在DDRAM中写入的编码选择,各种字型详细编码如下:1)显示半宽字型:将一位字节写入DDRAM中,范围为02H-7FH的编码。2)显示CGRAM字型:将两字节编码写入DDRAM中,总共有0000H,0002H,0004H,0006H四种编码3)显示中文字形:将两字节编码写入DDRAMK,范围为A1A0H-F7FFH(GB码)或A140H-D75FH(BIG5码)的编码。

2.绘图RAM(GDRAM)绘图显示RAM提供128×8字节的记忆空间,在更改绘图RAM时,先连续写入水平与垂直的坐标值,再写入两个字节的数据到绘图RAM,而地址计数器(AC)会自动加一;在写入绘图RAM的期间,绘图显示必须关闭,整个写入绘图RAM的步骤如下:第八十八页,共一百二十五页,2022年,8月28日1)关闭绘图显示功能。2)先将水平的位元组坐标(X)写入绘图RAM地址;3)再将垂直的坐标(Y)写入绘图RAM地址;4)将D15—D8写入到RAM中;将D7—D0写入到RAM中;5)打开绘图显示功能。6)绘图显示的缓冲区对应分布请参考“显示坐标”7)游标/闪烁控制ST7920A提供硬件游标及闪烁控制电路,由(addresscounter)地址计数器的值来指定DDRAM中的游标或闪烁位置。11.3.7LCD12864应用举例例11-5如图11-15所示,用C编写程序,在LCD12864上显示“中山大学”四个字。第八十九页,共一百二十五页,2022年,8月28日

第九十页,共一百二十五页,2022年,8月28日//函数库名称:12864显示函数#include<reg51.h>#include<absacc.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#definePORTP0sbitCS1=P2^4;//左半屏片选脚sbitCS2=P2^3;//右半屏片选脚sbitRS=P2^2;//H代表数据输入,L代表指令码输入sbitRW=P2^1;//H读取,L写入sbitE=P2^0;//使能,由H到L完成使能sbitbflag=P0^7;//忙标志位ucharcodeNum[]={0x00,0x20,0x60,0xE0,0xE0,0xE0,0xF0,0xFC,第九十一页,共一百二十五页,2022年,8月28日0xFF,0xFC,0xF0,0xE0,0xE0,0xE0,0x60,0x20,0x00,0x00,0x40,0x30,0x3D,0x1F,0x1F,0x0F,0x07,0x0F,0x1F,0x1F,0x3D,0x30,0x40,0x00,//星号0x00,0xf8,0x08,0x08,0x08,0x08,0x08,0xff,0x08,0x08,0x08,0x08,0x08,0xfc,0x08,0x00,0x00,0x03,0x01,0x01,0x01,0x01,0x01,0xff,0x01,0x01,0x01,0x01,0x01,0x03,0x00,0x00,//中0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x7f,0x20,0x20,0x20,0x20,0x20,0x3f,0x20,0x20,0x20,0x20,0x20,0x7f,0x00,0x00, //山0x20,0x20,0x20,0x20,0x20,0x20,0xa0,0x7f,0xa0,0x20,0x20,0x20,0x20,0x30,0x20,0x00,0x00,0x40,0x40,0x20,0x10,0x0c,0x03,0x00,0x01,0x06,0x08,0x10,0x20,0x60,0x20,0x00, //大0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,第九十二页,共一百二十五页,2022年,8月28日0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00,0x04,0x04,0x04,0x04,0x04,0x44,0x84,0x7e,0x06,0x05,0x04,0x04,0x04,0x06,0x04,0x00,//学};//****驱动函数****voidLeft()//选左半屏{CS1=0;CS2=1;}voidRight()//选右半屏{CS1=1;CS2=0;}第九十三页,共一百二十五页,2022年,8月28日voidBusy_12864()//判忙函数{do { E=0; RS=0;//读状态

RW=1; PORT=0xff; E=1; E=0; }while(bflag);//若bflag=1则代表系统忙}voidWreg(ucharc)//写指令{

第九十四页,共一百二十五页,2022年,8月28日Busy_12864(); RS=0; RW=0; PORT=c; E=1;//E下降沿,液晶模块从数据总线写入指令

E=0;}voidWdata(ucharc)//写数据{ Busy_12864(); RS=1; RW=0; PORT=c; E=1; E=0;第九十五页,共一百二十五页,2022年,8月28日}voidPagefirst(ucharc)//页设置//LCD12864一共可以画32个字,4行,每行8个字,左半屏4个,右半屏4个;//每个字占2页,第0页显示上半字,第1页显示下半字,画1个字是16X16个点;//8小行为一页,DDRAM共64小行,即8页,7,所以只能显示4行汉字{ uchari; i=c; c=i|0xb8;//实际页数和b8(即10111000B)的或运算就是要送的代码,逻辑加法

Busy_12864(); Wreg(c);}第九十六页,共一百二十五页,2022年,8月28日voidLinefirst(ucharc)//列设置,Y=0-63,左右半屏各64列{ uchari; i=c; c=i|0x40;//实际列数和40H(即01000000B)的或运算就是要送的代码

Busy_12864(); Wreg(c);}//****清屏函数****voidReady_12864() {uinti,j;Left();Wreg(0x3f);//左屏开显示;0x3e为关显示的控制字

Right();第九十七页,共一百二十五页,2022年,8月28日

Wreg(0x3f);//右屏开显示;0x3f为开显示的控制字Left();//清左屏for(i=0;i<8;i++){ Pagefirst(i); Linefirst(0x00); for(j=0;j<64;j++) { Wdata(0x00); }}Right();//清右屏for(i=0;i<8;i++){ Pagefirst(i);

第九十八页,共一百二十五页,2022年,8月28日Linefirst(0x00); for(j=0;j<64;j++) { Wdata(0x00); } }}//****16×6汉字显示程序****voidDisplay(uchar*s,ucharpage,ucharline) {//先上半字,再下半字;由左向右逐列送值

uchari,j; Pagefirst(page); Linefirst(line); for(i=0;i<16;i++) {第九十九页,共一百二十五页,2022年,8月28日

Wdata(*s);//指针S指向数组Num进行抽数

s++; } Pagefirst(page+1); //换页,显示下半字,一个字需要2页才可以完成显示,即16小行

Linefirst(line); for(j=0;j<16;j++) { Wdata(*s); s++; }}第一百页,共一百二十五页,2022年,8月28日main()//主程序{//(3、4页)显示6个字;Ready_12864(); Left(); Display(Num+0,0x03,16);//第3页第16列(左屏第1个字位置) Display(Num+32,0x03,32);//第3页第32列(左屏第2个字位置) Display(Num+64,0x03,48);//第3页第48列(左屏第3个字位置) Right(); Display(Num+96,0x03,0);//第3页第0列(右屏第0个字位置) Display(Num+128,0x03,16);//第3页第16列(右屏第1个字位置) Display(Num+0,0x03,32);//第3页第32列(右屏第2个字位置) while(1);}第一百零一页,共一百二十五页,2022年,8月28日例11.6

如图11-16所示,用C编程,在4X4键盘上按键,在LCD12864显示相应的按键。第一百零二页,共一百二十五页,2022年,8月28日程序如下:#include<reg51.h>#include<INTRINS.H>#defineanP0/*使用P0口作键盘输入*//*****液晶显示*****KS0108驱动芯片的LCD*******************/#definec88#definec1616/*****************************/#defineksddP2 /*数据输出*/sbitksrs=P1^0;sbitksrw=P1^1;sbitkse=P1^2;sbitkscs1=P1^3;第一百零三页,共一百二十五页,2022年,8月28日sbitkscs2=P1^4;/****************************//*中*/codeunsignedcharzhong[32]={0x00,0xf8,0x08,0x08,0x08,0x08,0x08,0xff,0x08,0x08,0x08,0x08,0x08,0xfc,0x08,0x00,0x00,0x03,0x01,0x01,0x01,0x01,0x01,0xff,0x01,0x01,0x01,0x01,0x01,0x03,0x00,0x00};/*文*/codeunsignedcharwen[32]={0x08,0x08,0x08,0x18,0x68,0x88,0x09,0x0e,0x08,0x08,0xc8,0x38,0x08,0x0c,0x08,0x00,0x80,0x80,0x40,0x40,0x20,0x11,0x0a,0x04,0x0a,0x11,0x10,0x20,0x40,0xc0,0x40,0x00};/*液*/codeunsignedcharye[32]={0x10,0x22,0x64,0x0c,0x80,0x04,0xc4,0x34,0x05,0xc6,0xbc,0x24,0x24,0xe6,0x04,0x00,0x04,0x04,0xfe,0x01,0x02,0x01,0xff,0x42,0x21,0x16,0x08,0x15,0x23,0x60,0x20,0x00};第一百零四页,共一百二十五页,2022年,8月28日/*晶*/codeunsignedcharjing[32]={0x00,0x00,0x00,0x00,0xff,0x49,0x49,0x49,0x49,0x49,0xff,0x00,0x00,0x80,0x00,0x00,0x00,0xff,0x49,0x49,0x49,0x49,0xff,0x00,0xff,0x49,0x49,0x49,0x49,0xff,0x01,0x00};/*显*/codeunsignedcharxian[32]={0x00,0x00,0x00,0xfe,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0xff,0x02,0x00,0x00,0x00,0x40,0x42,0x44,0x4d,0x40,0x7f,0x40,0x40,0x40,0x7f,0x40,0x49,0x44,0x66,0x40,0x00};/*示*/codeunsignedcharshi[32]={0x40,0x40,0x42,0x42,0x42,0x42,0x42,0xc2,0x42,0x42,0x42,0x43,0x42,0x60,0x40,0x00,0x00,0x10,0x08,0x04,0x06,0x40,0x80,0x7f,0x00,0x00,0x02,0x04,0x0c,0x18,0x00,0x00};第一百零五页,共一百二十五页,2022年,8月28日/*0*/codeunsignedcharzero[32]={0x00,0x00,0x00,0x00,0xf0,0xf8,0x0c,0x04,0x04,0x04,0x0c,0xf8,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x1f,0x30,0x20,0x20,0x20,0x30,0x1f,0x0f,0x00,0x00,0x00};/*16x16数字字模*//*1*/codeunsignedcharone[32]={0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xf8,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x3f,0x3f,0x20,0x00,0x00,0x00,0x00,0x00,0x00};/*2*/codeunsignedchartwo[32]={0x00,0x00,0x00,0x00,0x30,0x38,0x0c,0x04,第一百零六页,共一百二十五页,2022年,8月28日0x04,0x0c,0xf8,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x30,0x38,0x2c,0x26,0x23,0x21,0x38,0x00,0x00,0x00,0x00};/*3*/codeunsignedcharthree[32]={0x00,0x00,0x00,0x00,0x10,0x18,0x0c,0x84,0x84,0xcc,0x78,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x18,0x30,0x20,0x20,0x31,0x1f,0x0e,0x00,0x00,0x00,0x00};/*4*/codeunsignedcharfour[32]={0x00,0x00,0x00,0x00,0x80,0xc0,0x70,0x18,0xfc,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x07,0x05,0x04,0x24,0x3f,0x3f,0x24,0x04,0x00,0x00,0x00,0x00};/*5*/codeunsignedcharfine[32]={0x00,0x00,0x00,0x00,0xfc,0xfc,0xc4,0x44,0x44,0xc4,0x84,0x04,0x00,0x00,0x00,0x00,第一百零七页,共一百二十五页,2022年,8月28日0x00,0x00,0x00,0x00,0x08,0x18,0x30,0x20,0x20,0x30,0x1f,0x0f,0x00,0x00,0x00,0x00};/*6*/codeunsignedcharsix[32]={0x00,0x00,0x00,0x00,0xf0,0xf8,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论