我用AT89S52的int0口接收TC9012红外遥控器发出的红外信号,硬件是没问题,红外信号现在也能正常接收且显示。但问题是一旦遥控器按键长按的话,就感觉好像程序一直在中断程序里跑不出来,短按就没问题。 比如说我用遥控器代替键盘做个电子琴,如果遥控器短按的话,蜂鸣器发出的声音可以连续,但长按的话,蜂鸣器只响一声,就不想了 #include<reg51.h>
sbit remin=P3^2; sbit dout=P3^5; unsigned char a,b; unsigned char rdata; unsigned char code table[8][2]={0xfe,0x22,0xfe,0x56,0xfe,0x85,0xfe,0x9a,0xfe,0xc1,0xfe,0xe4,0xff,0x03,0xff,0x11} ; #define aa 0 #define ab 1 #define ac 2 #define ad 3 #define ae 4 #define af 5 #define ag 6 #define aaa 7 #define stop 30
asd( ) interrupt 3 using 1 { TH1=a;TL1=b; dout=~dout; }
REM()interrupt 0 using 1 { unsigned int x; unsigned char a,b,c,remdata1[4]; for(x=0;!remin&&x<0x180;x++); //引导码 if(x<0x100||x>0x160) goto remout; for(x=0;remin&&x<0x180;x++); if(x<0x100||x>0x160) goto remout; TF0=TH0=TL0=a=b=c=0,TMOD|=1,TR0=1; do {while(b<8) {while(!TF0&&!remin);if(TF0)goto remout; while(remin);if(TF0)goto remout; a>>=1;if(TH0>6)a|=0x80;TH0=TL0=0;b++; }b=0;remdata1[c]=a;a=0; } while(c++<3); // 地址吗效验 if(remdata1[0]==remdata1[1]){if(remdata1[2]==~remdata1[3])rdata=remdata1[2];}// 指令校验 remout: ; }
main() { TMOD=0x10; EA=1; ET1=1; TR1=0; EX0=1;
while(1) { if(rdata==aa) {a=table[0][0];b=table[0][1];TR1=1;} else if (rdata==ab) {a=table[1][0];b=table[1][1];TR1=1;} else if (rdata==ac) {a=table[2][0];b=table[2][1];TR1=1;} else if (rdata==ad) {a=table[3][0];b=table[3][1];TR1=1;} else if (rdata==ae) {a=table[4][0];b=table[4][1];TR1=1;} else if (rdata==af) {a=table[5][0];b=table[5][1];TR1=1;} else if (rdata==ag) {a=table[6][0];b=table[6][1];TR1=1;} else if (rdata==aaa) {a=table[7][0];b=table[7][1];TR1=1;} else if (rdata==stop) TR1=0; } } |