永发信息网

一个汇编语言定时器0控制数码管显示数字加1的程序,6个数码管左三个和右三个分别显示一个数从0开始加。

答案:2  悬赏:0  手机版
解决时间 2021-02-15 21:16
  • 提问者网友:伴风望海
  • 2021-02-15 13:22
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP PKT0
ORG 0100H
MAIN:
SETB EA
SETB ET0
MOV TL0,#00H
MOV TH0,#00H
MOV TMOD,#01H
MOV 30H,#00 ;要显示的两个数字存在30H和31H
MOV 31H,#00
MOV DPTR,#0100H ;8155初始化
MOV A,#03H
MOVX @DPTR,A
SETB TR0
LOOP:
LCALL TRAN
LCALL DISP
LJMP LOOP
DISP:
PUSH ACC
MOV R0,#06H
MOV R1,#40H ;拆字程序的结果放在40H
MOV R2,#01H
MOV A,R2
FF1:
MOV DPTR,#0102H ; 送位码
MOVX @DPTR,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0101H ;送段码
MOVX @DPTR,A
MOV A,R2
RL A
MOV R2,A
LCALL TIME
INC R1
DJNZ R0,FF1
POP ACC
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

TRAN: ;把30H,31H中数字拆字并转换成BCD码放在40H..45H中
PUSH ACC
MOV R3,#00H
MOV A,31H
ANL A,#0F0H
SWAP A
MOV R3,A
MOV A,31H
ANL A,#0FH
DA A
CJNE R3,#00H,EE1
LJMP EE2
EE1:
ADD A,#16H
DA A
DJNZ R3,EE1
EE2:
MOV R3,A
MOV 40H,#00H
ANL A,#0F0H
SWAP A
MOV 41H,A
MOV A,R3
ANL A,#0FH
MOV 42H,A
MOV A,30H
ANL A,#0F0H
SWAP A
MOV R3,A
MOV A,30H
ANL A,#0FH
DA A
CJNE R3,#00H,EE3
LJMP EE4
EE3:
ADD A,#16H
DA A
DJNZ R3,EE3
EE4:
MOV R3,A
MOV 43H,#00H
ANL A,#0F0H
SWAP A
MOV 44H,A
MOV A,R3
ANL A,#0FH
MOV 45H,A
POP ACC
RET

TIME: ;动态显示用延时程序
PUSH 04H
MOV R4,#20H
TE1:
NOP
NOP
NOP
DJNZ R4,TE1
POP 04H
RET

PKT0: ;定时器0中断程序控制30H,31H加1
INC R5
MOV A,R5
CJNE A,#10,PK1
MOV R5,#00H
INC 30H
INC 31H
PK1:
RETI

END
用proteus仿真,程序显示012345678都可以,但是后面就开始显示乱七八糟的东西。
单独调试显示程序,和单独调试中断程序,都能得到正确结果,实在分析不出问题在哪,请大神帮忙。
最佳答案
  • 五星知识达人网友:有你哪都是故乡
  • 2021-02-15 14:59
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP PKT0
ORG 0100H
MAIN:
SETB EA
SETB ET0
MOV TL0,#00H
MOV TH0,#00H
MOV TMOD,#01H
MOV 30H,#00 ;要显示的两个数字存在30H和31H
MOV 31H,#00
MOV DPTR,#0100H ;8155初始化
MOV A,#03H
MOVX @DPTR,A
SETB TR0
LOOP:
LCALL TRAN
LCALL DISP
LJMP LOOP
DISP:
PUSH ACC
MOV R0,#06H
MOV R1,#40H ;拆字程序的结果放在40H
MOV R2,#01H
MOV A,R2
FF1:
MOV DPTR,#0102H ; 送位码
MOVX @DPTR,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0101H ;送段码
MOVX @DPTR,A
MOV A,R2
RL A
MOV R2,A
LCALL TIME
INC R1
DJNZ R0,FF1
POP ACC
RET
TAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
TRAN: ;把30H,31H中数字拆字并转换成BCD码放在40H..45H中
PUSH ACC
MOV A,31H
MOV B,#100
DIV AB
MOV 42H,A
XCH A,B
MOV B,#10
DIV AB
MOV 41H,A
MOV 40H,B
MOV A,30H
MOV B,#100
DIV AB
MOV 45H,A
XCH A,B
MOV B,#10
DIV AB
MOV 44H,A
MOV 43H,B
POP ACC
RET

TIME: ;动态显示用延时程序
PUSH 04H
MOV R4,#20H
TE1:
NOP
NOP
NOP
DJNZ R4,TE1
POP 04H
RET

PKT0: ;定时器0中断程序控制30H,31H加1
INC R5
MOV A,R5
CJNE A,#10,PK1
MOV R5,#00H
INC 30H
INC 31H
PK1:
RETI
END
全部回答
  • 1楼网友:污到你湿
  • 2021-02-15 16:29
#include #define uchar unsigned char sbit wela=p2^7; sbit dula=p2^6; uchar num; void main() {  tmod=0x01;  th0=(65536-50000)/256;  tl0=(65536-50000)%256;  ea=1;  et0=1;  tr0=1;  while(1)  {  if(num==10)  //亮   {   wela=1;   p0=0xfe;   wela=0;   dula=1;   p0=0x4f;   dula=0;   p0=0xff;   }     if(num==20)//灭   {   num=0;   dula=1;   p0=0xff;   dula=0;   p0=0xff;   }   } } void t0_time()interrupt 1 {  th0=(65536-50000)/256;  tl0=(65536-50000)%256;  num++; }试试看这个
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯