在用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 ;开中断
RE
ti ;中断返回
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
-
仿真是应该没问题,但实物是不行的,我把程序烧进单片机后,刚开始没问题,但按了几个循环后,就会出现死机现象(假设我从00开始按,按一次,变为01,再按一次,变为02,以此类推,有时候我按到25,接着再按一次,应该是26,但他一直是25,无论我再怎么按,也不会变化。)复位后,又能重新开始,正常运行,但按了十几下,又会死机,自从复位后,我就不能按一个循环了,都是按到某个数后就死机。
一周热门 更多>