📄 lcd.asm
字号:
;----------------------------------------
; LCD DISPLAYER
;----------------------------------------
;----------------INSTRUCTION------------
;--命令数据控制:LCD_RS->P1.0
;--读写控制端口:LCD_RW->P1.1
;--选通控制端口:LCD_EN->P1.2
;--信号灯控制口:COMM_STATE->P3.2
;--结束灯控制口:COMM_END->P1.7
;--按键开关端口:KEY->P1.6
;--P0口对应LCD数据口
;--命令缓冲区位于:08H 1位
;--参数长度缓冲区位于:09H,其中高半位为发送长度,低半位为接受长度
;--发送参数缓冲区位于:0A-11H 8位
;--键盘缓冲区位于:12H-13H 2位
;--接受参数缓冲区位于:14H-1BH 8位
;--光标位置存储区位于:1CH 1位
;--KEY_STATE=01H为按键状态
;--SHIFT_STATE=02H为光标移动状态
;--RETURN_STATE=03H为光标返回状态
;LCD_CH=04H
;LCD_CGRAM_ADD=05H,LCD_DDRAM_ADD=06H为地址寄存区
;LCD_RAM_RD=07H为读出数据状态缓冲区
;LCD_RAM_WR=08H为写入数据显示缓冲区
;LCD_DISP_RAM=09H~29H为显示数据存储区
;LCD_BUSY=2AH为检测状态位
;MODE_NU=2BH为
;--定义LCD控制端口
LCD_RS EQU P1.0
LCD_RW EQU P1.1
LCD_EN EQU P1.2
;--定义通讯端口
COMM_STATE EQU P3.2
COMM_END EQU P1.7
KEY EQU P1.6
;--定义变量
KEY_STATE EQU 00H
SHIFT_STATE EQU 01H
RERURN_STATE EQU 02H
;--定义RAM
CURSOR_POS EQU 1CH
; LCD_CH EQU 30H
; LCD_CGRAM_ADD EQU 31H
; LCD_DDRAM_ADD EQU 32H
; LCD_RAM_RD EQU 33H
; LCD_RAM_WR EQU 35H ;33H 数据暂存区,35H~55H为显示数据存储区
LCD_CH EQU 1DH
LCD_CGRAM_ADD EQU 1EH
LCD_DDRAM_ADD EQU 1FH
LCD_RAM_RD EQU 20H
LCD_RAM_WR EQU 21H
;--主程序
ORG 0000H
LJMP MAIN
MAIN:
MOV SP,#30H
CLR COMM_STATE
CLR COMM_END
KEYSCAN:
JB KEY,KEYSCAN
LCALL LCD_INIT ;--LCD初始化
SETB COMM_STATE
MOV DPTR,#EXP_LOGO
LCALL DISPLAY_STRING
LCALL DL1S
CLR COMM_STATE
SETB COMM_END
MOV A,#0
LCALL SET_DDRAM
MOV DPTR,#INIT_LOGO ;---初始化HOST
LCALL DISPLAY_STRING
LCALL DL1S
LJMP MAIN
;----------------SUB---------------------
;--------------LCD初始化------------------
LCD_INIT:
CLR LCD_RS
CLR LCD_RW
LCALL CLR_LCD ;---清屏
MOV P0,#00000110B ;---设置光标移动方向,并指定显示是否移动.(增量方式,不移动)
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
LCALL HIDE_CURSOR ;---设置显示开关(显示),光标开关(关),字符闪烁(关)
MOV P0,#00111000B ;---功能设置.(8位,2行,5*7字体)
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
MOV A,#0 ;---设置DDRAM地址(0)
LCALL SET_DDRAM
RET
;---------------清屏显示------------------
CLR_LCD: ;数据指针清零,所有显示清零
NOP ;清屏
CLR LCD_RS
CLR LCD_RW
MOV P0,#00000001B
SETB LCD_EN
LCALL DL2MS
CLR LCD_EN
LCALL DL2MS
RET
;-------------设置光标返回-------------
SET_CURSOR_RETURN: ;数据指针清零,光标退回初始状态
NOP
CLR LCD_RS
CLR LCD_RW
MOV P0,#00000010B
SETB LCD_EN
LCALL DL2MS
CLR LCD_EN
LCALL DL2MS
RET
;--------------设置输入方式----------------
SET_LCD_IN: ;当读或写一个字符后,地址指针加一且光标加一,整屏显示不移动
NOP
CLR LCD_RS
CLR LCD_RW
MOV P0,#00000110B
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
LCALL DL40US
RET
SET_INPUT_MODE1:
NOP
CLR LCD_RS
CLR LCD_RW
MOV P0,#00000110B
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
LCALL DL40US
RET
SET_INPUT_MODE2:
NOP
CLR LCD_RS
CLR LCD_RW
MOV P0,#00000111B
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
LCALL DL40US
RET
;-------------设置显示开关---------------
SET_LCD_DISP: ;开显示,不显示光标,光标不显示
NOP
CLR LCD_RS
CLR LCD_RW
MOV P0,#00001100B
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
LCALL DL40US
RET
SET_DISP_CLOSE:
NOP
CLR LCD_RS
CLR LCD_RW
MOV P0,#00001000B
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
LCALL DL40US
RET
SET_LCD_DISP1:
NOP
CLR LCD_RS
CLR LCD_RW
MOV P0,#00001111B
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
LCALL DL40US
RET
SET_DISP_ONOFF1: ;开显示,不显示光标,字符光标不显示
NOP
CLR LCD_RS
CLR LCD_RW
MOV P0,#00001100B
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
LCALL DL40US
RET
SET_SHOW_CURSOR: ;开显示,光标关,字符光标闪
NOP
CLR LCD_RS
CLR LCD_RW
MOV P0,#00001101B
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
LCALL DL40US
RET
SET_HIDE_CURSOR: ;开显示,光标关,字符光标不闪
NOP
CLR LCD_RS
CLR LCD_RW
MOV P0,#00001100B
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
LCALL DL40US
RET
SET_CURSOR_POS:
MOV A,CURSOR_POS
MOV DPTR,#CURSORTAB
MOVC A,@A+DPTR
LCALL SET_DDRAM_ADD
RET
HIDE_CURSOR:
MOV P0,#00001100B
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
RET
;------------设置移位方式-----------
SET_SHIFT_MODE: ;光标移位,左移
NOP
CLR LCD_RS
CLR LCD_RW
MOV P0,#10H ;00010000B
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
LCALL DL40US
RET
;------------功能设置---------------
SET_FUNC_SETTING1:
NOP
CLR LCD_RS
CLR LCD_RW
MOV P0,#00111000B;---DL=8位,N=2行,F=5*7
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
LCALL DL40US
RET
SET_FUNC_SETTING2: ;F=5*10
NOP
CLR LCD_RS
CLR LCD_RW
MOV P0,#00111100B
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
LCALL DL40US
RET
;--------------CGRAM地址设置----------------
SET_CGRAM_ADD: ;设置CGRAM地址,完发送接收数据
NOP
CLR LCD_RS
CLR LCD_RW
MOV A,LCD_CGRAM_ADD
ANL A,#3FH ;00111111B
ORL A,#40H ;01000000B
MOV P0,A
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
LCALL DL40US
RET
;-------------DDRAM地址设置-----------------
SET_DDRAM_ADD:
MOV A,#0
ORL A,#80H
MOV P0,A
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
RET
SET_DDRAM_ADD1:
NOP
CLR LCD_RS
NOP
CLR LCD_RW
NOP
MOV A,LCD_DDRAM_ADD
ANL A,#7FH ;01111111B
ORL A,#80H ;10000000B
MOV P0,A
SETB LCD_EN
LCALL DL80US
CLR LCD_EN
LCALL DL80US
RET
;---设置DDRAM字程序,参数为A(地址)
SET_DDRAM:
CLR LCD_RS
ORL A,#80H
MOV P0,A
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
RET
;------------忙标志/读地址计数器-------------
SET_LCD_CHECK: ;读命令
NOP
MOV LCD_CH,#00H
CLR LCD_RS
SETB LCD_RW
SETB LCD_EN
NOP
NOP
MOV A,P0
ANL A,#80H
JZ FREE
MOV LCD_CH,#0FFH
FREE:
CLR LCD_EN
RET
;-------------从D口读数据----------------
SET_LCD_READ:
NOP
SETB LCD_RS
SETB LCD_RW
SETB LCD_EN
LCALL DL40US
MOV A,P0
MOV LCD_RAM_RD,A
CLR LCD_EN
LCALL DL40US
RET
;-------------从D口写数据----------------
SET_LCD_WRITE:
NOP
SETB LCD_RS
NOP
CLR LCD_RW
NOP
MOV A,LCD_RAM_WR
NOP
MOV P0,A
SETB LCD_EN
NOP
LCALL DL80US
CLR LCD_EN
NOP
LCALL DL80US
RET
;----------显示字符串------------------
;---显示字符串,参数是首地址(DPTR),一行16字
DISPLAY_STRING:
MOV R5,#0
DISPLAY_STRING_1:
CLR A ;LCD显示地址初值A = 00H
MOVC A,@A+DPTR ;---判断A是否为'#',如果不是,则跳转,如果是,退出子程序
CJNE A,#23H,DISPLAY_STRING_2
CLR LCD_RS
RET
DISPLAY_STRING_2:
SETB LCD_RS
MOV P0,A
SETB LCD_EN
LCALL DL40US
CLR LCD_EN
INC DPTR
INC R5
CJNE R5,#16,DISPLAY_STRING_1
MOV A,#40H ;---第二行显示数据
CLR LCD_RS
LCALL SET_DDRAM
SJMP DISPLAY_STRING_1
;--------------DISP_RAM------------------
;R1地址增量,R0为显示区地址指针
;----------------------------------------
RAM:
MOV R1,#0H ;DISPLAY RAM
MOV R0,#35H ;显示缓冲区首地址指针
NOP
RAM_ALL:
MOV A,R1
MOVC A,@A+DPTR ;DPTR=?
CJNE A,#23H,RDIS_NEND ;23H->MODE_NU
SJMP RAM_NEND
RDIS_NEND:
MOV @R0,A
INC R0
INC R1
CJNE R1,#20H,RAM_ALL
SJMP RALL_END
RDIS_END:
CJNE R1,#20H,RAM_NEND
SJMP RALL_END
RAM_NEND:
MOV @R0,#8FH
INC R1
INC R0
SJMP RDIS_END
RALL_END:
RET
;--------------RAM_WR--------------------
;将35H~54H所有显示数据写如LCD显示RAM中
;R3为地址增量,R0为显示区地址指针
;----------------------------------------
RAM_WR:
MOV LCD_DDRAM_ADD,#0H ;INPUT MCS51 RAM INTO ALL OF THE LCD RAM
LCALL SET_DDRAM_ADD ;发ADD_DD地址字符命令
NOP
MOV R3,#0H
MOV R0,#35H
RAM_WR1:
NOP
MOV LCD_RAM_WR,@R0 ;35H~54H显示数据区数据,通过显示缓冲区写入LCD显示数据区
LCALL SET_LCD_WRITE ;
INC R3
INC R0
CJNE R3,#10H,RAM_WR1 ;16bytes
NOP
;第二行显示数据
MOV LCD_DDRAM_ADD,#40H ;第二行起始地址40H
LCALL SET_DDRAM_ADD
NOP
MOV R3,#0H
RAM_WR2:
NOP
MOV LCD_RAM_WR,@R0
LCALL SET_LCD_WRITE
INC R3
INC R0
CJNE R3,#10H,RAM_WR2
NOP
RET
;---------------DELAY----------
;------------------------------
;-----------10US---------------
DL10US:
MOV R7,#5
DL10US1:
DJNZ R7,DL10US1
RET
;-----------40US---------------
DL40US:
MOV R7,#20
DL40US1:
DJNZ R7,DL40US1
RET
;-----------80US--------------
DL80US:
MOV R7,#40
DL80US1:
DJNZ R7,DL80US1
RET
;-----------2MS---------------
DL2MS:
MOV R7,#100
DL2MS1:
MOV R6,#10
DL2MS2:
DJNZ R6,DL2MS2
DJNZ R7,DL2MS1
RET
;------------10MS------------
DL10MS:
MOV R7,#100
DL10MS1:
MOV R6,#50
DL10MS2:
DJNZ R6,DL10MS2
DJNZ R7,DL10MS1
RET
;------------20MS------------
DL20MS:
MOV R7,#100
DL20MS1:
MOV R6,#100
DL20MS2:
DJNZ R6,DL20MS2
DJNZ R7,DL20MS1
RET
;------------50MS------------
DL50MS:
MOV R7,#100
DL50MS1:
MOV R6,#250
DL50MS2:
DJNZ R6,DL50MS2
DJNZ R7,DL50MS1
RET
;-------------1S------------
DL1S:
MOV R7,#5
MOV R6,#250
MOV R5,#250
DJNZ R5,$
DJNZ R6,$-4
DJNZ R7,$-8
RET
;-------------3S------------
DL3S:
MOV R7,#50
DL3S1:
MOV R6,#250
DL3S2:
MOV R5,#60
DL3S3:
DJNZ R5,DL3S3
DJNZ R6,DL3S2
DJNZ R7,DL3S1
RET
;------------显示数据表----------
EXP_LOGO: DB '== LCD DISPLAYER ==#'
INIT_LOGO: DB 'Complete Initializing Lcd #'
CURSORTAB: DB 5,6,12,13,40H,41H,42H,43H,44H,45H,46H,47H,48H,49H,4AH,4BH,4CH,4DH,4EH,4FH
DISP1: DB 'HELLO,HOW DO YOU DO!#' ;#字符ASC||码值为#23H
DISP2: DB 'HELLO!!#'
DISP3: DB 'HELLO@@#'
;------------显示数据表---------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -