📄 clock.asm
字号:
ORG 0000H
LJMP START
ORG 000BH ;TO的中断入口
LJMP PIT0
ORG 0030H
START:
MOV SP,#90H
MOV R0,#70H ;段显得起存地址
MOV TMOD,#01H ;选择TO的方式1
MOV TL0,#70H ;时钟定时初始化
MOV TH0,#3CH
CLR 29H
SETB EA ;开中断
SETB ET0
SETB TR0
DISP: MOV 70H,#00H ;分秒时都从0开始计时
MOV 71H,#00H
MOV 72H,#00H
MOV 73H,#00H
MOV 74H,#00H
MOV 75H,#00H
MOV 76H,#00H
DISPLAY: LJMP KEYI
MOV R1,#70H
MOV R2,#80H
DISPLAY0:
INC R1
MOV A,@R1 ;用查表方式取段码
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV B,A
MOV A,R2
RL A
MOV R2,A
CJNE R2,#04H,DP1 ;显示第3,5位上的小数点
MOV A,B
ADD A,#80H
MOV B,A
DP1:CJNE R2,#10H,DP2
MOV A,B
ADD A,#80H
MOV B,A
DP2:MOV A,B ;段码位码送入输出
MOV P0,A
MOV P1,R2
LCALL DELAY
CJNE R2,#20H,DISPLAY0
LJMP DISPLAY
TAB: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
;定时器0的中断服务程序
PIT0: PUSH PSW ; 保护现场
PUSH ACC
CLR TF0
MOV TH0,#3CH ;重装定时器的时间常数
MOV TL0,#70H
SETB TR0 ;开定时器
INC 70H
MOV R3,70H ;进位
CJNE R3,#20,RETI0
MOV 70H,#00
INC 71H
MOV R3,71H
CJNE R3,#10,RETI0
MOV 71H,#00
INC 72H
MOV R3,72H
CJNE R3,#06,RETI0
MOV 72H,#00
INC 73H
MOV R3,73H
CJNE R3,#10,RETI0
MOV 73H,#00
INC 74H
MOV R3,74H
CJNE R3,#06,RETI0
MOV 74H,#00
INC 75H
MOV R3, 75H
CJNE R3,#10,RETI0
MOV 75H,#00
INC 76H
MOV R3,76H
CJNE R3,#02,RETI0
MOV 76H,#00
LJMP RETI0
RETI0: POP ACC ;中断返回
POP PSW
RETI
DELAY: MOV R7,#04
D1: MOV R6,#250
D2: DJNZ R6,D2
DJNZ R7,D1
RET
KEYI:LCALL KSI
JNZ LK1 ;有键按下,跳到LK1 无键按下返回
CLR 29H
SJMP CALLDIS
LK1: JB 29H,CALLDIS
ACALL DELAYS ;有键按下,调用延时程序消抖
ACALL KSI ;消抖后看是否真的有键闭合
JNZ LK2 ;有键闭合就转键扫描
LJMP CALLDIS ;无键闭合就返回
LK2:CLR EA
MOV R2,#0FEH ;键扫描,找出在哪个位置
MOV R4,#0
LK4:MOV P2,R2 ;扫描字从P2口输出,高四位本来就是高电平
MOV A,P2 ;从P2口再把电平读入
JB ACC.4,LONE ;第4位为高电平,不在这列,转下列
MOV A,#0 ;在这列,把列首键好保存到A
SJMP LKP
LONE:JB ACC.5,LTWO
MOV A,#4
SJMP LKP
LTWO:JB ACC.6, LTHD
MOV A,#8
SJMP LKP
LTHD:JB ACC.7,NEXT
MOV A,#12
LKP:ADD A,R4
MOV 27H,A ;键号保存在0F7H中
SETB 29H ;关闭中断
SETB 28H
LJMP KKY
NEXT:INC R4
MOV A,R2
JNB ACC.3,KND ;行扫描到第三行后扫描结束,返回
RL A ;未扫描完则移到下行
MOV R2,A ;扫描字从新放回R2
SJMP LK4 ;从新开始下一行的扫描
KND:LJMP CALLDIS
KSI: MOV P2,#0FFH
ANL P2,#0F0H
CLR A
MOV A,P2
ORL A,#0FH
CPL A
RET
KKY:JNB 28H,KKY4 ;查询键处理标志,如果01没置位,则返回
CLR 28H ;清除键申请标志,开始键处理
INC R0
MOV A,R0
CJNE A,#77H,JUMP ;71到76 内的段码没有都赋完值,则继续赋值,调时
MOV R0,#70H ;赋完值R0从新回到70,可从新赋值,调时
SETB EA ;调时完从新开中断
LJMP CALLDIS
JUMP:MOV @R0,27H ;把键值作为段的偏移量
LJMP CALLDIS
DELAYS: MOV R5,#025 ;去抖得延时,10毫秒
D3: MOV R4,#250
D4: DJNZ R4,D4
DJNZ R5,D3
RET
KKY4:LJMP CALLDIS
CALLDIS:MOV R1,#70H
MOV R2,#80H
LJMP DISPLAY0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -