BCD:;//BCD码转换,
;//把t_sec及T_min中的秒数和分钟数转换成BCD码,并存在min10,min,sec10,sec中
MOV A,T_SEC;
MOV B,#10
DIV AB
MOV SEC10,A
MOV SEC,B MOV A,T_MIN;
MOV B,#10
DIV AB
MOV MIN10,A
MOV MIN,B next:
POP PSW
POP ACC
RETIINT:
PUSH ACC
PUSH PSW
CLR EX0;关闭外中断,用于阻止mode键的抖动而引起的中断。
CALL DELAY10;延时10ms
JB P1.7,jNEXTT0;10ms后,如果是1,则是抖动,结束中断。并开中断,相对地址太远了,弄了一座桥。mov r0,#0FFH
;//以下是对p1.7-p1.5进行扫描
modekey:
mov a,temp1;用于存放临时数码
MOVC A,@A+DPTR;查表
MOV P0,A;用于调节过程中的显示。只显示一个位数
mov p2,temp;用于存放临时控制码
call DELY1
MOV P2,#00H
CALL DELY1;为了与使扫描的亮度一样,用三个延时。
CALL DELY1
CALL DELY1jb p1.7,upkey
call delay10;延时10ms
jb p1.7,modekey;如果10ms后是1,则说明是抖动干扰,
jnb p1.7,$;等待松开
jmp mode;到mode处理jnextt0:jmp nextt0upkey:jb p1.6,beginkey
call delay10
jb p1.6,upkey
jnb p1.6,$
jmp upbeginkey:
jb p1.5,modekey
call delay10
jb p1.5,beginkey
jnb p1.5,$
jmp begin mode: ;用于选择所要调节的数码管 。读数为倒计时过程中的时刻的值
inc r0
mov a,r0 m0:
cjne a,#00h,m1 //显示十位分钟
mov a,tmin10
mov temp,#80h
jmp m m1:
cjne a,#01h,m2
mov a,tmin
mov temp,#40h
jmp m m2:
cjne a,#02h,m3
mov a,tsec10
mov temp,#20h
jmp m m3:
cjne a,#03h,m4
mov a,tsec
mov temp,#10h
jmp m m4:jmp NEXTT0
m:
mov temp1,a jmp modekey//跳回模式选择循环 up:
up0: ;把每个BCD码,进行加一操作,然后再合起来。存放到分钟和秒钟的计数器中
cjne r0,#00h,up1
mov a,tmin10;
inc a
cjne a,#10,upt0
mov a,#00h
upt0:
mov tmin10,a
jmp u
up1:
cjne r0,#01h,up2
mov a,tmin
inc a
cjne a,#10,upt1
mov a,#00h
upt1:
mov tmin,a
jmp u
up2:
cjne r0,#02h,up3
mov a,tsec10
inc a
cjne a,#6,upt2
mov a,#00h
upt2:
mov tsec10,a
jmp u
up3:
cjne r0,#03h,u
mov a,tsec
inc a
cjne a,#10,upt3
mov a,#00h
upt3:
mov tsec,a
u:
mov temp1,a jmp upkey begin:
mov sec10,tsec10
mov min10,tmin10
mov sec,tsec
mov min,tmin mov a,tsec10
mov b,#10
mul ab
add a,tsec
mov t_sec,a
mov a,tmin10
mov b,#10
mul ab
add a,tmin
mov t_min,a setb TR0 NEXTT0:
SETB EX0 //重新开外中断
POP PSW
POP ACC
RETIDELY1: ;//延时1ms,用于消除鬼影
MOV R4,#2
D1:MOV R5,#248
DJNZ R5,$
DJNZ R4,D1
RET
DELAY10:;//延时10ms用于消抖
MOV R4,#20
D2:MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
RET
//用于程序
DISPTAB:DB 00111111b,00000110b,01011011b,01001111b,01100110b,01101101b,01111101b,00000111b,01111111b,01101111b
DISPTABDP:DB 10111111b,10000110b,11011011b,11001111b,11100110b,11101101b,11111101b,10000111b,11111111b,11101111b
END;//倒计时使用说明。输出口为P0,扫描口为P2.7-p2.4分别对应,分钟十位,分钟个位,钞钟十位,钞钟个位
;//键盘输入口为P1.5-begin,p1.6-up,p1.7-mode,p1.4-stop
◆◆
评论读取中....
请登录后再发表评论!
◆◆
修改失败,请稍后尝试