我想做一个可调整时间的电子钟,由三个按键调整时间,但是程序做好后,调整时间只能递加而不能递减,各位仁兄能帮我看一下是程序哪里错了吗???程序如下:
BUF_1 EQU 31H ;第一位数码管的段码存放地址
BUF_2 EQU 32H ;第二位数码管的段码存放地址
BUF_3 EQU 33H ;第三位数码管的段码存放地址
BUF_4 EQU 34H ;第四位数码管的段码存放地址
BUF_5 EQU 35H ;第五位数码管的段码存放地址
BUF_6 EQU 36H ;第六位数码管的段码存放地址
org 0000h
ljmp main
org 000bh
ljmp vot0
org 0030h
main: mov sp,#60h ;初始化
mov TMOD,#01H
mov TH0,#0ech
mov TL0,#078H
setb et0
setb ea
setb tr0
mov r1,#BUF_6
mov r2,#11011111b
mov r5,#0
mov r6,#0
mov r7,#0
mov r0,#0
loop: jnb p1.0,key1
lcall dis_buf
lcall display
sjmp loop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;按键扫描
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
key1:
jnb p1.0,$
lcall dis_buf
lcall display
jnb p1.0,key2
JNB P1.2,WP1
JB P1.1,key1
jnb p1.1,$
inc r5
cjne r5,#24,key1
mov r5,#0
SJMP key1
WP1: JNB P1.2,$
dec r5
cjne r5,#0,key1
MOV r5,#23
SJMP key1
key2:
jnb p1.0,$
lcall dis_buf
lcall display
jnb p1.0,key3
JNB P1.2,WP2
JB P1.1,key2
jnb p1.1,$
inc r6
cjne r6,#60,key2
mov r6,#0
SJMP key2
WP2: JNB P1.2,$
dec r6
cjne r6,#0,key2
MOV R6,#59
SJMP key2
key3:
jnb p1.0,$
lcall dis_buf
lcall display
jnb p1.0,key4
JNB P1.2,WP3
JB P1.1,key3
jnb p1.1,$
inc r6
cjne r6,#60,key3
mov r6,#0
SJMP key2
WP3: JNB P1.2,$
dec r7
cjne r7,#0,key3
MOV R7,#59
SJMP key3
key4:
jnb p1.0,$
ajmp loop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;显示数据准备子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
dis_buf:
mov dptr,#LED_TAB
mov a,r5
mov b,#10
div ab
movc a,@a+dptr
mov BUF_1,a
mov a,b
movc a,@a+dptr
mov BUF_2,a
anl BUF_2,#01111111b ;第二位的小数点
mov a,r6
mov b,#10
div ab
movc a,@a+dptr
mov BUF_3,a
mov a,b
movc a,@a+dptr
mov BUF_4,a ;
anl buf_4,#01111111b
mov a,r7
mov b,#10
div ab
movc a,@a+dptr
mov BUF_5,a
mov a,b
movc a,@a+dptr
mov BUF_6,a
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;显示子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
display:
jbc F0, display_1
sjmp display_ret
display_1:
mov p3,#11111111b
mov p2,@r1
mov a,r2
anl p3,a
rr a
mov r2,a
dec r1
cjne r1,#30h,display_ret
mov r1,#BUF_6
mov r2,#11011111b
display_ret:
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;中断服务子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
vot0: setb F0
inc r0 ;做50ms的计数
cjne r0,#200,vot0_ret
mov r0,#0
inc r7 ;做50ms的计数
cjne r7,#60,vot0_ret
mov r7,#0
inc r6 ;做1s的计数
cjne r6,#60,vot0_ret
mov r6,#0
inc r5 ;做1分钟的计数
cjne r5,#24,vot0_ret
mov r5,#0
vot0_ret:
mov TH0,#0ech
mov TL0,#078H
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LED_TAB: ;段码表
DB 0C0H,0F9H,0A4H,0B0H,99H ;0,1,2,3,4
DB 92H, 82H,0F8H, 80H,90H ;5,6,7,8,9
end
而且我还想把要调整的地方会变成一闪一闪的,能实现吗?? |