想了解下面的中断代码的讲解,有些东西不是很懂
表头 |
---|
单元格 |
void int0() interrupt 0//定义外部中断0 |
{ |
static uchar i;//声明静态变量(在跳出函数后在回来执行的时候不会丢失数值)i用于把33次高电平的持续时间存入IRdata |
static bit startflag; //开始储存脉宽标志位
if(startflag) //开始接收脉宽检测
{
if( (IRtime < 53) && (IRtime >= 32) ) /*判断是否是引导码,底电平9000us+高4500us这个自己可以算我以11.0592来算了NEC协议的引导码低8000-10000+高4000-5000 如果已经接收了引导码那么i不会被置0就会开始依次存入脉宽*/
i = 0; //如果是引导码那么执行i=0把他存到IRdata的第一个位
IRdata[i] = IRtime; //以T0的溢出次数来计算脉宽,把这个时间存到数组里面到后面判断
IRtime = 0; //计数清零,下一个下降沿的时候在存入脉宽
i++; //计数脉宽存入的次数
if(i == 33) //如果存入34次 数组的下标是从0开始i等于33表示执行了34次
{
IRok = 1; //那么表示脉宽检测完毕
i = 0; //把脉宽计数清零准备下次存入
}
}
else
{
IRtime = 0; //引导码开始进入把脉宽计数清零开始计数
startflag = 1; //开始处理标志位置1
}
}
/**非自锁按键控制模式:按一下得电,再按一下失电,只要按钮被按下,状态就改变**/
#define KEY (5) //操作对象
#define LED (6) //控制对象 (板载 LED_BUILTIN 13 )
char keyFlag = 0;//按键状态
void setup() {
Serial.begin(9600);
pinMode(KEY,INPUT_PULLUP);//上拉输入模式
pinMode(LED,OUTPUT);
}
void loop() {
if(digitalRead(KEY) == 1){//注意这里是1不是0
delay(10);//消抖处理
if(digitalRead(KEY) == 1){//注意这里是1不是0
keyFlag = 1 - keyFlag ;
Serial.println(keyFlag);
while(digitalRead(KEY));//等待按键被释放
}
}
if(keyFlag == 1){
digitalWrite(LED,HIGH);//这里可以填写其他控制代码
}else{
digitalWrite(LED,LOW);//这里可以填写其他控制代码
}
}
解析;当按键没有被按下的时候,led初始状态是0,低电平,按键检测一直会停留在
while(digitalRead(KEY));
这里检测,当按键被按下时,就跳出来了,led的状态就改变,如果需要再次改变led灯的状态时,需要再次进入到第一个if条件成立的语句里才行,想要条件成立,必须释放按键才行。
注释这么详细了,还有哪里不懂?