📄 7_4_2.asm
字号:
COM EQU 20H ;指令存储器地址
DAT EQU 21H ;数据存储器地址
CW_ADD EQU 0000H ;指令口写地址
CR_ADD EQU 0002H ;指令口读地址
DW_ADD EQU 0001H ;数据口写地址
DR_ADD EQU 0003H ;数据口读地址
HOUR EQU 30H ;存放小时变量
MIN EQU 31H ;存放分钟变量
SEC EQU 32H ;存放秒钟变量
TEMP EQU 33H ;存放10ms计数值
ORG 0000H
LJMP MAIN
ORG 000BH;定时器T0中断入口地址
LJMP T0_INT
ORG 0010H
MAIN: MOV SP,#60H;堆栈指针指向60H
LCALL DELAY;等待电压上升
LCALL INIT_LCD;;调用初始化子程序
;LCD第一行显示控制
MOV COM,#80H;写入显示起始地址
LCALL WR_COM;调用写指令子程序
MOV DPTR,#LINE1;字符串地址送入DPTR
MOV R0,#0AH;字符串的字符数
LCALL DISP;调用查表子程序
;显示年、月、日
LCALL CGR
MOV COM,#84H;'年'的显示地址
LCALL WR_COM
MOV DAT,#00H;CGRAM内第0号图形
LCALL WR_DAT
MOV COM,#87H;'月'的显示地址
LCALL WR_COM
MOV DAT,#01H;CGRAM内第1号图形
LCALL WR_DAT
MOV COM,#8AH;'日'的显示地址
LCALL WR_COM
MOV DAT,#02H;CGRAM内第2号图形
LCALL WR_DAT
;LCD第二行显示控制
MOV HOUR,#10;设置初始时间
MOV MIN,#0
MOV SEC,#0
LCALL SH_TIME;分别将各位时间显示
MOV TMOD,#01H;定时器T0模式1
MOV IE,#82H;开通中断
MOV TL0,#0E0H
MOV TH0,#0D8H;装入初值
SETB TR0;开启定时器0
SJMP $;等待定时器中断
T0_INT:PUSH ACC;压入栈保护
MOV TL0,#0E0H
MOV TH0,#0D8H;重加载
INC TEMP
MOV A,TEMP;10ms计数值加1
CJNE A,#100,T0END
MOV TEMP,#0
INC SEC;秒加1
LCALL SH_TIME;调用时间显示程序
MOV A,SEC
CJNE A,#60,T0END
MOV SEC,#0
INC MIN;分加1
LCALL SH_TIME;调用时间显示程序
MOV A,MIN
CJNE A,#60,T0END
MOV MIN,#0
INC HOUR;时加1
LCALL SH_TIME;调用时间显示程序
MOV A,HOUR
CJNE A,#24,T0END
MOV TEMP,#0
MOV SEC,#0;秒\分\时单元清0
MOV MIN,#0
MOV HOUR,#0
LCALL SH_TIME;调用时间显示程序
T0END:POP ACC;出栈
RETI;中断程序返回
INIT_LCD:
MOV A,#30H ;工作方式设置指令代码
MOV DPTR,#CW_ADD ;指令口地址设置
MOV R2,#03H ;循环量=3
INIT1:MOVX @DPTR,A ;写指令代码
LCALL DELAY
DJNZ R2,INIT1
MOV A,#38H ;设置8位总线工作方式两行显示
MOVX @DPTR,A
MOV COM,#01H ;清屏
LCALL WR_COM
MOV COM,#06H ;设置输入方式
LCALL WR_COM
MOV COM,#0FH ;设置显示方式
LCALL WR_COM
RET
WR_COM:
PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#CR_ADD
COM1:MOVX A,@DPTR
JB ACC.7,COM1
MOV A,COM
MOV DPTR,#CW_ADD
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
RET
WR_DAT:
PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#CR_ADD
DAT1:MOVX A,@DPTR
JB ACC.7,DAT1
MOV A,DAT
MOV DPTR,#DW_ADD
MOVX @DPTR,A
POP ACC
POP DPL
POP DPH
RET
CGR:
MOV COM,#40H;指定CGRAM起始地址
LCALL WR_COM;将指令写入LCD
MOV R2,#18H;图形数据长度为24个字节
MOV DPTR,#TAB;存代码表
MOV R3,#00H;使指针指到表中第一个码
CG1:MOV A,R3;A为0
MOVC A,@A+DPTR;读取表代码
MOV DAT,A
LCALL WR_DAT;调用写入数据指令
INC R3;R3值加1
DJNZ R2,CG1;判断是否将代码读取完
RET
TAB:
DB 08H,0FH,12H,0FH
DB 0AH,1FH,02H,02H;年的代码
DB 0FH,09H,0FH,09H
DB 0FH,09H,0BH,11H;月的代码
DB 00H,0FH,09H,0FH
DB 09H,0FH,09H,00H;日的代码
SH_TIME:
MOV A,HOUR;加载小时数据
MOV R6,#0;设置位置
LCALL CONV;调用显示转换显示子程序
INC R6
MOV A,#':'
MOV B,R6
LCALL SH_LCD2;调用第二行显示子程序
MOV A,MIN;加载分钟数据
INC R6;设置位置
LCALL CONV;调用显示转换显示子程序
INC R6
MOV A,#':'
MOV B,R6
LCALL SH_LCD2;调用第二行显示子程序
MOV A,SEC;加载秒钟数据
INC R6;设置位置
LCALL CONV;调用显示转换显示子程序
RET
CONV:MOV B,#10;设置被除数
DIV AB;结果A存商数、B存余数
ADD A,#30H;转换为字符
PUSH B;B压入堆栈暂存
MOV B,R6;设置LCD显示的位置
LCALL SH_LCD2;调用第二行显示子程序
POP B;出栈
MOV A,B;B为个位数
ADD A,#30H;转换为字符
INC R6;LCD显示位置加1
MOV B,R6;设置LCD显示的位置
LCALL SH_LCD2;调用第二行显示子程序
RET
SH_LCD2:PUSH ACC
MOV A,B;设置显示地址
ADD A,#0C0H;设置LCD的第二行地址
MOV COM,A
LCALL WR_COM;调用写命令子程序
POP ACC
MOV DAT,A
LCALL WR_DAT;调用写数据子程序
RET
DELAY:
MOV R7,#100
DJNZ R7,$
RET
DISP:
MOV R1,#0;查表地址初始值
LOP1:MOV A,R1;将表地址初始值赋予A
MOVC A,@A+DPTR;查表将字符串内容送入A
MOV DAT,A;将字符串内容送入数据存储器
INC R1;地址值加1
LCALL WR_DAT;掉用写数据子程序
DJNZ R0,LOP1;判断查表是否10次
RET;子程序范返回
LINE1:DB '2009 04 02',00H;字符串
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -