当前位置:首页 > HD44780液晶控制器显示系统设计
第3章 HD44780液晶控制器显示系统设计 97
口的驱动能力。如果去掉上拉电阻,LM016L将不显示。D0~D7既传送命令,又传送数据。当传送命令时,应同时使RS为0;当传送数据时,应同时使用RS为1。R/W是读写控制端,当R/W=0时,由单片机向LM016L发送命令或数据;当R/W=1时,由单片机从LM016L读取命令或数据。E为LM016L工作的使能端,前面已经介绍,不变的高电平或低电平不能使LM016L工作,必须由单片机在合适的时候给出一个周期约为1000ns、占空比为50%的脉冲。
LCD1LM016LRSRWE4561K12398765432U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161718XTAL29RST293031PSENALEEA12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C5117891011121314D0D1D2D3D4D5D6D7RP1VSSVDDVEE 图3-3 系统电路原理图
3.2.2 系统软件设计
系统软件设计采用模块化编程,由主程序调用各个子程序模块,子程序之间又互相嵌套。模块化编程增加了程序的可读性,初学者可以套用这些模块来轻松完成对LCD显示屏的控制。软件设计包含了对LM016L核心控制的所有环节,具有典型控制意义。
1. 主程序设计
系统主程序设计流程如图3-4所示,主要完成LCD初始化、DB块显示内容、以及对CGRAM的读、写。LM016L上电后15ms内进行内部初始化,此时不能完成对部分命令的操作,所以在主程序中初始化后调用了一个延时子程序,以等待初始化的完成。LM016L的初始化程序如下:
MOV A,#3CH ;设LCD为两行显示,字体5×7,8线输入方式 CALL WCOM ;调用写命令子程序
Proteus显示控制系统设计与实例 98
MOV A,#0EH ;设置光标显示方式 CALL WCOM
MOV A,#06H ;设置显示存储器地址计数器为自动加1方式 CALL WCOM
MOV A,#01H ;清显示屏并使光标位于LCD首行首列 CALL WCOM
宏指令清使能端LCD初始化调延时子程序赋首行DB块地址→DPTRA←1调显示子程序赋次行DB块地址→DPTRA←2调显示子程序调写CGRAM子程序调读CGRAM子程序等待DB块内容结 束 图3-4 主程序流程图
在主程序流程图中,判断累加器A中的数据为1时,把第一个DB块中的字符显示在LM016L的第一行,否则把第二个DB块中的字符显示在LM016L的第二行。显示完DB块内容后,向CGRAM中写入用户自义字符,并把该字符显示在LCD首行末位。 2. 子程序设计
子程序模块设计的主要内容有显示子程序、写命令子程序、写数据子程序、使能脉冲产生子程序、延时子程序、写CGARM子程序和读CGRAM子程序。
显示子程序流程图如图3-5(a)所示。首先判断累加器的内容是否为1,如果为1,把LM016L的DDRAM首行首列地址80H送入累加器A中,调命令写入子程序,把DDRAM的首地址80H通过AT89C51的P0口送给LM016L。如果累加器中的内容不为1,则把LM016L的DDRAM第二行首地址0C0H送入累加器A中,调命令
第3章 HD44780液晶控制器显示系统设计 99
写入子程序,把0C0H通过AT89C51的P0口送给LM016L。即先指定显示数据应显示的位置,然后调用显示数据写入子程序,把DB块内容逐字符送出。
(a)显示子程序 (b)写命令子程序
YA←#80HA=1NA←#0C0H显示地址→P0RS←0清WR写有效调命令写入子程序调使能脉冲子程序调数据写入子程序返 回返 回
显示数据→P0RS←1清WR写有效调使能脉冲子程序返 回EN←1延时EN←0延时返 回 (c)写数据子程序 (d)使能脉冲子程序
图3-5 子程序流程图
写命令子程序模块完成一个命令由单片机写入LCD,本设计主要用来完成LCD显示地址的写入。先把显示地址送入P0,再设RS=0、WR=0,即置LM016L为写命令状态,最后调用使能脉冲产生子程序,即把指定的显示地址送给了LM016L。流程图如图3-5(b)所示。
写数据子程序流程图如图3-5(c)所示。写数据和写命令子程序结构相似,不同的是写数据子程序中送给P0口的是显示数据(字符或数字),LM016L的状态设为RS=1、WR=0。
使能脉冲产生子程序流程图如图3-5(d)所示,主程序中已经对E清零了,所以子程序中置E为1,延时500ns,然后清E,再延时500ns,产生一个占空比为50%的使能脉冲信号。每次写命令或写数据时,必然调用该子程序才能完成相应的功能。
两个延时子程序,一个在主程序中调用,完成LM016L的初始化延时,时间要在15ms以上。另一个在使能脉冲子程序中调用,时间要求大于450ns。流程图略。 3. CGRAM的读写实现
如果想显示一个特殊的、CGROM中不存在的字符,可以向CGRAM中写入自
Proteus显示控制系统设计与实例 100
定义字符,然后再调入DDRAM即可显示。CGRAM共64字节,可存入用户自定义的5×7特殊字符8个或5×10特殊字符4个。CGRAM地址为40H~7FH。40H~47H存放用户的第一个5×7字符,依次类推。而40H中存放自定义字符的第一行编码,47H中存放该字符的第八行编码。如自定义字符“”,5×7(宽×高),可以分8行向CGRAM中写入数据。每行写入一个字节,高3位不用,设为000。LCD中对应显示的点为1,不显示的点为0,则40H~47H中应分别写入的编码为:
0 0 1 0 0B (04H) 0 1 0 1 0B (0AH) 1 0 0 0 1B (11H) 0 1 0 1 0B (0AH) 0 0 1 0 0B (04H) 0 1 0 1 0B (0AH) 0 0 1 0 0B (04H) 0 0 0 0 0B (00H)
从数据的排列可以看出该字符的形状。写CGRAM的具体程序如下: MOV A,#40H ;设CGRAM首字符首行地址 CALL WCOM ;调命令写入子程序 SETB RS ;设RS为1
MOV A,#04H ;字符首行编码值送累加器 CALL WDATA ;调数据写入子程序 MOV A,#0AH ;字符第二行编码值送累加器 CALL WDATA ;调数据写入子程序
MOV A,#11H ;字符第三行编码值送累加器 CALL WDATA ;调数据写入子程序
MOV A,#0AH ;字符第四行编码值送累加器 CALL WDATA ;调数据写入子程序
MOV A,#04H ;字符第五行编码值送累加器 CALL WDATA ;调数据写入子程序
MOV A,#0AH ;字符第六行编码值送累加器 CALL WDATA ;调数据写入子程序
MOV A,#04H ;字符第七行编码值送累加器 CALL WDATA ;调数据写入子程序
MOV A,#00H ;字符第八行编码值送累加器 CALL WDATA ;调数据写入子程序
由于LCD初始化时已设CGRAM地址指针为自动加1方式,所以只需设
共分享92篇相关文档