📄 lcd1602-4bit.asm
字号:
;********************************************************************
;* *
;* ME500单片机开发系统演示程序 - LCD1602 4位数据线控制方式 *
;* *
;* LCD1602显示 *
;* *
;* 版本: V1.0 (2007/01/03) *
;* 作者: gguoqing (Email: gguoqing@willar.com) *
;* 网站: www.willar.com(伟纳电子) www.mcusj.com(伟纳单片机世界) *
;* 邮箱: support@willar.com *
;* *
;*【版权】Copyright(C)伟纳电子 www.willar.com All Rights Reserved *
;*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! *
;* *
;********************************************************************
;* *
;* 描述: *
;* LCD1602可以分为8位和4位控制方式,8位控制方式是用D0-D7数据线 *
;* 来传送控制命令及数据。4位控制方式是用D4-D7数据线来传送控制命令 *
;* 及数据。使用4位数据线做控制时,需要分两次来传送,先送出高4位数 *
;* 据,再送出低4位数据。可以节省单片机的4根端口线。 *
;* *
;********************************************************************
HDATA EQU 40H
LDATA EQU 41H
LCD_RS EQU P2.0
LCD_RW EQU P2.1
LCD_EN EQU P2.2
;**********************************************************
ORG 0000H
LJMP MAIN
ORG 0030H
;**********************************************************
MAIN:
MOV SP,#70H
ACALL LCD_INIT
MOV A,#80H ;显示在第一行
MOV DPTR,#CHAR1
ACALL WR_STRING ;显示 WELCOME TO
MOV A,#0C0H ;显示在第二行
ACALL LCD_CMD
MOV DPTR,#CHAR2 ;显示 WWW.WILLAR.COM
ACALL WR_STRING
JMP $
RET
;**********************************************************
;写指令数据到LCD
;RS=L,RW=L,D0-D7=指令码,E=高脉冲
;**********************************************************
LCD_CMD:
CALL CHECKBUSY
LCD_CMD_NC:
CLR LCD_RS
CLR LCD_RW
CALL CHANGE
MOV P0,HDATA ;发送高四位
SETB LCD_EN
CALL DELAYNOP
CLR LCD_EN
CALL DELAYNOP
MOV P0,LDATA ;发送低四位
SETB LCD_EN
CALL DELAYNOP
CLR LCD_EN
CALL DELAYNOP
RET
;***************************************************************
;写显示数据到LCD
;RS=H,RW=L,D0-D7=数据,E=高脉冲
;***************************************************************
LCD_WDATA:
CALL CHECKBUSY
SETB LCD_RS
CLR LCD_RW
CALL CHANGE
MOV P0,HDATA ;发送高四位
SETB LCD_EN
CALL DELAYNOP
CLR LCD_EN
CALL DELAYNOP
MOV P0,LDATA ;发送低四位
SETB LCD_EN
CALL DELAYNOP
CLR LCD_EN
CALL DELAYNOP
RET
;***************************************************************
; 检测LCD控制器忙状态
; 读数据
; RS=L,RW=H,E=H,输出:D0-D7=数据
;***************************************************************
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
;***************************************************************
; 数据分离子程序
;***************************************************************
CHANGE:
MOV LDATA,A
ANL A,#0F0H
MOV HDATA,A ;得到高4位数据
MOV A,LDATA
SWAP A
ANL A,#0F0H
MOV LDATA,A ;得到低4位数据
RET
;***************************************************************
; 发送字符串子程序
;***************************************************************
WR_STRING:
MOV R0,#16
WR_S0:
CLR A
MOVC A,@A+DPTR
INC DPTR
CALL LCD_WDATA
CALL DELAY ;加延时形成滚动效果
DJNZ R0,WR_S0
RET
;***************************************************************
;LCD初始化设定子程序
;***************************************************************
LCD_INIT:
ACALL DELAY5MS ;延时15MS
ACALL DELAY5MS ;等待LCD电源稳定
ACALL DELAY5MS
MOV A,#28H ;16*2显示,5*7点阵,4位数据
ACALL LCD_CMD_NC ;不进行LCD忙检测
ACALL DELAY5MS
MOV A,#28H ;16*2显示,5*7点阵,4位数据
ACALL LCD_CMD_NC ;不进行LCD忙检测
ACALL DELAY5MS
MOV A,#28H ;16*2显示,5*7点阵,4位数据
ACALL LCD_CMD_NC ;不进行LCD忙检测
ACALL DELAY5MS
MOV A,#01H ;清除屏幕
ACALL LCD_CMD ;进行LCD忙检测
MOV A,#06H ;移动光标
ACALL LCD_CMD ;进行LCD忙检测
MOV A,#0CH ;显示开,关光标
ACALL LCD_CMD ;进行LCD忙检测
ACALL DELAY5MS ;延时15ms
ACALL DELAY5MS
ACALL DELAY5MS
RET
;***************************************************************
; 延时5MS子程序
; LCD初始化使用
;***************************************************************
DELAY5MS:
MOV R6,#10
DEL1:
MOV R7,#249
DEL2:
DJNZ R7,DEL2
DJNZ R6,DEL1
RET
;***************************************************************
; 延时120MS子程序
;***************************************************************
DELAY:
MOV R7,#240
DEL3:
MOV R6,#250
DEL4:
DJNZ R6,DEL4
DJNZ R7,DEL3
RET
;***************************************************************
; 延时5US子程序
;***************************************************************
DELAYNOP:
NOP
NOP
NOP
NOP
NOP
RET
;***************************************************************
CHAR1:
DB " WELCOME TO "
CHAR2:
DB " WWW.WILLAR.COM "
;***************************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -