📄 ex3-8.asm
字号:
;--------------程序信息-----------------
;文件名 : ex3-8.asm
;版本 : 1.0
;作者 :
;修改时间 :
;--------------程序说明------------------
;CHAP 3.8 简单液晶显示实例
;-----------常量和变量声明---------------
RS EQU P3.0; 控制位宏定义,数据地址选择位
RW EQU P3.1; 数据命令选择位
E EQU P3.2; LCD使能端
LCDP EQU P1; LCD数据端口
BF EQU LCDP.7; LCD忙标志位
LINEF BIT 00H; 换行标志位
;--------------预定义--------------------
ORG 0000H
LJMP START
;------------中断入口地址分配------------
;ORG 0003H
;LJMP INT0PRG
;ORG 000BH
;LJMP INT1PRG
;ORG 0013H;
;LJMP
;ORG 0030H
START:
INIT: CALL LCDINIT;LCD INIT 液晶显示器初始化
;--------------初始化子程序--------------
MOV SP,60H;
;--------------主程序--------------------
MAIN:
MOV LCDP,#01H; 开屏幕
CALL WINSTR;
MOV R0,#00H; 初始化寄存器
MOV R1,#00H;
MAIN1: MOV LCDP,R0; 写入数据
CALL WDATA; 时序使能
CALL DELAY600MS; 显示延时
;CALL NEXTC; 显示下一个字符
INC R1;
INC R0;
CJNE R1,#0FH,MAIN2; 判断是否行尾
MOV R1,#00H;
CALL CHGLINE; 换行
MAIN2:
CJNE R0,#00H,MAIN1; 判断是否LCD结尾
LJMP MAIN
;----------------子程序------------------
;---------------------------------
; LCM显示初始化程序
;---------------------------------
LCDINIT:
MOV LCDP,#01H; 液晶开显示
CALL WINSTR;
MOV LCDP,#06H; 清屏
CALL WINSTR;
MOV LCDP,#38H; 设置行地址
CALL WINSTR;
MOV LCDP,#80H;
CALL WINSTR;
MOV LCDP,#0FH; 设置光标格式
CALL WINSTR;
SETB LINEF;
RET;
;---------------------------------
; 命令数据写入时序等子程序部分
;---------------------------------
ISBF: ;LCD内部DDRAM读写忙判断子程序
ISBF1:CLR RS; 设定RS,RW读写和数据命令方式
SETB RW;
CLR E;
CALL DELAYLCD; 时序等待延时
SETB E; LCD使能
JB BF,ISBF1; 忙标志位判断
CLR RW;
RET;
;写入命令时序子程序
WINSTR:CLR RS ;设定RS,RW读写和数据命令方式
CLR RW
CLR E
ACALL DELAYLCD ;时序等待延时
SETB E ;LCD使能
RET
WDATA:CLR RW ;写入数据令时序子程序
SETB RS; 设定RS,RW读写和数据命令方式
CLR E;
CALL DELAYLCD; 时序等待延时
SETB E; LCD使能
CLR RS;
RET;
RADDR: CLR RS; 读数据时序子程序
SETB RW; 设定RS,RW读写和数据命令方式
CLR E;
CALL DELAYLCD; 时序延时
SETB E; LCD使能
CLR RW;
RET;
CHGLINE: JB LINEF,CHG1; LCD行末换行子程序
JMP CHG2; 如果是第二行末尾,则跳到第一行首,否则,跳到第一行首
CHG1: MOV LCDP,#0C0H; 跳到第一行首
CALL WINSTR; 写入命令字
CLR LINEF; 清除标志位
JMP CHGEND;
CHG2: MOV LCDP,#80H; 跳到第二行首
CALL WINSTR; 写入命令字
SETB LINEF; 设置标志位
CHGEND:
RET;
NEXTC: CALL RADDR; 字符顺序写入子程序
MOV A,LCDP;
ANL A,#7FH;;0111 1111;
CJNE A,#0FH,NEXTC1; 判断是否行尾,是,则跳转到下一行
CLR LINEF; 是,则清除标志位
MOV LCDP,#0C0H;
CALL WINSTR;
JMP NEXTCEND;
NEXTC1: CJNE A,#4FH,NEXTC0; 判断是第一行未或者第二行尾
SETB LINEF; 设置标志位
MOV LCDP,#080H; 写入命令
CALL WINSTR; 写入命令时序字
JMP NEXTCEND;
NEXTC0: ;INC A;
ADD A,#80H;
MOV LCDP,A;
CALL WINSTR;
NEXTCEND:
RET;
;--------------中断子程序----------------
;---------------延时子程序---------------
DELAYLCD: MOV R7,#02H;
DELAYLCD1: MOV R6,#255;
DELAYLCD2: DJNZ R6,DELAYLCD2
DJNZ R7,DELAYLCD1
RET
DELAY600MS: MOV R5,#04H;
DELAY00: MOV R6,#00F4H;
DELAY01: MOV R7,#0FFH;
DELAY02: DJNZ R7,DELAY02;
DJNZ R6,DELAY01;
DJNZ R5,DELAY00;
RET;
;---------------注意事项-----------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -