嵌入式系统原理与设计 课件 第十讲 LCD_第1页
嵌入式系统原理与设计 课件 第十讲 LCD_第2页
嵌入式系统原理与设计 课件 第十讲 LCD_第3页
嵌入式系统原理与设计 课件 第十讲 LCD_第4页
嵌入式系统原理与设计 课件 第十讲 LCD_第5页
已阅读5页,还剩97页未读 继续免费阅读

下载本文档

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

文档简介

1单片机与嵌入式系统第十讲本次课主要内容第二章单片机原理(八)2常见单片机外设(二)的应用初步!单片机原理(八)1.本次课的目标2.液晶显示器概述3.1602液晶显示模块概述4.1602液晶显示模块管脚定义5.1602液晶显示模块和单片机接口6.单片机对1602的四种操作模式7.1602LCD内部显示存储器8.1602LCD指令9.1602LCD的初始化10.1602LCD综合应用31.本次课的目标熟悉1602液晶,并能够对其进行编程应用。能根据外设的时序图,使用单片机对其控制。4单片机原理(八)1.本次课的目标2.液晶显示器概述3.1602液晶显示模块概述4.1602液晶显示模块管脚定义5.1602液晶显示模块和单片机接口6.单片机对1602的四种操作模式7.1602LCD内部显示存储器8.1602LCD指令9.1602LCD的初始化10.1602LCD综合应用52.液晶显示器概述液晶显示器简称LCD(LiquidCrystalDiodes)是利用液晶经过处理后能够改变光线传输方向的特性,达到显示字符或者图形的目的。其特点是体积小、重量轻、功耗极低、显示内容丰富等,在单片机应用系统中有着日益广泛的应用。67

在实际应用中,用户很少直接设计LCD显示器驱动接口,一般是直接使用LCD显示模块LCM。

LCM是把LCD显示屏、背景光源、线路板和驱动集成电路等部件构造成一个整体,作为一个独立部件使用。其特点是功能较强、易于控制、接口简单,在单片机系统中应用较多。LCM一般带有内部显示RAM和字符发生器,只要输入ASCII码就可以进行显示。8

9单片机原理(八)1.本次课的目标2.液晶显示器概述3.1602液晶显示模块概述4.1602液晶显示模块管脚定义5.1602液晶显示模块和单片机接口6.单片机对1602的四种操作模式7.1602LCD内部显示存储器8.1602LCD指令9.1602LCD的初始化10.1602LCD综合应用103.1602液晶显示模块概述1602字符型液晶模块是一种用5x7点阵图形来显示字符的液晶显示器。1602可以显示2行、每行显示16个ASCII字符,并且可以自定义图形,只需要写入相对应字符的ASCII码就可以显示,使用上相对数码管更能显示丰富的信息。1112目前市面上的字符型液晶绝大多数是基于HD44780

液晶控制芯片的,所以控制原理是完全相同的,为HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。13HD44780内置了192个常用字符,存于字符产生器CGROM(CharacterGeneratorROM)中,另外还有几个允许用户自定义的字符产生RAM,称为CGRAM(CharacterGeneratorRAM)。1415除了CGROM和CGRAM外,LCD内部还有一个DDRAM(DisplayDataRAM),用于存放待显示内容,LCD控制器的指令系统规定,在送待显示字符代码的指令之前,先要送DDRAM的地址(即待显示的字符显示位置)。16如:要在第1行第2列写入字符“A”,这时先写入第1行第2列对应的DDRAM的地址:01H,然后再往DDRAM中写入“A”的字符码。DDRAM的内容对应于把要显示的字符地址,而DDRAM的地址就对应于显示字符的位置。17单片机原理(八)1.本次课的目标2.液晶显示器概述3.1602液晶显示模块概述4.1602液晶显示模块管脚定义5.1602液晶显示模块和单片机接口6.单片机对1602的四种操作模式7.1602LCD内部显示存储器8.1602LCD指令9.1602LCD的初始化10.1602LCD综合应用184.1602液晶显示模块管脚定义LCD1602采用标准的16脚接口:第1脚:VSS为地电源;第2脚:VDD接5V正电源;

19第3脚:Vo为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,使用时可以通过一个10K的电位器调整对比度;第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器;20第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。第15~16脚:空脚21单片机原理(八)1.本次课的目标2.液晶显示器概述3.1602液晶显示模块概述4.1602液晶显示模块管脚定义5.1602液晶显示模块和单片机接口6.单片机对1602的四种操作模式7.1602LCD内部显示存储器8.1602LCD指令9.1602LCD的初始化10.1602LCD综合应用225.1602液晶显示模块和单片机接口23单片机原理(八)1.本次课的目标2.液晶显示器概述3.1602液晶显示模块概述4.1602液晶显示模块管脚定义5.1602液晶显示模块和单片机接口6.单片机对1602的四种操作模式7.1602LCD内部显示存储器8.1602LCD指令9.1602LCD的初始化10.1602LCD综合应用246.单片机对1602的四种操作模式D0~D7端为8位数据口,进行数据传送,而RS、R/W、E端则配合可以做出不同的操作,对1602进行操作主要有四种,如下:1、读状态,输入:RS=L,RW=H,E=H。输出:D0~D7=状态字2、写指令,输入:RS=L,RW=L,D0~D7=指令,E=高脉冲(1->0)。输出:无253、读数据,输入:RS=H,RW=H,E=H。输出:D0~D7=数据4、写数据,输入:RS=H,RW=L,D0~D7=数据,E=高脉冲(1->0)。输出:无26液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。276.1读操作时序28ABRS则根据读的内容(状态或数据)置为1或0在A位置,E置为0,经过tD时间后,E置为1,可以在数据口读到正确的数据读数阶段指令1:读操作时序29如何将这一过程用语言描述?根据RS状态,分为:读状态、读数据。指令1:读操作时序30读数据的语言描述核心步骤1:设置RS为对数据操作功能;核心步骤2:设置RW为读功能;核心步骤3:设置E为低;核心步骤4:延时;核心步骤5:设置E为高;核心步骤6:读出数据;核心步骤7:E恢复为0;31指令1:读操作时序读数据的语言描述核心步骤1:设置RS为对数据操作功能;核心步骤2:设置RW为读功能;核心步骤3:设置E为低;核心步骤4:延时;核心步骤5:设置E为高;核心步骤6:读出数据;核心步骤7:E恢复为0;uchar

LCD_Read_Data(void){ucharTemp;LCD_RS=1;LCD_RW=1;LCD_E=0;

LCD_Delay(5);LCD_E=1;Temp=LCD_DATA;LCD_E=0;return(Temp);}指令1:读操作时序32读状态的语言描述核心步骤1:设置RS为对状态操作功能;(通过指令寄存器完成)核心步骤2:设置RW为读功能;核心步骤3:设置E为低;核心步骤4:延时;核心步骤5:设置E为高;核心步骤6:读出数据;核心步骤7:E恢复为0;33指令1:读操作时序读状态的语言描述核心步骤1:设置RS为对状态操作功能;核心步骤2:设置RW为读功能;核心步骤3:设置E为低;核心步骤4:延时;核心步骤5:设置E为高;核心步骤6:读出数据;核心步骤7:E恢复为0;uchar

LCD_Check_Busy(void){uchartemp;LCD_DATA=0xFF;LCD_RS=0;LCD_RW=1;LCD_E=0;

LCD_Delay(5);LCD_E=1;while(LCD_DATA&0x80);temp=LCD_DATA;

LCD_E=0;return(temp);}1602LCD状态字34注意:每次对控制器进行读写之前,都必须进行读写检测,确保STA7为0.问题:如何根据上图,确定LCD是否处于“忙状态”?根据STA7的值,为1时忙。如何编程实现:遇忙等待?while((Busy_Check()&0x80)==0x80);35非常重要!6.2写操作时序36CD在进行写操作的时候,RW要置为0,RS根据写的内容不同(指令或数据)置为1或0。注意C和D两根线,RW置低后,延时一段时间,E才能置为1,再延时,E置0时将数据写入。指令2:写操作时序37如何编写写指令程序?Step1:检查LCD状态是否为忙?遇忙等待!Step2:RS为高还是为低?选择指令寄存器,因此为低!Step3:RW为写操作Step4:使能信号置为0Step5:延时Step6:使能信号置为1Step7:使能信号置为0Step8:写入指令指令2:写操作时序38CDStep1:检查LCD状态是否为忙?遇忙等待!Step2:RS为低Step3:RW为写操作Step4:使能信号置为0Step5:延时Step6:使能信号置为1Step7:使能信号置为0Step8:写入指令voidLCD_Write_Cmd(ucharcmd,BusyC){if(BusyC)LCD_Check_Busy();LCD_DATA=cmd;LCD_RS=0;LCD_RW=0;LCD_E=0;LCD_Delay(5);LCD_E=1;}指令2:写操作时序39如何编写写数据程序?Step1:检查LCD状态是否为忙?遇忙等待!Step2:RS为高还是为低?选择数据寄存器,因此为高!Step3:RW为写操作Step4:E置为0Step5:延时Step6:E置为1Step7:E置为0Step8:写入数据指令2:写操作时序40CDStep1:检查LCD状态是否为忙?遇忙等待!Step2:RS为高Step3:RW为写操作Step4:E置为0Step5:延时Step6:E置为1Step7:E置为0Step8:写入数据voidLCD_Write_Data(uchardat){LCD_Check_Busy();LCD_DATA=dat;LCD_RS=1;LCD_RW=0;LCD_E=0;LCD_Delay(5);LCD_E=1;LCD_E=0;}单片机原理(八)1.本次课的目标2.液晶显示器概述3.1602液晶显示模块概述4.1602液晶显示模块管脚定义5.1602液晶显示模块和单片机接口6.单片机对1602的四种操作模式7.1602LCD内部显示存储器8.1602LCD指令9.1602LCD的初始化10.1602LCD综合应用417.1602LCD内部显示存储器要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符。通过指令码来实现控制:42指令码功能80H+地址码(0~27H,40~67H)设置数据地址指针问题:根据这两个表格,若需要在第一行的位置1处显示数据,需要向LCD写入什么指令?LCD_Write_Cmd(0x80,1);如果要在第二行位置1处写入呢?LCD_Write_Cmd(0xC0,1);43指令码功能80H+地址码(0~27H,40~67H)设置数据地址指针从地址码范围(0~27H,40~67H)可知,LCD控制器的内部RAM缓冲区大小为80×8位。但每行只能显示16个字。44如果希望在LCD的某一特定位置显示某一特定字符,一般要遵循“先指定地址,后写入内容”的原则;45演示:Project4在第一行第一个位置显示’a’LCD_Write_Cmd(0x80,1);LCD_Write_Data('a');在第一行第一、二个位置显示’ab’LCD_Write_Cmd(0x80,1);LCD_Write_Data('a');LCD_Write_Cmd(0x81,1);LCD_Write_Data(‘b');46在第二行第一个位置显示’b’LCD_Write_Cmd(0xC0,1);LCD_Write_Data(‘b');在第一行第一个位置开始显示’ab’,在第二行第一个字符开始显示’cd’。LCD_Write_Cmd(0x80,1);LCD_Write_Data('a');LCD_Write_Cmd(0x81,1);LCD_Write_Data(‘b');LCD_Write_Cmd(0xC0,1);LCD_Write_Data(‘c');LCD_Write_Cmd(0xC1,1);LCD_Write_Data(‘d');47如何实现更多的控制?光标是否显示光标是否闪动清屏只显示一行关闭与打开如何实现屏幕滚动如何更简化操作……48通过特殊指令完成!单片机原理(八)1.本次课的目标2.液晶显示器概述3.1602液晶显示模块概述4.1602液晶显示模块管脚定义5.1602液晶显示模块和单片机接口6.单片机对1602的四种操作模式7.1602LCD内部显示存储器8.1602LCD指令9.1602LCD的初始化10.1602LCD综合应用498.1602LCD指令8.1显示功能设置8.2显示开关及光标设置8.3清屏8.4设定显示屏或光标移动方向指令8.5AC值控制及屏幕移动设置8.6光标归位指令8.7指令小结及编程技巧8.8综合实验508.1显示功能设置设定数据总线位数、显示的行数及字型。51功能设定指令功能:设定数据总线位数、显示的行数及字型。DL:DL=0数据总线为4位;DL=1数据总线为8位N:

N=0显示1行;N=

1显示2行F:F=05×7点阵/每字符;F=15×10点阵/每字符52问题:如果需要设置为:16×2显示,5×7点阵,8位数据接口。写什么指令?DL=1;N=1;F=0;因此:写入指令:0x38常用:如何用C语言实现?LCD_Write_Cmd(0x38,1);

53实现:写指令38H:显示模式设置8.2显示开关及光标设置控制显示器开/关、光标显示/关闭以及光标是否闪烁。54显示开关控制指令功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。D:D=0显示功能关;D=1显示功能开C:C=0无光标;C=1有光标B:B=0光标不闪烁;B=

1光标闪烁55问题:如果需要关闭显示。写什么指令?D=0;C=0;B=0;因此:写入指令:0x08LCD_Write_Cmd(0x08,1);//显示关闭显示开关控制指令功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。D:

D=0显示功能关;D=

1显示功能开C:

C=0无光标;C=

1有光标B:B=0光标不闪烁;B=

1光标闪烁56问题:如果需要打开显示。且不需要光标。写什么指令?D=1;C=0;B=0;因此:写入指令:0x0CLCD_Write_Cmd(0x0C,1);//显示开不需要光标演示:Project2(Proteus

Keil)(1)使LCD显示闪烁的光标LCD_Write_Cmd(0x0F,1);//显示闪烁的光标(2)不显示光标LCD_Write_Cmd(0x0C,1);//不显示光标(3)显示不闪烁的光标LCD_Write_Cmd(0x0E,1);//显示不闪烁的光标57(4)在第一行第一个位置显示’a’,同时显示闪烁的光标LCD_Write_Cmd(0x0F,1);//显示闪烁的光标LCD_Write_Cmd(0x80,1);LCD_Write_Data('a');58(5)在第一行第一个位置显示’a’,同时显示闪烁的光标。显示一段时间后,关闭LCDLCD_Write_Cmd(0x0F,1);//显示闪烁的光标LCD_Write_Cmd(0x80,1);LCD_Write_Data('a');LCD_Delay(1000);LCD_Write_Cmd(0x08,1);598.3清屏清除所显示的内容,但光标不会清除60清屏指令。<1>清除液晶显示器,即将DDRAM的内容全部填入"空白"的ASCII码20H;<2>光标归位,即将光标撤回液晶显示屏的左上方;<3>将地址计数器(AC)的值设为0。61问题:如果需要清屏。写什么指令?写入指令:0x01LCD_Write_Cmd(0x01,1);//显示清屏演示:(6)在第一行第一个位置显示’a’,同时显示闪烁的光标。显示一段时间后,清屏LCD_Write_Cmd(0x0F,1);//显示闪烁的光标LCD_Write_Cmd(0x80,1);LCD_Write_Data('a');LCD_Delay(1000);LCD_Write_Cmd(0x01,1);628.4设定显示屏或光标移动方向指令设定每次定入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。63进入模式设置指令功能:设定每次定入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。ID=1:当读或写一个字符后地址指针加1,且光标加1;ID=0:当读或写一个字符后地址指针减1,且光标减1;S=1:当写一个字符,正屏显示左移(ID=1)或右移(ID=0),以得到光标不移动而屏幕移动的效果。S=0:当写一个字符时,整屏显示不移动。64问题:如果需要写入新数据后光标右移但显示屏不移动。写什么指令?写入指令:0x06LCD_Write_Cmd(0x06,1);//显示光标移动设置演示:Project3(1)在LCD的第一行,显示26个英文字母。for(i=0;i<=25;i++){ LCD_Write_Cmd(0x80+i,1); LCD_Write_Data(‘A'+i); LCD_Delay(200);}65由于一行最多显示16个,后续的字母无法显示(2)在刚刚的演示基础上,添加滚屏控制,当超过16个字符时,屏幕自动左移,最新出现的字符在最右边一个。I/D1=写入新数据后光标右移S1=写入新数据后显示屏整体右移1个字符66if(i>=15)LCD_Write_Cmd(0x07,1);8.5AC值控制及屏幕移动设置使光标移位或使整个显示屏幕移位。67初始化完成后,如果希望在LCD的某一特定位置显示某一特定字符,一般要遵循“先指定地址,后写入内容”的原则;但如果希望在LCD上显示一串连续的字符(如单词等),并不需要每次写字符码之前都指定一次地址,这是因为液晶控制模块中有一个计数器叫地址计数器AC(AddressCounter)。68AC地址计数器的作用是负责记录写入DDRAM数据的地址,或从DDRAM读出数据的地址。该计数器的作用不仅仅是“写入”和“读出”地址,它还能根据用户的设定自动进行修改。69设定显示屏或光标移动方向指令功能:使光标移位或使整个显示屏幕移位。00:光标左移1格,且AC值减101:光标右移1格,且AC值加110:显示器上字符全部左移一格,但光标不动(可用于查看屏幕上显示不到的字符)11:显示器上字符全部右移一格,但光标不动70问题:如果根据本指令,简化刚刚的设计,使得每次不必再写地址?写入指令:0x14

LCD_Write_Cmd(0x14,1);演示:Project1(Proteus

Keil)LCD_Write_Cmd(0x0F,1);

LCD_Write_Cmd(0x14,1);

LCD_Write_Cmd(0x80,1);for(i=0;i<=25;i++){ //LCD_Write_Cmd(0x80+i,1); if(i>=15)LCD_Write_Cmd(0x07,1);

LCD_Write_Data('A'+i);

LCD_Delay(200);}718.6光标归位指令光标归位指令<1>把光标撤回到显示器的左上方;<2>把地址计数器(AC)的值设置为0;<3>保持DDRAM的内容不变。72在刚刚例子上,加入LCD_Write_Cmd(0x02,1);语句,会出现什么现象?光标回到A的位置演示:Project1(Proteus

KEIL)738.7指令小结及编程技巧在将E置高电平前,先设置好RS和R/W信号,在E上升沿到来之前,准备好写入的命令字或数据。只需在适当的地方加上延时,就可以满足要求了。74使能位E对执行LCD指令起着关键作用,E有两个有效状态,高电平(1)和下降沿(1→0)。当E为高电平时,如果R/W为0,则LCD从单片机读入指令或者数据;如果R/W为1,则单片机可以从LCD中读出状态字(BF忙状态)和地址。而E的下降沿指示写入LCD指令或数据。758.8综合实验在LCD的第一行输出A~Z,之后,通过两个按键,其中一个控制显示左移,另一个控制显示右移。显示效果(演示:Project5)76分析:10:显示器上字符全部左移一格,但光标不动(可用于查看屏幕上显示不到的字符)11:显示器上字符全部右移一格,但光标不动77如何实现?显示部分参见前面例子添加两个中断,一个用于左移,一个用于右移。voidExternal_Interrupt_0()interrupt0{LCD_Write_Cmd(0x18,1);}voidExternal_Interrupt_1()interrupt2{LCD_Write_Cmd(0x1C,1);}78(演示:Project5)单片机原理(八)1.本次课的目标2.液晶显示器概述3.1602液晶显示模块概述4.1602液晶显示模块管脚定义5.1602液晶显示模块和单片机接口6.单片机对1602的四种操作模式7.1602LCD内部显示存储器8.1602LCD指令9.1602LCD的初始化10.1602LCD综合应用799.1602LCD的初始化LCD工作之前,必须进行初始化,且遵照厂商提供的初始化过程。8081voidLCD_Init(void){//三次显示模式设置,不检测忙信号LCD_Write_Cmd(0x38,0);

LCD_Delay(5);

LCD_Write_Cmd(0x38,0);

LCD_Delay(5);

LCD_Write_Cmd(0x38,0);

LCD_Delay(5);82

LCD_Write_Cmd(0x38,1); //显示模式设置,开始要求检测忙信号:8位、2行、5X7点阵

LCD_Write_Cmd(0x08,1);//关闭显示

LCD_Write_Cmd(0x01,1); //清屏

LCD_Write_Cmd(0x06,1); //显示光标移动设置:文字不动,光标自动右移

LCD_Write_Cmd(0x0C,1);//显示开及光标设置:光标关、光标不闪烁}单片机原理(八)1.本次课的目标2.液晶显示器概述3.1602液晶显示模块概述4.1602液晶显示模块管脚定义5.1602液晶显示模块和单片机接口6.单片机对1602的四种操作模式7.1602LCD内部显示存储器8.1602LCD指令9.1602LCD的初始化10.1602LCD综合应用8310.1602LCD综合应用8410.1LCD显示字符串LCD显示字符串的几种方法可以采用逐个先写地址、再写数据的方法可以设定AC自动累加,先写初始地址,再逐个写数据的方法可以在上述基础上,编写字符串显示子函数85voidLCDShowString(ucharx,uchary,uchar*str){ uchari=0; if(y==0)LCD_Write_Cmd(0x80+x,1); //y=0在第一行显示字符

if(y==1)LCD_Write_Cmd(0xC0+x,1); //y=1在第二行显示字符

for(i=0;i<16;i++) { LCD_Write_Data(str[i]);//开始写数据,地址指针根据设置,可自动加1 }}86实验:在1602LCD第一行上显示字符串“WelcomtoN.U.D.T.”。第二行上显示“75265914@”如何利用刚刚定义的LCDShowString函数?87(演示:Project7)ucharcodeschool_name[]={"WelcometoNUDT!"};ucharcodeemail[]={"75265914@"};LCDShowString(0,0, school_name);LCDShowString(0,1, email);8810.21602LCD显示时钟显示如图所显示的时钟89设计思路:设定变量:uchar

LCD_Dis[]="TIME:00:00:00";时、分、秒计时,将计时结果转换到变量中;Format(uchar

SecondCount,uchar

MinuteCount,uchar

HourCount,uchar*a)将变量显示到LCD上。90//主函数:执行累加,生成时、分、秒while(1) { SecondCount++; if(SecondCount>=60) { MinuteCount++; SecondCount=SecondCount%60; if(MinuteCount>=60) { HourCount++; HourCount=HourCount%24; MinuteCount=MinuteCount%60; } } Format(SecondCount,MinuteCount,HourCount,LCD_Dis); LCDShowString(0,1,LCD_Dis); DdelayX1ms(1000); }}91//Format函数:将时分秒转换为字符串voidFormat(uchar

SecondCount,uchar

MinuteCount,uchar

HourCount,uchar*a){ a[8]=HourCount/10+0x30;a[9]=HourCount%10

温馨提示

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

评论

0/150

提交评论