allok.asm
来自「这是一个在单片机实现时钟的程序」· 汇编 代码 · 共 317 行
ASM
317 行
ZXK equ 0FF22h
ZWK equ 0FF21h
org 0000h
Ljmp start
org 000bh
Ljmp int_t0
org 001bh
Ljmp int_t1
org 0050h
start:
mov sp, #40h
mov 30h,#08h ;C 时
mov 31h,#55h ;C 分
mov 32h,#55h ;C 秒
mov 33h,#00h ;C 毫秒
mov 34h,#00h ;R 分
mov 35h,#00h ;R 秒
mov 36h,#00h ;R 毫秒
mov 37h,#0ach ;alarm
mov 38h,#02h ;D 时
mov 39h,#00h ;D 分
mov 3ah,#00h ;R 状态
mov 3bh,#00h ;系统状态
mov 3ch,#00h ;key 接口
mov tmod,#11h
setb ea
mov tl0,#78h
mov th0,#0ech
setb et0
setb pt0
setb tr0
mov tl1,#78H
mov th1,#0ecH
setb et1
clr pt1
setb tr1
KEYSCAN:
LCALL KEY
mov a,3CH
ANL A,#07H ;取低三位
jz KEYSCAN
MOV A,3Ch ;读取KEY状态
ANL A,#04H
JZ KEYBC ;KEYA未被按下 执行KEYBC
MOV A,3bh
INC A ;KEYA 被按下,系统状态加1
MOV 3bh,A
CJNE A,#03H, CLRKEY ;系统状态<>3
MOV 3bh,#00H
LJMP CLRKEY
KEYBC: MOV A,3bh ;读取系统状态
JZ ccontr ;0 状态 钟表控制 Ccontr
DEC A
JZ rcontr ;1 状态 跑表控制 Rcontr
DEC A
JZ dcontr ;2 状态 定时控制 Dcontr
ccontr: MOV A,3Ch ;读取KEY状态
ANL A,#02H
JZ KEYCC ;KEYCB未被按下 执行KEYCC
MOV A,30h
ADD A,#1
DA A ;KEYCB 被按下,C 时加1
MOV 30h,A
CJNE A,#24H, CLRKEY ;C 时<>24
MOV 30h,#00H
LJMP CLRKEY
KEYCC: MOV A,31h
ADD A,#1
DA A ;KEYCC 被按下,C 分加1
MOV 31h,A
CJNE A,#60H, CLRKEY ;C 分<>60
MOV 31h,#00H
LJMP CLRKEY
rcontr: MOV A,3Ch ;读取KEY状态
ANL A,#02H
JZ KEYRC ;KEYRB未被按下 执行KEYRC
MOV A,3ah ;KEYRB 被按下 读入R 状态
JNZ CLRKEY ; R 计时状态 无效退出
mov 34h,#00h
mov 35h,#00h ;R 停止状态 全部清0
mov 36h,#00h
LJMP CLRKEY
KEYRC: MOV A,3ah
CPL A ;KEYRC 被按下 反转 R 状态
MOV 3ah,A
LJMP CLRKEY
dcontr: MOV A,3Ch ;读取KEY状态
ANL A,#02H
JZ KEYDC ;KEYDB未被按下 执行KEYDC
MOV A,38h
ADD A,#1
DA A ;KEYDB 被按下,D 时加1
MOV 38h,A
CJNE A,#24H, CLRKEY ;D 时<>24
MOV 38h,#00H
LJMP CLRKEY
KEYDC: MOV A,39h
ADD A,#1
DA A ;KEYDC 被按下,D 分加1
MOV 39h,A
CJNE A,#60H, CLRKEY ;D 分<>60
MOV 39h,#00H
CLRKEY: mov 3ch,#00h ;key 响应完 清除
LJMP KEYSCAN
int_t0:
push 7
push 6 ;保存现场
push 5
push 4
push 3
push 2
push 1
push 0
push dph
push dpl
push acc
push psw
mov r3,30h ;C 时
mov r2,31h ;C 分
mov r1,32h ;C 秒
mov r7,33h ;C 毫秒
mov r6,34h ;R 分
mov r5,35h ;R 秒
mov r4,36h ;R 毫秒
CLR TR0
MOV TL0,#78H ;10mS 定时常数
MOV TH0,#0eCH
SETB TR0
MOV A,R7
ADD A,#1 ;C毫秒加1
DA A
MOV R7,A
CJNE R7,#00H,RUNCLK ;判断C毫秒=100
CJNE R1,#59H,SECOND ;判断C秒=59
MOV R1,#99H
CJNE R2,#59H,MINUTE ;判断C分=59
MOV R2,#99H
CJNE R3,#23H,HOUR ;判断C时=23
MOV R3,#99H
HOUR: MOV A,R3
ADD A,#1 ;C时加1
DA A
MOV R3,A
MINUTE: SETB P3.0
; mov 3ch,#01h ;测试key 接口
MOV A,R2
ADD A,#1 ;C分加1
DA A
MOV R2,A
SECOND: MOV A,R1
ADD A,#1 ;C秒加1
DA A
MOV R1,A
MOV A,R2
CJNE A,39H, RUNCLK ;判断C分<>D分转移
mov A,30H ;C 时
CJNE A,38H, RUNCLK ;判断C时<>D时转移
CLR P3.0 ;定时到 执行动作
RUNCLK: MOV A,3ah ;读入R 状态
JZ exit ;R 状态为0退出
MOV A,R4
ADD A,#1 ;R 毫秒加1
DA A
MOV R4,A
CJNE R4,#00H,exit ;判断R毫秒=100
CJNE R5,#59H,RSECOND ;判断R秒=59
MOV R5,#99H
MOV A,R6
ADD A,#1 ;R分加1
DA A
MOV R6,A
RSECOND: MOV A,R5
ADD A,#1 ;R秒加1
DA A
MOV R5,A
exit: mov 30h, r3 ;C 时
mov 31h, r2 ;C 分
mov 32h, r1 ;C 秒
mov 33h, r7 ;C 毫秒
mov 34h, r6 ;R 分
mov 35h, r5 ;R 秒
mov 36h, r4 ;R 毫秒
pop psw ;恢复现场
pop acc
pop dpl
pop dph
pop 0
pop 1
pop 2
pop 3
pop 4
pop 5
pop 6
pop 7
RETI ;中断返回
int_t1:
push 0 ;保存现场
push 4
push 5
push dph
push dpl
push acc
push psw
CLR TR1
MOV TL1,#78H ;30mS 定时常数
MOV TH1,#0ECH
SETB TR1
MOV A,3bh ;读取系统状态
JZ cvalue ;0 状态 显示钟 Cvalue
DEC A
JZ rvalue ;1 状态要显示跑表 Rvalue
DEC A
JZ dvalue ;2 状态要显示跑表 Dvalue
cvalue: mov r0,#30h ;C 时 分 秒
sjmp DISP
rvalue: MOV R0,#34H ;R 分 秒 毫秒
sjmp DISP
dvalue: mov r0,#37h ;D AC 时 分
sjmp DISP
mov r0,#30h
DISP: mov r4,#03h ;循环次数
mov r5,#20h ;置位信息
clr a
mov a,#0fh
mov dptr, #0ff20h
movx @dptr, a
LOOP: MOV DPTR,#TAB ;显示高位
MOV A,@R0
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
mov dptr, #ZXK
movx @dptr, a
mov a,R5
mov dptr, #ZWK
movx @dptr, a
RR A
MOV R5,A
LCALL DELAY
MOV DPTR,#TAB ;显示低位
MOV A,@R0
ANL A,#0FH
ADD A,#10H
MOVC A,@A+DPTR
mov dptr, #ZXK
movx @dptr, a
mov a,R5
mov dptr, #ZWK
movx @dptr, a
RR A
MOV R5,A
LCALL DELAY
INC R0
DJNZ R4,LOOP
POP PSW ;恢复现场
POP ACC
POP DPL
POP DPH
POP 5
POP 4
POP 0
RETI ;中断返回
DELAY: ;延时子程序
PUSH 0 ;保存现场
PUSH 1
MOV 0,#08H
DELAY1: MOV 1,#35H
DJNZ 1,$
DJNZ 0,DELAY1
POP 1 ;恢复现场
POP 0
RET
KEY:
PUSH 8 ;保存现场
mov p1,#0FFh
MOV A,P1
CPL A
ANL A,#07H ;取低三位
JNZ IN ;有键按下
jmp pp
IN: MOV A, #05H ;延时20ms,消抖
LCA: ;LCALL DELAY
DEC A
JNZ LCA
MOV A,P1 ;读取键盘的值
CPL A
ANL A,#07H
MOV 3CH,A ;键盘值送key 接口
LOOSEN: MOV A,P1
CPL A
ANL A,#07H
JNZ LOOSEN ;有键按下返回LOOSEN 等待松按
pp: POP 8 ;恢复现场
RET
tab: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H ;'0,1,2,3,4,5,6,7'
DB 080H,098H,088H,083H,0C6H,0A1H,086H,08EH ;'8,9,A,B,C,D,E,F'
DB 040H,079H,024H,030H,019H,012H,002H,078H ;'0.,1.,2.,3.,4.,5.,6.,7.'
DB 000H,010H,008H,003H,047H,021H,006H,00eH ;'8.,9.,A.,B.,C.,D.,E.,F.'
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?