📄 clock.asm
字号:
CONT2 EQU 20 ;延迟10毫秒时间常数(可调整)
KSCAN: MOV P1,#0F0H ;先判有无键按下,扫描码为0F0H
MOV A, P1 ;读键盘状态
CJNE A, #0F0H,AGAIN ;有键按下转再次扫描
RET ;无键按下返回
AGAIN:
LCALL DLAY10 ;为去抖动而延迟10毫秒
MOV P1, #0F0H ;再次扫描码为0F0H
MOV A, P1 ;读键盘状态
CJNE A,#0F0H, OK ;确实有键按下转OK
RET ;无键按下返回
OK: MOV R3, A ;保存第一次扫描值
MOV P1, #0FH ;第二次扫描码为0FH
MOV A, P1 ;取第二次扫描值
ORL A, R3 ;与第一次扫描值合成键值
MOV R3, A ;键值保存于R3
LOOP: MOV P1, #0F0H ;等待松键
MOV A, P1 ;读键盘状态
CJNE A, #0F0H, LOOP ;未松键就再等待
;键号译码
DCODK: MOV DPTR,#CDKTBL ;键值表首址送DPTR
MOV B, #12 ;限制最多查表次数为12次
MOV A, #0 ;从0号键开始查表
LOOP1: PUSH ACC ;保护键号
MOVC A, @A+DPTR ;查键值表
CJNE A,03H, NEXT1 ;未查到就再查下一个
POP ACC ;恢复键号
MOV R3,A ;保存键号
SJMP KFUNC ;查到则转判按键类型程序
NEXT1: POP ACC ;恢复键号
INC A ;指向下一个键号
SJMP LOOP1 ;再查下一个
;键盘功能程序
KFUNC: MOV A,#9 ;判按键类型,设置最大数字键号
SUBB A,R3 ;与扫描到的键号比较
JNC JP1 ;是数字键转JP1
SJMP JP2
JP1: CLR 79H ;清功能键标志
SETB 78H ;置数字键标志
SJMP JP3
JP2: CLR 78H ;清数字键标志
SETB 79H ;置功能键标志
JP3: RET
DLAY10: MOV R4,#CONT2 ;延迟10毫秒
JP4: MOV R5,#0
DJNZ R5,$
DJNZ R4,JP4
RET
;键值表
CDKTBL: DW 7D7BH,77BDH,0BBB7H,0DDDBH,0D7EDH,0EBE7H
;显示器驱动程序(DSPLY.ASM)
CONT1 EQU 06H ;延迟3毫秒的时间常数(可调整)
DSPLY: MOV DPTR, #CCDTBL ;字形码表首址送DPTR
MOV R0, #30H ;8位地址指针指向最右边显示位
MOV 36H, #0FEH ;位选码初值送36H单元
MOV R2, #6 ;显示位数初值送计数器R2
LOOP2: MOV A, #0FFH ;先关显示器,位选码为0FFH
MOV P2, A
MOV P0, A ;字形码也为0FFH写入显示器
MOV A, 36H ;取位选码
MOV P2, A ;
MOV A, @R0 ;取更新显示数据
MOVC A, @A+DPTR ;查字形码表
MOV P0, A ;写入显示器
MOV R4, #CONT1 ;延迟3毫秒
LOOP3: MOV R5, #0
DJNZ R5, $
DJNZ R4, LOOP3
MOV A, 36H ;产生下一位字选码
RL A
MOV 36H, A
INC R0 ;拨指针,准备扫描下一位
DJNZ R2, LOOP2 ;扫描位数计数,未完就重复
RET
;字符"0" ~"9"的字形码表(0电平有效)
CCDTBL: DW 4079H,2430H,1912H,0278H,0010H
;⑷ 初始化程序
INIT: MOV A, #0
MOV R0, #30H ;显示数据缓冲单元清0
MOV B, #9
LLOP: MOV @R0, A
INC R0
DJNZ B, LLOP
MOV 2FH, #0 ;按键标志清0
MOV 2EH, #100 ;"秒"定时计数器计数初值
MOV TH0, #0D8H ;T0定时10mS时间常数
MOV TL0, #0F0H ;(Fosc=12MHz)
SETB TR0 ;启动T0计数
SETB ET0 ;允许T0中断
SETB EA ;开系统中断
;⑶ 定时中断服务程序(TIMER.ASM)
;定时器中断服务程序:用T0定时10mS,时间常数为 D8F0H,
;用2EH单元做计数器,初值为100。"时、分、秒"数据分别经过
;37H,38H,39H单元转换后装入30H,31H,32H,33H,34H,35H单元。
TIMR: MOV TH0, #0D8H ;重装时间常数
MOV TL0, #0F0H
DJNZ 2EH, TJPP ;未够1秒转
MOV 2EH, #100 ;够1秒重装计数初值
PUSH ACC
MOV A, 37H ;秒加1
ADD A, #1
DA A ;BCD调整
MOV 37H, A
XRL A, #60H ;够60秒否?
JZ TJP0 ;够60秒转
MOV A, 37H ;拆字分装
ANL A, #0FH
MOV 30H, A
MOV A, 37H
SWAP A
ANL A, #0FH
MOV 31H, A
TJPP: LJMP TJPN ;未够60秒返回
TJP0: MOV 37H, #0 ;够60秒复0
MOV A, 37H ;拆字分装
ANL A, #0FH
MOV 30H, A
MOV A, 37H
SWAP A
ANL A, #0FH
MOV 31H, A
MOV A, 38H ;分加1
ADD A, #1
DA A ;BCD调整
MOV 38H, A
XRL A, #60H ;够60分否?
JZ TJP1 ;够60分转
MOV A, 38H ;拆字分装
ANL A, #0FH
MOV 32H, A
MOV A, 38H
SWAP A
ANL A, #0FH
MOV 33H, A
LJMP TJPN ;未够60分返回
TJP1: MOV 38H, #0 ;够60分复0
MOV A, 38H ;拆字分装
ANL A, #0FH
MOV 32H, A
MOV A, 38H
SWAP A
ANL A, #0FH
MOV 33H, A
MOV A, 39H ;时加1
ADD A, #1
DA A ;BCD调整
MOV 39H, A
XRL A, #24H ;够24时否?
JZ TJP2 ;够24时转
MOV A, 39H ;拆字分装
ANL A, #0FH
MOV 34H, A
MOV A, 39H
SWAP A
ANL A, #0FH
MOV 35H, A
LJMP TJPN ;未够24时返回
TJP2: MOV 39H, #0 ;够24时复0
MOV A, 39H ;拆字分装
ANL A, #0FH
MOV 34H, A
MOV A, 39H
SWAP A
ANL A, #0FH
MOV 35H, A
TJPN: POP ACC
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -