问题描述:程序可以运行,倒计时也可以实现,但是在倒计时的时候数码管上的数会隔一秒闪烁一次,因为我把定时器中断计时1s的程序放在了数码管显示程序里面,但是如果放在定时器中断里面就达不到1s倒计时一次的效果了。
我想解决的问题:希望倒计时的时候数码管不要闪烁,而是一直显示,希望大神们指点指点,或者可以帮忙改一下,或者如果有更好的实现方法也希望大神们不吝赐教。
代码如下:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP WBZD ;转向外部中断子程序(暂停功能)
ORG 000BH
LJMP INT0;转向定时中断0服务程序
ORG 0030H
;P0口接数码管的段选(高电平有效)
;P2.0-P2.3接数码管的位选(低电平有效?
MAIN:
MOV P2,#00H ;初始化P2口
MOV P0,#3FH ;开始显示000000
SETB EA;中断允许
SETB ET0;定时器0中断允许
SETB EX0;外部中断0允许
MOV TMOD,#01H;置定时器0为工作方式1
MOV TH0,#3CH ;12MHz50ms初值
MOV TL0,#0B0H
MOV R4,#1 ;计时时间(小时)
MOV R5,#00H
; MOV R6,#00H
; MOV R7,#10
SETB TR0 ;计时开始
;==========================================
;=========键盘扫描程序=====================
MOSHI:
;计时显示扫描
;R4为时,R5为分,R6为秒
;显示小时的十位
MOV A,R4
MOV B,#10
DIV AB
LCALL CHABIAO
MOV P2,#0FEH
MOV P0,A
LCALL DELAY
MOV P2,#0FFH
;显示小时的个位
MOV A,B
LCALL CHABIAO
MOV P2,#0FDH
MOV P0,A
LCALL DELAY
MOV P2,#0FFH
;显示分钟的十位
MOV A,R5
MOV B,#10
DIV AB
LCALL CHABIAO
MOV P2,#0FBH
MOV P0,A
LCALL DELAY
MOV P2,#0FFH
;显示分钟的个位
MOV A,B
LCALL CHABIAO
MOV P2,#0F7H
MOV P0,A
LCALL DELAY
MOV P2,#0FFH
;显示秒钟的十位
MOV A,R6
MOV B,#10
DIV AB
LCALL CHABIAO
MOV P2,#0EFH
MOV P0,A
LCALL DELAY
MOV P2,#0FFH
;显示秒钟的个位
MOV A,B
LCALL CHABIAO
MOV P2,#0DFH
MOV P0,A
LCALL DELAY
MOV P2,#0FFH
LOOP1:
CJNE R0,#20,LOOP1
MOV R0,#00H
DEC R6
CJNE R6,#0FFH,MOSHI
MOV R6,#59
DEC R5
CJNE R5,#0FFH,MOSHI
MOV R5,#59
DEC R4
CJNE R4,#0FFH,MOSHI
MOV R4,#0
CLR TR0
LJMP MOSHI
;====================================
;延时20ms子程序
DELAY:
MOV 30H,#10
LOOP:
MOV 40H,#0FFH
DJNZ 40H,$
DJNZ 30H,LOOP
RET
;==================================
;查表指令
CHABIAO:
MOV DPTR,#TAB
MOVC A,@A+DPTR
RET
;============================
;定时中断子程序
INT0:
INC R0
MOV TH0,#3CH
MOV TL0,#0B0H
RETI
EXIT:
RETI
;================================================
;外部中断0子程序
WBZD:
JNB P3.2,$
CPL P3.7
CPL TR0
RETI
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,58H,5EH,79H,71H
END
|