📄 lcd.asm
字号:
; LCD Display Driver Demo.
; Timing code assumes 6MHz Clock
;
;***********************************************
;指定LCD地址 LCD Registers addresses
;LCD_CMD_WR equ 0 ;写命令寄存器
;LCD_DATA_WR equ 1 ;写数据寄存器
;LCD_BUSY_RD equ 2 ;读忙标志及RAM地址
;LCD_DATA_RD equ 3 ;读RAM数据
;指定LCD命令 LCD Commands
;LCD_CLS equ 1 ;清屏
;LCD_HOME equ 2 ;光标归位
;LCD_SETMODE equ 4 ;输入模式
;LCD_SETVISIBLE equ 8 ;显示致能、禁能
;LCD_SHIFT equ 16 ;显示、光标移位
;LCD_SETFUNCTION equ 32 ;功能设定
;LCD_SETCGADDR equ 64 ;字符器RAM地址设定
;LCD_SETDDADDR equ 128 ;显示数据存储器RAM地址设定
ORG 00H
AJMP MAIN
ORG 30H
;主程序
MAIN:
MOV SP,#5FH ;栈指针
ACALL INIT ;LCD初始化
ACALL FIRST ;第一行显示位置
MOV DPTR,#TABLE1;取要显示字符
ACALL DISPLAY ;显示
ACALL SECOND ;第二行显示位置
MOV DPTR,#TABLE2;取要显示字符
ACALL DISPLAY ;显示
JMP main ;返回
;初始化子程序
INIT:
ACALL DELAY;
MOV A,#39H ;复位数据
ACALL WRCOM ;写命令寄存器
MOV A,#39H ;设定数据长度为8位
ACALL WRCOM ;写命令寄存器
;
MOV A,#08H ;设定LCD不显示光标,不闪烁字符
ACALL WRCOM ;写命令寄存器
;
MOV A,#01H ;清屏
ACALL WRCOM ;
;
MOV A,#06H ;设定输入模式
ACALL WRCOM ;
;
MOV A,#0CH ;显示致能,不显示光标
ACALL WRCOM ;
RET
;显示子程序
DISPLAY:
MOV R1,#00H ;取第一个字符
NEXT:
MOV A,R1 ;
MOVC A,@A+DPTR ;
CJNE A,#23H,DSP;判断是否显示完全部字符(“#”对应代码是0010 0011B=23H)
RET
DSP:
ACALL WRDATA ;显示
INC R1 ;下一字符
AJMP NEXT ;
FIRST:
MOV A,#10000000B;第一行显示位置
ACALL WRCOM ;
RET
;
SECOND:
MOV A,#11000000B;第一行显示位置
ACALL WRCOM;
RET
;写命令寄存器
WRCOM:
ACALL BUSY;
MOV P2,#11111000B;
NOP
SETB P2.2;
MOV P0,A;
NOP
CLR P2.2;
CALL DELAY
RET
;写数据寄存器
WRDATA:
ACALL BUSY;
MOV P2,#11111001B;
NOP
SETB P2.2;
MOV P0,A;
NOP
CLR P2.2;
CALL DELAY
RET
;忙判断
BUSY:
PUSH ACC;
WAIT:
MOV P2,#11111010B;
NOP
SETB P2.2;
MOV A,P0;
JB ACC.7,WAIT;
CLR P2.2;
POP ACC
RET
;延时
DELAY:
MOV R6,#80H
DL1: MOV R7,#80H
DJNZ R7,$
DJNZ R6,DL1
RET
;显示字符
TABLE1: DB " ABCDEFG HIGKLMN ";
DB "#";
TABLE2: DB " OPQ RST UVW XYZ ";
DB "#"
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -