汇编语言:STC89C52,两位共阴极数码管数字停止不动,不会变化

2019-07-15 09:08发布

在用STC89C52,来实现用两位共阴极数码管对外部中断0也就是P3.2口按下次数显示时,实际运行后发现会出现按到某个数值时,再次按下时并不反应,数字停止不动。请教大神,这是什么原因,恳请大神们帮帮忙,实在是搞不懂。程序如下:
ORG 0000H ;上电复位入口地址
LJMP MAIN
ORG 0003H  ;外部中断入口
LJMP IOTN0
ORG 0100H

MAIN:
MOV IE,#81H  ;开总中断,开INT0中断
MOV TCON,#00H  ;设置INT0为低电平触发
MOV P0,#0FFH   ;1111 1111
MOV R0,#00H    ;0000 0000
MOV R1,#00H    ;0000 0000
MOV R2,#0AH    ;0000 1010
MOV R3,#0AH    ;0000 1010
MOV DPTR,#TAB  ;将TAB这个表的首地址赋值给数据指针DPTR
MOV SP,#60H
START:MOV A,R0 ;将0000 0000给A
MOVC A,@A+DPTR ;将A中的值,加上DPTR里的值,访问程序段中这个地址的值,取出来送给A。
MOV P2,A    ;将A送到P2口
CLR P0.0    ;显示个位数
ACALL DELAY1MS ;调用延时函数
SETB P0.0  ;灭掉个位数
MOV A,R1  ;将0000 0000给A
MOVC A,@A+DPTR  ;将A中的值,加上DPTR里的值,访问程序段中这个地址的值,取出来送给A。
MOV P2,A   ;将A送到P2口
CLR P0.1   ;显示十位数
ACALL DELAY1MS  ;调用延时函数
SETB P0.1    ;灭掉十位数
JMP START   ;循环执行START
IOTN0:MOV IE,#00H  ;关中断
JB P3.2,LOOP0    ;位判1转
ACALL DELAY250MS   ;调用延时函数
JNB  P3.2,$     ;位判0转
INC R0      ;R0<--(R0)+1
DEC R2      ;R2<--(R2)-1
MOV A,R2     ;将R2给A
JZ LOOP1     ;对A判0转
MOV IE,#81H
CLR IE0    ;开中断
REti      ;中断返回
LOOP0:
RET       ;返回
LOOP1:
MOV R0,#00H     ;0000 0000给R0
MOV R2,#0AH     ;0000 1010给R2
INC R1      ;R1<--(R1)+1
DEC R3      ;R3<--(R3)-1
MOV A,R3     ;R3给A
JZ LOOP2     ;对A判0转
MOV IE,#81H     ;开中断
RETI     ;中断返回
LOOP2:
MOV R1,#00H     ;0000 0000给R1
MOV R3,#0AH     ;0000 1010给R3
MOV IE,#81H     ;开中断
RETI      ;中断返回
TAB:DB 0F6H,50H,0C7H,0D3H,71H,0B3H,0B7H,0D0H,0F7H,0F3H  ;0123456789
DELAY250MS:MOV R6,#250    ;1us
DL1:MOV R7,#249      ;1us
DL0:NOP        ;1us
   NOP        ;1us
   DJNZ R7,DL0      ;(2+2)*249=996
   DJNZ R6,DL1      ;1+(2+996)*250=249 501 us=250ms
    RET        ;返回
DELAY1MS:MOV R7,#249    ;1us
DL:NOP        ;1us
   NOP        ;1us
   DJNZ R7,DL      ;1+(2+2)*249=997us=1ms
    RET        ;返回
END

微信图片_20171219213541.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
LG桦
1楼-- · 2019-07-15 17:57
李雷 发表于 2017-12-21 16:39
你的中断一出来,在主循环循环一次就有和原来一样了,而主循环一次是很快的,所以看起来显示不变化。
你可以设置断点调试一下,看看运行状态

谢谢你,那个,我是新手,不太会那设置断点调试。呃,我的那个现象是:上电后,我每按一次按钮,就进入一次中断,然后数码管就相当于计数我按的次数,即,假设我按了三次,数码管就显示3,但有时候我接着再按,他就不计数,数码管就一直显示3不动,无论我怎么按都没变化了,我个人认为这是所谓的死机(程序跑飞)应该不是主循环的问题。
人中狼
2楼-- · 2019-07-15 19:32
LOOP0:
RET       ;返回
这里应该是RETI
Lelouch12306
3楼-- · 2019-07-16 00:19
RET改为RETI应该就可以啦
LG桦
4楼-- · 2019-07-16 01:45
 精彩回答 2  元偷偷看……
LG桦
5楼-- · 2019-07-16 06:47
人中狼 发表于 2017-12-23 18:45
LOOP0:
RET       ;返回
这里应该是RETI

不太行,还是会死机
LG桦
6楼-- · 2019-07-16 09:33
Lelouch12306 发表于 2017-12-23 22:21
RET改为RETI应该就可以啦

还是会死机

一周热门 更多>