/***********************************************************
文件名称:红外解码程序
程序功能:将红外遥控的发射信号码解开
***********************************************************/
#include<msp430x14x.h>
typedef unsigned int uint;
typedef unsigned char uchar;
uchar i;
uchar irrec;
uchar irrecok;
uchar irtime;
uchar startflag;
uchar bitnum;
uchar irdata[33];
uchar zhenzhi[4];
uchar disp2[8];
void delaym(uint m);
void zhen_zhi(void); //将32位的客户码和数据码转换成数码管可以显示的16进制数
void disp(void); //将得到的数据通过8位LED数码管显示出来
void delay(void); //简单的延时函数
void xiaoche(void);
void weizhi(void); //将红外遥控器的发射码的33位(2位引导码,16位客户码,16位数据码)每一位解出来,数据放进数组irdata[33]
uint num[]={0xa0,0xf9,0x64,0x70,0x39,0x32,0x22,0xf8,0x20,0x30,0x28,0x23,0xa6,0x61,0x26,0x2e};
uint wei[]={BIT0,BIT1,BIT2,BIT3,BIT4,BIT5,BIT6,BIT7};
void main(void)
{
WDTCTL=WDT_MDLY_0_064; //设置看门狗定时器,定时大约0.5ms
IE1 |=WDTIE; //允许看门狗定时器溢出中断
P1DIR =0X00; //将P1口设置为输出
P1SEL =0X00; //将P1口选作普通I/O口使用
P1IE =0XFF; //打开P1口的中断使能
P1IES =0Xff; //选择所有的P1口为中断接收端口
P1IFG =0X00; //使P1口的所有中断标志位软件清零,因为P1口不能自动将其清零
_EINT(); //允许全局中断
P5DIR=0xff;
P6DIR=0xff;
P6OUT=0x00;
P3DIR =0XFF;
P3OUT =0XFF;
P2DIR =0XFF;
P2OUT =0X00;
while(1) //此循环类似于12864和1602的判忙方式,也是此程序的一个很重要的组成部分
{
if(irrec==1) //
{
zhen_zhi();
irrec=0;
}
if(irrecok==1)
{
weizhi();
irrecok=0;
}
disp();
xiaoche();
}
}
#pragma vector=WDT_VECTOR //看门狗定时器中断函数
__interrupt void watchdog(void)
{
irtime++;
}
#pragma vector=PORT1_VECTOR
__interrupt void p1_int(void)
{
if(P1IFG)
{
if(startflag==1)
{
if(irtime>140)
{
bitnum=0;
}
irdata[bitnum]=irtime;
bitnum++;
irtime=0;
if(bitnum==33)
{
bitnum=0;
irrec=1;
}
}
else
{
startflag=1;
irtime=0;
}
P1IFG=0X00;
}
}
void zhen_zhi(void)
{
uchar value=0;
uchar k=1;
uchar i,j;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
value=value>>1;
if(irdata[k]>22)
{
value=value | 0x80;
}
k++;
zhenzhi[j]=value;
}
}
irrecok=1;
k=1;
}
void weizhi(void)
{
disp2[0]=zhenzhi[0]/16;
disp2[1]=zhenzhi[0]%16;
disp2[2]=zhenzhi[1]/16;
disp2[3]=zhenzhi[1]%16;
disp2[4]=zhenzhi[2]/16;
disp2[5]=zhenzhi[2]%16;
disp2[6]=zhenzhi[3]/16;
disp2[7]=zhenzhi[3]%16;
}
void disp(void)
{
uint i;
for(i=0;i<8;i++)
{
P3OUT=wei[i];P5OUT=num[disp2[i]];delay();P5OUT =0Xff;
}
}
void delay(void)
{
uint i,j,k;
for(i=0;i<100;i++);
}
void xiaoche(void)
{
uint i,j,k;
if(disp2[7]==14) //ting 停
{
//delaym(1);
if(disp2[7]==14)
{
P2OUT =0x00;
//delaym(10);
}
}
if(disp2[7]==3) //jin 进
{
P2OUT =0x96;
//delaym(10);
//P2OUT =0X00;
}
if(disp2[7]==2) //tui 退
{
P2OUT =0x69;
//delaym(10);
//P2OUT =0X00;
}
if(disp2[7]==8) //zuo 左
{
P2OUT =0xaa;
// delaym(10);
//P2OUT=0x00;
}
if(disp2[7]==9) //you 右
{
P2OUT =0x55;
// delaym(10);
//P2OUT=0x00;
}
if(disp2[7]==15) //laba kai
{
P6OUT =0xff;
delaym(10);
}
if(disp2[7]==7) //laba ting
{
P6OUT =0x00;
delaym(10);
}
}
void delaym(uint m)
{
uint i,j;
for(i=0;i<m;i++)
for(j=0;j<1;j++);
}