8051双七段显示99倒计时器高位递减时低位异常问题求助
问题描述
我在Multisim中搭建了如下电路:8051单片机搭配两个七段数码管,其中一个七段数码管连接至74LS373锁存器,一个按键连接至8051的P3.2端口。
我编写了99倒计时循环代码(计数至00后无限循环),但目前出现高位递减时低位也变为相同数值的异常,请问该如何解决?
以下是我的代码:
$MOD51 start: MOV R1,#9 MOV R2,#9 SETB P3.5 MOV A,R1 LCALL display MOV P1,A CLR P3.5 MOV A,R2 LCALL display MOV P1,A mov r1,#10 check_button: jnb p3.2,button dec r1 CJNE R1,#255, disp_ones dec R2 CJNE R2,#255,disp_tens lcall finish disp_tens: SETB P3.5 MOV a,R2 LCALL display MOV P1,a lcall wait CLR P3.5 MOV R1,#10 sjmp check_button disp_ones: CLR P3.5 MOV a,R1 LCALL display MOV P1,a lcall wait sjmp check_button button: jnb p3.2,button_2 sjmp button button_2: sjmp check_button wait: MOV TMOD, #01H MOV TH0, #244 MOV TL0, #0 SETB TR0 wait_loop: JNB TF0, wait_loop CLR TR0 CLR TF0 RET display: INC A MOVC A,@A+PC RET DB 0C0H ;0 DB 0F9H ;1 DB 0A4H ;2 DB 0B0H ;3 DB 99H ;4 DB 92H ;5 DB 82H ;6 DB 0F8H ;7 DB 80H ;8 DB 90H ;9 DB 88H ;A DB 83H ;B DB 0C6H ;C DB 0A1H ;D DB 86H ;E DB 8EH ;F finish: sjmp finish end
问题分析与解决
异常根源
- 显示逻辑漏洞:低位数码管直接连接P1口,单独刷新高位时,P1口会被写入高位的显示码,导致低位同步显示该数值,出现“高低位数值一致”的异常。
- 初始化对应关系错误:控制高位锁存器(SETB P3.5)后,错误地将低位寄存器R1的数值送显,而非高位R2。
- 单一位刷新逻辑缺陷:仅刷新某一位的操作,会导致另一位显示停留在P1口的旧数值上,无法同步更新。
修改方案
- 同步刷新两位数码管:每次显示更新时,先锁存高位显示码,再输出低位显示码,确保两位各自显示对应数值。
- 修正初始化显示逻辑:初始化时同步刷新两位,确保初始显示正确。
- 简化计数逻辑:低位减到0后直接重置为9,逻辑更直观,避免依赖
CJNE的特殊值判断。
修改后的代码
$MOD51 start: MOV R1,#9 ; R1存储低位数值 MOV R2,#9 ; R2存储高位数值 LCALL refresh_display ; 初始化同步显示99 check_button: JNB P3.2, button_wait ; 检测按键,按下则等待释放 ; 未按键,执行倒计时逻辑 DEC R1 CJNE R1,#0FFH, refresh_display ; 低位未到0,刷新显示 ; 低位减至-1(0FFH),重置低位为9,高位减1 MOV R1,#9 DEC R2 CJNE R2,#0FFH, refresh_display ; 高位未到0,刷新显示 ; 高位也减至-1,进入00后死循环 SJMP finish button_wait: JNB P3.2, button_wait ; 等待按键释放,避免误触发 SJMP check_button ; 同步刷新两位数码管子程序 refresh_display: ; 刷新高位:置高锁存控制端,送高位显示码到P1,锁存后置低 SETB P3.5 MOV A,R2 LCALL display MOV P1,A CLR P3.5 ; 刷新低位:直接送低位显示码到P1(低位直接连P1) MOV A,R1 LCALL display MOV P1,A LCALL wait ; 延时保持显示效果 RET wait: MOV TMOD, #01H MOV TH0, #244 MOV TL0, #0 SETB TR0 wait_loop: JNB TF0, wait_loop CLR TR0 CLR TF0 RET display: INC A MOVC A,@A+PC RET DB 0C0H ;0 DB 0F9H ;1 DB 0A4H ;2 DB 0B0H ;3 DB 99H ;4 DB 92H ;5 DB 82H ;6 DB 0F8H ;7 DB 80H ;8 DB 90H ;9 DB 88H ;A DB 83H ;B DB 0C6H ;C DB 0A1H ;D DB 86H ;E DB 8EH ;F finish: SJMP finish end
修改说明
- 新增
refresh_display子程序,确保每次更新时同步刷新高低位,彻底解决P1口数值覆盖导致的显示异常。 - 优化计数逻辑,低位重置和高位递减的逻辑更清晰,可读性更强。
- 调整按键处理逻辑,增加释放等待,避免单次按键触发多次计数。
内容的提问来源于stack exchange,提问作者Linfoe
相关产品推荐
相关产品推荐

