外STC8G部中断0和1产生了中断但是程序执行异常,变量++不执行
#include <stc8g.h>#include <string.h>
#include <stdio.h> // 标准输入输出定义
#include <intrins.h>
sbit WIEGAND_D0 = P3^2;
sbit WIEGAND_D1 = P3^3;
sbit LED = P5^5;
unsigned char i=0;
unsigned char k = 1;
unsigned char j = 1;
volatile unsigned char wiegand_buffer;
volatile unsigned char wiegand_index = 0;
void ExternalInterrupt0() interrupt 0
{
//LED = 1;
k=+1;
//wiegand_buffer = 0x00;
//wiegand_index=wiegand_index+1;
}
void ExternalInterrupt1() interrupt 2
{
//LED = 0;
j=+1;
//wiegand_buffer = 0x01;
//wiegand_index=wiegand_index+1;
}
void Init()
{
P3M0 = 0x00;
P3M1 = 0x00;
P5M0 |= 0x20;
P5M1 &= ~0x20;
EA= 1;//总中断
EX0 = 1;//外部中断0
IT0 = 1;//外部中断0下降沿触发
EX1 = 1;
IT1 = 1;
}
void main()
{
Init();
while (1) {
if (wiegand_index == 26) {
for (i = 0; i < 26; i++) {
putchar(wiegand_buffer);
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
wiegand_index = 0;
memset(wiegand_buffer, 0, sizeof(wiegand_buffer));
}
}
}
变量i和k不++
本帖最后由 huhuan 于 2023-12-2 23:28 编辑
{:sleepy:}你不懂外部引脚中断怎么用,当电平触发达到一次外部引脚中断的状态,就会产生一个中断,但是这个中断只能执行一次,想要才触发就要重新断开一次后再触发一次,
也可以用软件来触发
还有你的外部引脚中断的按键,你注意按键的机械抖动,产生了几次中断
用仿真功能来仿真调试 变量应该最少➕1次,实际有多个下降沿产生的 本帖最后由 huhuan 于 2023-12-2 23:40 编辑
4758866 发表于 2023-12-2 23:28
变量应该最少➕1次,实际有多个下降沿产生的
你编译有没有报错,哪K=+1;的写法 没有报错,用LED状态查看进入 LED的状态可以显示出已经进入中断了,我这个不是按键,是韦根协议数据,主要是后面的程序不执行,正常是执行完了才跳出中断的吧,还是我晶振频率选低了?默认的11.0592 1、+=的应用
如:a+=4,意思是先使a+4,再赋值给a,表达式是a=a+4;
2、=+的应用
如:int a=+10,意思是在定义a为整数型变量的同时把正数10赋值给a。 不管结果多少,变量的值没变,这个只做测试,用++也没用。用的仿真看的 你把程序源码打包过来 ,看看,,{:sweat:}
页:
[1]
2