小女子我初学单片机,很多不懂得地方,向大家请教下啊
关于使用外部中断点亮发光二极管的问题,为实现同一功能,写了两方案,具体程序和问题如下
方案一:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT
MAIN: SETB EA /*首先开启总中断 */
SETB EX0 /*开启外部中断 0 */
SETB IT0 /* 设置成 下降沿触发方式*/
MOV R7,#8
MOV DPTR,#TMPDATE
L0: SJMP L0
INT: DJNZ R7,L1 /*外部中断 0 每按一次主板上的"INT0"键,中断响应,调用该函数,我们从P2口输出点亮发光二极管*/
MOV R7,#8
L1: MOV A,R7
MOVC A,@A+DPTR
CPL A P口输出低电平时点亮发光二极管
MOV P2,A
RETI
tmpdate: DB 01H,02H,04H,08H,10H,20H,40H,80H /*定义常量做为输出*/
END
现象:每按一次键,P2口接的发光二极管按顺序点亮相应的一位,但当第8次按键时,所有二极管都亮了:L
理论上只亮最边上的一位啊
方案二
只是改变了查表的方法,直接改变地址指针
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT
ORG 0030H
MAIN:SETB EA
SETB EX0
SETB IT0
MOV DPTR,#TABLE
MOV R1,#08H
LOOP:LJMP LOOP
INT: CLR A
MOVC A,@A+DPTR
CPL A
MOV P2,A
DJNZ R1,L1
MOV R1,#08H
MOV DPTR,#TABLE
SJMP L2
L1: INC DPTR
L2: RETI
TABLE:DB 01H,02H,04H,08H,10H,20H,40H,80H
END
结果正常
问题:为什么第一种情况会8个二极管全亮,我没有给P2口送#00H(即表中没有#0FF数据项)啊:Q
没想通,请大虾赐教啊,谢谢了
中断位不会自动清零.
51单片机外部中断问题
小女子我初学单片机,很多不懂得地方,向大家请教下啊
关于使用外部中断点亮发光二极管的问题,为实现同一功能,写了两方案,具体程序和问题如下
方案一:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT
MAIN: SETB EA /*首先开启总中断 */
SETB EX0 /*开启外部中断 0 */
SETB IT0 /* 设置成 下降沿触发方式*/
MOV R7,#8
MOV DPTR,#TMPDATE
L0: SJMP L0
INT: DJNZ R7,L1 /*外部中断 0 每按一次主板上的"INT0"键,中断响应,调用该函数,我们从P2口输出点亮发光二极管*/
MOV R7,#8
L1: MOV A,R7
MOVC A,@A+DPTR
CPL A P口输出低电平时点亮发光二极管
MOV P2,A
RETI
中断随设定的是边沿,但也是硬逻辑把边沿变成电平,所以需要你清0.
INT: DJNZ R7,L1 /*外部中断 0 每按一次主板上的"INT0"键,中断响应,调用该函数,我们从P2口输出点亮发光二极管*/
MOV R7,#8
L1: MOV A,R7
MOVC A,@A+DPTR
虽然表里面没有0FFH的数据 但是执行你的程序的时候 容易出现0FFH,就是DJNZ R7,L1 你在前面加上一句判断R7是否为0 为0就跳转 那么就能避免这个情况发生
南京璞晓电子 www.cpx0.com需要
msn:njlianjian@hotmail.com
MOV R7,#8
这句话改成
MOV R7,#7
重新编译看看。
谢谢各位了,问题解决了
原因出在没正确理解DJNZ这条指令
INT: DJNZ R7,L1
MOV R7,#8
L1: MOV A,R7
当R7=1,执行DJNZ时,它就顺序执行下一条了,即重新赋值8
然后查表,表的首地址加8后超出了原来表的范围,而表中的第1个数据项却没有得到输出,
所以出现二极管全亮现象
解决方案:将表的第一项数据加到表最后,总共表中有9个数据,而有效的只有后8项,因为第一项永远都不会被取出执行。
tmpdate: DB 01H,02H,04H,08H,10H,20H,40H,80H,01H
问题解决了,好高兴啊:D
呵呵,看来现在汇编还是有很多人在用啊。
由此看来,还是不能把汇编丢弃了,毕竟汇编是基础