标签:
launch pad接收红外信号经此程序处理后以不同的值保存在char red中,数码管显示出按键对应的char red的值。可由此修改程序完成遥控。
此例中红外线发射格式:9ms高电平引导码+4.5ms结果码+53.76ms逻辑编码(有效数据)区,在逻辑编码区内的串行数据,0.56ms 的低电平+0.56ms 的高电平编码为0, 0.56ms 的低电平+ 1.68ms 的高电平编码为1。
//引脚:p2.3,p2.4,p1口控制数码管的扫描显示。P2.0为红外接受输入口。 #include <msp430.h> #define IRIN (P2IN&BIT0) //红外接收头输入值 unsigned char red,new; unsigned char Time,dat[4]; unsigned char CODE[17]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 }; /* * 延时 */ void delay_1ms(unsigned int nValue)//delay 1ms at 8M { unsigned int nCount; unsigned int ii; unsigned int jj; nCount = 1980; for(ii = nValue;ii > 0;ii--) { for(jj = nCount;jj > 0;jj--) _NOP(); } } void delay_5us(unsigned int nValue)//delay 5us at 8M { unsigned int ii; for(ii = 2*nValue;ii > 0;ii--) { _NOP();_NOP();_NOP();_NOP(); _NOP();_NOP();_NOP();_NOP(); _NOP();_NOP();_NOP();_NOP(); _NOP();_NOP();_NOP();_NOP(); } } /******************************************************************************** * Show() ********************************************************************************/ void Show() { int i; for( i=0;i<3;i++ ) { char x,y,z; x=red%10; y=red/10 %10; z=red/100 %10; switch(i) { case 0:P2OUT =0X00; P1OUT=CODE[x]; break; case 1:P2OUT =BIT3; P1OUT=CODE[y]; break; case 2:P2OUT =BIT4; P1OUT=CODE[z]; break; } } } /******************************************************************************* * 函数名 : ReadIr() * 函数功能 : 获取红外数值 * 说明 :用示波器观察红外接收头输出波形或者参考相关资料来解码, * 本例中9ms高电平引导码+4.5ms结果码+53.76ms逻辑编码(有效数据)区, * 在逻辑编码区内的串行数据,0.56ms 的低电平+0.56ms 的高电平编码为0, 0.56ms 的低电平+ 1.68ms 的高电平编码为1, * 编码结果共 32 位,占用 4 个字节,其高字节 C31-C24 为遥控器识别码,C23-C16 为 * 遥控器识别码的反码,即遥控识别码和遥控识别反码之和为 0xFFFF, * 按键操作码是不同遥控器的识别码,即不同遥控器的遥控识别码不同,同一遥控器不同按键的遥控识别码相同。 * 其低字节 C15-C8 为按键操作码,C7-C0 为按键操作码的反码,即按键操作码和按键操作 * 反码之和为 0xFFFF,同一遥控器不同按键的按键操作码不同。 *******************************************************************************/ void ReadIr(void) { char j,k,n=0; if((P2IFG&BIT0) == BIT0) { P2IFG &= ~BIT0; //清除P1.0中断标志 P2IE &=~BIT0; //关闭P1.0中断功能 delay_1ms(2); if (IRIN==1) { P2IE |=BIT0; return; } while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。 { delay_5us(28); n++; if(n>100){P2IE|=BIT0;return;} } n=0; for (j=0;j<4;j++) { for (k=0;k<8;k++) { while (IRIN) //等 IR 变为低电平 { delay_5us(28); } while (!IRIN) //等 IR 变为高电平 { delay_5us(28); } while (IRIN) //计算IR高电平时长 { delay_5us(28); n++; if (n>=30){P2IE|=BIT0;return;} } dat[j]=dat[j] >> 1; if (n>=11) {dat[j] = dat[j]|0x80;} n=0; } } if ((dat[2]+dat[3])!= 0xff) {P2IE|=BIT0;return;} P2IE|=BIT0; new=1; red=dat[2]; } delay_1ms(10); } /**************************************************************************** *函数名:main *输 入:无 *输 出:无 *功 能:主函数 ****************************************************************************/ void main (void) { WDTCTL = WDTPW + WDTHOLD; if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF) { while(1); // If calibration constants erased do not load, trap CPU!! } BCSCTL1 = CALBC1_8MHZ; // Set range DCOCTL = CALDCO_8MHZ; // Set DCO step + modulation */ P1DIR =0xff; P2DIR =0xfe; P2IES |=BIT0; P2IE |=BIT0; _EINT(); while(1) { Show(); } } #pragma vector=PORT2_VECTOR __interrupt void CNM() { ReadIr(); }
标签:
原文地址:http://www.cnblogs.com/chuckle/p/4524111.html