基于单片机的LCD显示屏
基于单片机的LCD显示屏
一、实验目的
1、利用最小系统的液晶显示电路,编写程序控制显示,输出字符。
2、了解液晶显示的控制原理及方法。
二、设计内容及要求
1、绘制流程图
2、进行软件编程和软模拟
3、进行硬件调试
三、实验原理
1、1602显示屏简介
读的时候,先读上面那列,再读左边那行,如:感叹号!的字母B的ASCII为0x42(前面加0x表示十六进制)。
4、显示地址
11
以尝试采用以下方案解决:
1、数据手册中可能介绍1602内部D0~D7已有上拉,可以使用P0口直接驱动。在Proteus里LM016L内部可能没有,应该人为
加上拉电阻。建议不要使用排阻,使用普通电阻一个一个拉应该可以解决问题;
2、可能碰到不能检测忙信号的问题,尝试使用延时把忙信号拖过去。
7、基本的读写时序图
读写操作时序如图1和2所示:
写操作时序:
读操作时序:
四、电路的设计、安装及调试
1、电路图:
2、源程序:
/******************************************************************** ** 1602显示
********************************************************************* /
LCD_RS EQU P2.4
LCD_RW EQU P2.3
LCD_EN EQU P2.2
;******************************************************************* ORG 0000H
AJMP MAIN
ORG 0030H
;******************************************************************* MAIN:
MOV SP,#60H
ACALL LCD_INIT ;LCD初始化
MAIN1:
ACALL CLR_LCD ;清LCD
MOV A,#90H ;在第一行第17列的位置
ACALL LCD_CMD
MOV DPTR,#LINE1 ;第一行字符串的起始地址送入DPTR。
ACALL WRITE
MOV A,#0D0H ;在第二行第17列的位置
ACALL LCD_CMD
MOV DPTR,#LINE2 ;第二行字符串的起始地址送入DPTR。
ACALL WRITE
MOV R3,#10H ;向左移动16格
LOOPA:
MOV A,#18H ;字符同时左移一格
ACALL LCD_CMD
MOV R5,#03H ;延时375MS
ACALL DELAY125MS
DJNZ R3,LOOPA
ACALL DELAY4 ;延时1.6s
ACALL DELAY4
MOV R4,#02H ;设置闪烁次数
ACALL FLASH ;开始闪烁
AJMP MAIN1
LINE1:
DB " WELCOME YOU TO ",00H
LINE2:
DB "GUIZHOU PROVINCE",00H
;***************************************************************
;LCD初始化设定子程序
;*************************************************************** LCD_INIT:
ACALL DELAY5MS ;延时15MS
ACALL DELAY5MS ;等待LCD电源稳定
ACALL DELAY5MS
MOV A,#38H ;16*2显示,5*7点阵,8位数据
ACALL LCD_CMD_NC ;不进行LCD忙检测
ACALL DELAY5MS
MOV A,#38H ;16*2显示,5*7点阵,8位数据
ACALL LCD_CMD_NC ;不进行LCD忙检测
ACALL DELAY5MS
MOV A,#38H ;16*2显示,5*7点阵,8位数据
ACALL LCD_CMD_NC ;不进行LCD忙检测
ACALL DELAY5MS
MOV 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 CHECKBUSY
LCD_CMD_NC:
CLR LCD_RS
CLR LCD_RW
MOV P0,A
SETB LCD_EN
NOP
NOP
NOP
NOP
CLR LCD_EN
RET
;*************************************************************** ;写显示数据到LCD
;RS=H,RW=L,D0-D7=数据,E=高脉冲
;*************************************************************** LCD_WDATA:
ACALL CHECKBUSY
SETB LCD_RS
CLR LCD_RW
MOV P0,A
SETB LCD_EN
NOP
NOP
NOP
NOP
CLR LCD_EN
RET
;*************************************************************** ;检测LCD控制器忙状态
;读数据
;RS=L,RW=H,E=H,输出:D0-D7=数据
;P0.7=1,LCD忙,等待。P0.7=0,LCD闲,可以进行读写操作。
;*************************************************************** CHECKBUSY:
PUSH ACC
MOV P0,#0FFH
CLR LCD_RS
SETB LCD_RW
SETB LCD_EN
BUSYLOOP:
NOP
JB P0.7,BUSYLOOP
CLR LCD_EN
POP ACC
RET
;*************************************************************** ; 发送字符串子程序
;*************************************************************** WRITE:
PUSH ACC
WRITE1:
CLR A
MOVC A,@A+DPTR
JZ WRITE2
INC DPTR
ACALL LCD_WDATA
JMP WRITE1
WRITE2:
POP ACC
RET
;*************************************************************** ;闪烁子程序
;*************************************************************** FLASH:
MOV A,#08H ;关闭显示
ACALL LCD_CMD
ACALL DELAY4
MOV A,#0CH ;开显示,关闭光标
ACALL LCD_CMD
ACALL DELAY4
DJNZ R4,FLASH
RET
;*************************************************************** ;延时5MS子程序
;LCD初始化使用
;*************************************************************** DELAY5MS:
MOV R6,#10
DL1:
MOV R7,#249
DL2:
DJNZ R7,DL2
DJNZ R6,DL1
RET
;*************************************************************** ;延时125MS子程序
;字符串移动时使用
;*************************************************************** DELAY125MS:
DL3:
MOV R6,#250
DL4:
MOV R7,#249
DL5:
DJNZ R7,DL5
DJNZ R6,DL4
DJNZ R5,DL3
RET
;*************************************************************** ;延时800MS子程序
;闪烁时使用
;*************************************************************** DELAY4:
MOV R5,#40
DL6:
MOV R6,#100
DL7:
MOV R7,#100
DL8:
DJNZ R7,DL8
DJNZ R6,DL7