当前位置:文档之家› 基于单片机的LCD显示屏

基于单片机的LCD显示屏

基于单片机的LCD显示屏一、实验目的1、利用最小系统的液晶显示电路,编写程序控制显示,输出字符。

2、了解液晶显示的控制原理及方法。

二、设计内容及要求1、绘制流程图2、进行软件编程和软模拟3、进行硬件调试三、实验原理1、1602显示屏简介工业字符型液晶,能够同时显示16x02即32个字符。

(16列2行)2、管脚功能1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,其中:引脚符号功能说明1 VSS 一般接地2 VDD 接电源(+5V)3 V0 液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。

4 RS RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。

5 R/W R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。

6 E E(或EN)端为使能(enable)端,下降沿使能。

7 DB0 低4位三态、双向数据总线 0位(最低位)8 DB1 低4位三态、双向数据总线 1位9 DB2 低4位三态、双向数据总线 2位10 DB3 低4位三态、双向数据总线 3位11 DB4 高4位三态、双向数据总线 4位12 DB5 高4位三态、双向数据总线 5位13 DB6 高4位三态、双向数据总线 6位14 DB7 高4位三态、双向数据总线 7位(最高位)(也是busy flag)15 BLA 背光电源正极16 BLK 背光电源负极寄存器选择控制表RS R/W 操作说明0 0 写入指令寄存器(清除屏等)0 1 读busy flag(DB7),以及读取位址计数器(DB0~DB6)值1 0 写入数据寄存器(显示各字型等)1 1 从数据寄存器读取数据注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.busy flag(DB7):在此位为被清除为0时,LCD将无法再处理其他的指令要求。

3、字符集1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如'A’。

以下是1602的16进制ASCII码表:读的时候,先读上面那列,再读左边那行,如:感叹号!的ASCII为0x21,字母B的ASCII为0x42(前面加0x表示十六进制)。

4、显示地址1 2 3 4 5 6 7 8 9 111121314151600000000000000000 H 1H2H3H4H5H6H7H8H9HAHBHCHDHEHFH4 0 H41H42H43H44H45H46H47H48H49H4AH4BH4CH4DH4EH4FH 5、指令集1602通过D0~D7的8位数据端传输数据和指令。

显示模式设置: (初始化)0011 1000 [0x38] 设置16×2显示,5×7点阵,8位数据接口;显示开关及光标设置:(初始化)0000 1DCB D显示(1有效)、C光标显示(1有效)、B光标闪烁(1有效) 0000 01NS N=1(读或写一个字符后地址指针加1 &光标加1),N=0(读或写一个字符后地址指针减1 &光标减1),S=1 且 N=1 (当写一个字符后,整屏显示左移)s=0 当写一个字符后,整屏显示不移动数据指针设置:数据首地址为80H,所以数据地址为80H+地址码(0-27H,40-67H)其他设置:01H(显示清屏,数据指针=0,所有显示=0);02H(显示回车,数据指针=0)。

通常推荐的初始化过程:延时15ms写指令38H延时5ms写指令38H延时5ms写指令38H延时5ms(以上都不检测忙信号)(以下都要检测忙信号)写指令38H写指令08H 关闭显示写指令01H 显示清屏写指令06H 光标移动设置写指令0cH 显示开及光标设置完毕6、Proteus仿真使用Proteus仿真1602--即LM016L--依照数据手册说明可能遇到困难,可以尝试采用以下方案解决:1、数据手册中可能介绍1602内部D0~D7已有上拉,可以使用P0口直接驱动。

在Proteus里LM016L内部可能没有,应该人为加上拉电阻。

建议不要使用排阻,使用普通电阻一个一个拉应该可以解决问题;2、可能碰到不能检测忙信号的问题,尝试使用延时把忙信号拖过去。

7、基本的读写时序图读写操作时序如图1和2所示:写操作时序:读操作时序:四、电路的设计、安装及调试1、电路图:2、源程序:/******************************************************************** ** 1602显示********************************************************************* /LCD_RS EQU P2.4LCD_RW EQU P2.3LCD_EN EQU P2.2;******************************************************************* ORG 0000HAJMP MAINORG 0030H;******************************************************************* MAIN:MOV SP,#60HACALL LCD_INIT ;LCD初始化MAIN1:ACALL CLR_LCD ;清LCDMOV A,#90H ;在第一行第17列的位置ACALL LCD_CMDMOV DPTR,#LINE1 ;第一行字符串的起始地址送入DPTR。

ACALL WRITEMOV A,#0D0H ;在第二行第17列的位置ACALL LCD_CMDMOV DPTR,#LINE2 ;第二行字符串的起始地址送入DPTR。

ACALL WRITEMOV R3,#10H ;向左移动16格LOOPA:MOV A,#18H ;字符同时左移一格ACALL LCD_CMDMOV R5,#03H ;延时375MSACALL DELAY125MSDJNZ R3,LOOPAACALL DELAY4 ;延时1.6sACALL DELAY4MOV R4,#02H ;设置闪烁次数ACALL FLASH ;开始闪烁AJMP MAIN1LINE1:DB " WELCOME YOU TO ",00HLINE2:DB "GUIZHOU PROVINCE",00H;***************************************************************;LCD初始化设定子程序;*************************************************************** LCD_INIT:ACALL DELAY5MS ;延时15MSACALL DELAY5MS ;等待LCD电源稳定ACALL DELAY5MSMOV A,#38H ;16*2显示,5*7点阵,8位数据ACALL LCD_CMD_NC ;不进行LCD忙检测ACALL DELAY5MSMOV A,#38H ;16*2显示,5*7点阵,8位数据ACALL LCD_CMD_NC ;不进行LCD忙检测ACALL DELAY5MSMOV A,#38H ;16*2显示,5*7点阵,8位数据ACALL LCD_CMD_NC ;不进行LCD忙检测ACALL DELAY5MSMOV A,#08H ;显示关ACALL LCD_CMD ;进行LCD忙检测MOV A,#01H ;清除屏幕ACALL LCD_CMD ;进行LCD忙检测MOV A,#0CH ;显示开,关光标ACALL LCD_CMD ;进行LCD忙检测RET;*************************************************************** ;清LCD子程序;*************************************************************** CLR_LCD:MOV A,#01H ;清除屏幕ACALL LCD_CMD ;进行LCD忙检测RET;*************************************************************** ;写指令数据到LCD;RS=L,RW=L,D0-D7=指令码,E=高脉冲;*************************************************************** LCD_CMD:CALL CHECKBUSYLCD_CMD_NC:CLR LCD_RSCLR LCD_RWMOV P0,ASETB LCD_ENNOPNOPNOPNOPCLR LCD_ENRET;*************************************************************** ;写显示数据到LCD;RS=H,RW=L,D0-D7=数据,E=高脉冲;*************************************************************** LCD_WDATA:ACALL CHECKBUSYSETB LCD_RSCLR LCD_RWMOV P0,ASETB LCD_ENNOPNOPNOPNOPCLR LCD_ENRET;*************************************************************** ;检测LCD控制器忙状态;读数据;RS=L,RW=H,E=H,输出:D0-D7=数据;P0.7=1,LCD忙,等待。

P0.7=0,LCD闲,可以进行读写操作。

;*************************************************************** CHECKBUSY:PUSH ACCMOV P0,#0FFHCLR LCD_RSSETB LCD_RWSETB LCD_ENBUSYLOOP:NOPJB P0.7,BUSYLOOPCLR LCD_ENPOP ACCRET;*************************************************************** ; 发送字符串子程序;*************************************************************** WRITE:PUSH ACCWRITE1:CLR AMOVC A,@A+DPTRJZ WRITE2INC DPTRACALL LCD_WDATAJMP WRITE1WRITE2:POP ACCRET;*************************************************************** ;闪烁子程序;*************************************************************** FLASH:MOV A,#08H ;关闭显示ACALL LCD_CMDACALL DELAY4MOV A,#0CH ;开显示,关闭光标ACALL LCD_CMDACALL DELAY4DJNZ R4,FLASHRET;*************************************************************** ;延时5MS子程序;LCD初始化使用;*************************************************************** DELAY5MS:MOV R6,#10DL1:MOV R7,#249DL2:DJNZ R7,DL2DJNZ R6,DL1RET;*************************************************************** ;延时125MS子程序;字符串移动时使用;*************************************************************** DELAY125MS:DL3:MOV R6,#250DL4:MOV R7,#249DL5:DJNZ R7,DL5DJNZ R6,DL4DJNZ R5,DL3RET;*************************************************************** ;延时800MS子程序;闪烁时使用;*************************************************************** DELAY4:MOV R5,#40DL6:MOV R6,#100DL7:MOV R7,#100DL8:DJNZ R7,DL8DJNZ R6,DL7DJNZ R5,DL6RET;*************************************************************** END五、实验研究与参考当今是一个信息化的时代,信息的重要性是不言而喻的,获取手段显得尤其重要。

相关主题