📄 电子.asm
字号:
HOUR EQU 30H ;赋显示小时的单元地址值(用户区)
MINUTE EQU 31H ;赋显示分钟的单元地址值
SECOND EQU 32H ;赋显示秒钟的单元地址值
BUF EQU 40H ;显示缓冲区
ORG 0000H
AJMP MAIN
ORG 000BH ;定时器T0的入口
AJMP INT_T0
ORG 0100H
MAIN:
MOV SP, #60H
MOV TMOD, #01H
MOV TH0, #3CH
MOV TL0, #0B0H
SETB TR0
SETB EA
SETB ET0
MOV DPTR, #7F00H
MOV A, #03H
MOVX @DPTR, A
MOV HOUR, #00
MOV MINUTE, #00
MOV SECOND, #00
MOV R1,#15 ;循环次数
;存储缓冲区值
DIP:
MOV A, HOUR
MOV B, #10
DIV AB
MOV BUF, A
MOV BUF+1, B ;将小时分成两个数,放到BUF和BUF+1
MOV A, MINUTE
MOV B, #10
DIV AB
MOV BUF+2,A
MOV BUF+3,B ;将分钟分成两个数,放到BUF+2和BUF+3
MOV A, SECOND
MOV B, #10
DIV AB
MOV BUF+4,A
MOV BUF+5,B ;将秒数分成两个数,放到BUF+4和BUF+5
;循环显示缓冲值
MOV R5, #00100000B ;位码给R5
MOV R0, #BUF ;缓冲区地址值给R0
LOOP: ;循环累加
MOV A, R5
MOV DPTR, #7F02H
MOVX @DPTR, A ;送位码给PB口
MOV DPTR, #TABLE
MOV A, @R0 ;将缓冲值送给PA
MOVC A, @A+DPTR ;查表
MOV DPTR, #7F01H
MOVX @DPTR, A ;送段码
ACALL DELAY_2MS
MOV A, R5
JB ACC.0, DIP ;判断第一位是否为0,是则执行下面程序,否则跳到DIP
RR A ;右移位码
MOV R5, A
INC R0 ;缓冲值加1,指向下一个地址
AJMP LOOP
;廷时程序
DELAY_2MS:
MOV R6,#0F0H ;少于20ms
DELAY0:
DJNZ R6,DELAY0
RET
;段码表(0~9)
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;共阳数码
;中断口
INT_T0:
PUSH ACC
PUSH PSW
MOV TH0,#3CH
MOV TL0,#0B0H ;重新赋值定时值
DJNZ R1,INTI ;若R0减到0则跳到INTI,否则执行下面程序
INC SECOND ;区小事
MOV A,SECOND
CJNE A,#60,DONE ;若秒数满60则执行下面程序,否则跳到DONE
MOV SECOND,#0 ;将秒数清0
INC MINUTE ;分钟加一
MOV A,MINUTE
CJNE A,#60,DONE ;若分钟满60则执行下面程序,否则跳到DONE
MOV MINUTE,#0 ;将分钟清0
INC HOUR ;小时加一
MOV A,HOUR
CJNE A,#24,DONE ;若小时满24则执行下面程序,否则跳到DONE
MOV HOUR,#0 ;小时清0
DONE:
MOV R1,#15 ;重新赋值循环次数
INTI:
POP PSW
POP ACC
RETI ;返回
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -