关于51单片机倒计时数码管显示的数值转换问题(ASM文件)

发布时间:2019-08-07 23:04:40

单片机实验编写交通灯,需要用2个数码管倒计时显示红灯黄灯绿灯的剩余时间。以下是我的程序ORG 0000H  AJMP MAIN  ORG 000BH  AJMP TIME  ORG 0300H MAIN:   MOV A,#3H          ;设置8155状态        MOV DPTR,#7100H MOVX @DPTR,A  ;初始化A地址 MOV 20H,#00H  ;微秒初始化 MOV 21H,#00H  ;秒初始化 MOV 22H,#00H   ;秒绿初始化 MOV 23H,#00H ;秒黄初始化 MOV 24H,#00H ;秒红初始化 MOV R1,#00H MOV R3,#00H MOV R4,#00H    MOV IP,#02H   ;IP初始化 MOV IE,#82H   ;IE初始化 MOV TMOD,#01H ;选定时器工作方式1 SETB TR0      ;启动定时0  MOV SP,#40H   ;重设堆栈指针 NEXT:     LCALL DISP    ;调用显示子程序 JZ NEXT    ;累加器判0转移 SJMP NEXT     ;重新循环  NOP  NOP  NOP           ;定时中断处理程序: TIME:     PUSH ACC      ;保护现场  PUSH PSW  MOV TL0,#0B4H ;赋定时初值  MOV TH0,#3CH  INC 20H ;    ;微秒自累加 MOV A,20H    ;微秒输入A CJNE A,#20,RET0I;如果 A=20,则表示一秒钟时间到了,不转移,到下一步清零微秒,否则跳转 MOV 20H,#00H  ;一秒钟时间到 ,微秒清零          MOV R1,22H    ;秒绿输入A INC R1    ;秒加1 MOV A,R1 DA A    ;十进制调整 MOV R1,A    MOV 22H,R1 ;R1时间写入22H保存        MOV R3,23H   ;秒黄输入A INC R3   ;秒加1 MOV A,R3 DA A MOV R3,A MOV 23H,R3 MOV R4,24H    ;秒红输入A INC R4    ;秒加1 MOV A,R4    DA A MOV R4,A MOV 24H,R4    CJNE R1,#25H,RETI1   ;如果R1=25,则不转移,表示黄灯时间已经到了,到下一步换成红灯,否则跳转 MOV 22H,#24H   ;保持跳转的条件    SETB P1.2   ;熄灭绿灯 CJNE R3,#30H,RETI2   ;如果R3=30,则不转移,表示黄灯时间已经到了,到下一步换成红灯,否则跳转 MOV 23H,#29H    SETB P1.1      ;熄灭黄灯          CJNE R4,#60H,RETI3  ;如果R4=60,则不转移,表示红灯时间已经到了,到下一步换成绿灯(清零),否则跳转    SETB P1.3;    熄灭红灯         MOV 21H,#00H  ;一个循环时间到,清零  MOV 22H,#00H MOV 23H,#00H MOV 24H,#00H RET0I:     POP PSW ;恢复现场  POP ACC  RETI ;中断返回 NOP  NOP RETI1:    MOV A,#25H   SUBB A,22H   ;25+22H内时间,实现绿灯倒计时    MOV 50H,A    POP PSW ;恢复现场  POP ACC  SETB P1.2    CPL P1.2 RETI ;中断返回RETI2:   MOV A,#30H     SUBB A,23H ;30-23H内的时间,实现黄灯倒计时    MOV 50H,A    POP PSW ;恢复现场  POP ACC      CPL P1.1 RETI ;中断返回RETI3: MOV A,#60H SUBB A,24H    ;60-24H内时间,实现红灯倒计时  MOV 50H,A    POP PSW ;恢复现场  POP ACC  SETB P1.3    CPL P1.3 RETI ;中断返回DISP:     MOV A,50H ;50H(秒)写入A MOV B,#10H ;B中写入10 DIV AB  ;A除以B,A=秒的十位,B=秒的个位    MOV 79H,B ;秒个位输入最低位数码管 MOV 7AH,A ;秒十位输入次低位数码管 MOV 7BH,#00H MOV 7CH,#00H MOV R1,#79H ;缓冲区首地址 MOV R2,#10H ;用于位选 MOV A,R2DISP1: MOV DPTR,#7101H     ;位选 MOVX @DPTR,A MOV A,@R1 MOV DPTR,#DBSEG MOVC A,@A+DPTR      ;取段码 MOV DPTR,#7102H MOVX @DPTR,A        ;输出显示 LCALL DELAY         ;延时 INC R1 MOV A,R2 JB ACC.7,EXT        ;当4个数码管都点亮一遍时,结束 RL A MOV R2,A JMP DISP1 EXT: RETDELAY:  MOV R6,#10HDELA1:  MOV R5,#20H        DJNZ R5,$        DJNZ R6,DELA1 RETDBSEG:  DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH END  现在下电路板测试发现,红黄绿三个LED灯很好的实现了交通灯的功能,但是在倒计时方面,倒计时个位数显示数码管总是乱码,十位数正常。。。。请问该如何修改

推荐回答

还没有选出推荐答案,请稍候访问或查看其他回答!
以上问题属网友观点,不代表本站立场,仅供参考!