/******************************************************************** * 文件名 : 红外解码LCD.c * 描述 : 实现了红外解码遥控器上的按键的值并在数码管上显示出来。 按遥控器的“0”会在数码管的最后一位显示0. 按遥控器的“1”会在数码管的最后一位显示1. 。 。 。 。 。 。 。 。 按遥控器的“8”会在数码管的最后一位显示8. 按遥控器的“9”会在数码管的最后一位显示9. 我们在代码中只解码了0--9进行处理,如果大家想解其他的按键,可以在前一个代码, 在1602中查看十六进制的值,在这个代码中对16进制值进行处理。 ***********************************************************************/ #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int uchar distemp; void delay(uchar x); //x*0.14MS void delay1(int ms); sbit IRIN = P3^3; //红外接收器数据线 uchar IRCOM[7]; //数码管的段码编码 uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; /*******************************************************************/ main() { IE = 0x84; //允许总中断中断,使能 INT1 外部中断 TCON = 0x10; //触发方式为脉冲负边沿触发 IRIN=1; //I/O口初始化 delay1(10); //延时 P2 = 7; while(1) { P0 = table[distemp]; delay(20); } } //end main /**********************************************************/ void IR_IN() interrupt 2 using 0 { unsigned char j,k,N=0; EX1 = 0; delay(15); if (IRIN==1) { EX1 =1; return; } //确认IR信号出现 while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。 {delay(1);} for (j=0;j<4;j++) //收集四组数据 { for (k=0;k<8;k++) //每组数据有8位 { while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。 {delay(1);} while (!IRIN) //等 IR 变为高电平 {delay(1);} while (IRIN) //计算IR高电平时长 { delay(1); N++; if (N>=30) { EX1=1; return;} //0.14ms计数过长自动离开。 } //高电平计数完毕 IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0” if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1” N=0; }//end for k }//end for j if (IRCOM[2]!=~IRCOM[3]) { EX1=1; return; } switch(IRCOM[2]) { case 0x16: distemp = 0; break; case 0x0c: distemp = 1; break; case 0x18: distemp = 2; break; case 0x5e: distemp = 3; break; case 0x08: distemp = 4; break; case 0x1c: distemp = 5; break; case 0x5a: distemp = 6; break; case 0x42: distemp = 7; break; case 0x52: distemp = 8; break; case 0x4a: distemp = 9; break; } EX1 = 1; } /**********************************************************/ void delay(unsigned char x) //x*0.14MS { unsigned char i; while(x--) { for (i = 0; i<13; i++) {} } } /**********************************************************/ void delay1(int ms) { unsigned char y; while(ms--) { for(y = 0; y<250; y++) { _nop_(); _nop_(); _nop_(); _nop_(); } } }