树莓派红外遥控加中断问题

ccqo 2020-12-241074 次点击
进入中断后,一直存在遥控的信号

```
#include <wiringPi.h>
#include <softPwm.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <lirc/lirc_client.h>
#include <time.h>

#define uchar unsigned char
#define uint unsigned int


#define JDQ1 0
#define JDQ2 1
#define JDQ3 3
#define JDQ4 27
#define XJKG1 25
#define XJKG2 6
int temp,temb;
int flag ;
int flag1;

void XJKGZT1(void);
int JDQ(int i);


uchar QT[6] = {‌‌0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uchar OC[2] = {‌‌0xff, 0x00};

char *keymap[21] =
{‌‌
" KEY_CHANNELDOWN ",//1
" KEY_CHANNEL ",//2
" KEY_CHANNELUP ",//3
" KEY_PREVIOUS ",//4
" KEY_NEXT ",//5
" KEY_PLAYPAUSE ",//6
" KEY_VOLUMEDOWN ",//7
" KEY_VOLUMEUP ",//8
" KEY_EQUAL ",//9
" KEY_NUMERIC_0 ",//10
" BTN_0 ",//11
" BTN_1 ",//12
" KEY_NUMERIC_1 ",//13
" KEY_NUMERIC_2 ",//14
" KEY_NUMERIC_3 ",//15
" KEY_NUMERIC_4 ",//16
" KEY_NUMERIC_5 ",//17
" KEY_NUMERIC_6 ",//18
" KEY_NUMERIC_7 ",//19
" KEY_NUMERIC_8 ",//20
" KEY_NUMERIC_9 "};//21

void delay(unsigned int howLong)
{‌‌
uchar z;
while(howLong--)
{‌‌
for(z=1;z<20;z++);

}

}



void JDQInit(void)
{‌‌
softPwmCreate(JDQ1, 0, 100);
softPwmCreate(JDQ2, 0, 100);
softPwmCreate(JDQ3, 0, 100);
softPwmCreate(JDQ4, 0, 100);


}

void JDQSet()
{‌‌
softPwmWrite(JDQ1, QT[0]);
softPwmWrite(JDQ2, QT[1]);
softPwmWrite(JDQ3, QT[2]);
softPwmWrite(JDQ4, QT[3]);

}

int key(char *code)
{‌‌
int i;
int num;
for (i=0; i<21; i++)
{‌‌
if (strstr(code, keymap[i]))
{‌‌
num = i;
}
}
return num + 1;
}

void XJKGZT ()
{‌‌

flag = ~digitalRead(JDQ1);
flag1 = ~digitalRead(JDQ2);
while(1)
{‌‌
if(digitalRead(XJKG1) == LOW)
{‌‌
delay(1000);

while(1)
{‌‌
digitalWrite(JDQ1,flag);
digitalWrite(JDQ2,flag1);
delay(60000);
printf("REVERSE \n");

if(digitalRead(XJKG2)==LOW)
{‌‌
return ;
}
}

}

if(digitalRead(XJKG2)==LOW)
{‌‌
delay(1000);
if(digitalRead(XJKG2) == LOW)
{‌‌
while(1)
{‌‌

digitalWrite(JDQ1, LOW);
digitalWrite(JDQ2, LOW);
printf("STOP \n");
delay(100);
break;

}
}
}


}

}

int JDQ(int i)//switch
{‌‌
switch(i)
{‌‌
case 1:
{‌‌
QT[0] = OC[0];
QT[1] = OC[1];
printf("JQD1 OPEN\n");
break;
}
case 2:
{‌‌

QT[0] = OC[1];
QT[1] = OC[0];
printf("JDQ2 OPEN\n");
break;
}

case 3:
{‌‌
QT[0] = OC[1];
QT[1] = OC[1];
printf("JDQ1,2 OFF\n");
break;
}
case 4:
{‌‌
QT[2] = OC[0];
printf("JDQ3 ON\n");
break;
}
case 5:
{‌‌
QT[2] = OC[1];
printf("JDQ3 OFF\n");
break;
}
case 7:
{‌‌
QT[3] = OC[0];
printf("XJBZ ON\n");
break;
}
case 8:
{‌‌
QT[3] = OC[1];
printf("XJBZ OFF\n");
break;
}
case 9:
{‌‌
QT[0] = OC[1];
QT[1] = OC[1];
QT[2] = OC[1];
QT[3] = OC[1];
printf("ALL OFF\n");
break;
}

}
}







int main(void)
{‌‌
struct lirc_config *config;
int buttonTimer = millis();

char *code;
char *c;



if(wiringPiSetup() == -1)
{‌‌
printf("setup wiringPi failed !");
return 1;
}

pinMode(JDQ1, OUTPUT);
pinMode(JDQ2, OUTPUT);
pinMode(JDQ3, OUTPUT);
pinMode(JDQ4, OUTPUT);
pinMode(XJKG1, INPUT);
pinMode(XJKG2, INPUT);
pullUpDnControl(XJKG1, PUD_UP);
//pullUpDnControl(XJKG2, PUD_UP);

if(lirc_init("lirc",1)==-1)
exit(EXIT_FAILURE);

JDQInit();
JDQSet();



//wiringPiISR(XJKG1,INT_EDGE_FALLING,&XJKGZT);
if(lirc_readconfig(NULL,&config,NULL)==0)
{‌‌
while(lirc_nextcode(&code)==0)
{‌‌
if(code==NULL) continue;
{‌‌
if (millis() - buttonTimer > 400)
{‌‌

JDQ(key(code));

JDQSet(OC);

}

wiringPiISR(XJKG1,INT_EDGE_FALLING,&XJKGZT);




}
free(code);

}
lirc_freeconfig(config);

}
lirc_deinit();



exit(EXIT_SUCCESS);

return 0;
}
```
收藏 ♥ 感谢
Spoony 小组长 2020-12-24 
没试过,你的代码我就不看了
这边有一份不依赖 lirc 库的实现,有兴趣可以参考
https://shumeipai.nxez.com/2017/03/06/c-program-ir-for-hifibox-dac-runeaudio.html

登录注册 后可回复。




› 相关内容关注微信公众号