#include "IR.h"
#define CPU_F ( (double) 8000000)
#define delay_us( x ) __delay_cycles( (long) (CPU_F * (double) x / 1000000.0) )
#define delay_ms( x ) __delay_cycles( (long) (CPU_F * (double) x / 1000.0) )
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define u8 unsigned char
#define u16 unsigned int
uchar KEY_VAL = 0; /* 遥控的值 */
unsigned char code[4] = { 0x00, 0x00, 0x00, 0x00 }; //地址码,地址反码,数据码,数据反码
/*
* ***********************************************************************
* MSP430IO口初始化
* ***********************************************************************
*/
void initIRGPIO()
{
RED_IN;
P2IE |= BIT0;
P2IES |= BIT0;
P2IFG = 0;
}
/*
* *************************************************************************
* 遥控器键值赋功能值子程序
* *************************************************************************
*/
void Key_Icode(void)
{
switch (code[2])
/* 第3个字节是数据,第4个字节是反码 */
{ /* 为了更稳定,可以加上第4个字节数据的判断 */
case KEY_0:
KEY_VAL = 0;
break;
case KEY_1:
KEY_VAL = 1;
break;
case KEY_2:
KEY_VAL = 2;
break;
case KEY_3:
KEY_VAL = 3;
break;
case KEY_4:
KEY_VAL = 4;
break;
case KEY_5:
KEY_VAL = 5;
break;
case KEY_6:
KEY_VAL = 6;
break;
case KEY_7:
KEY_VAL = 7;
break;
case KEY_8:
KEY_VAL = 8;
break;
case KEY_9:
KEY_VAL = 9;
break;
case KEY_POWER:
KEY_VAL = 10;
break;
default:
KEY_VAL = 67;
break;
}
}
extern void doUserKeyInput(unsigned char keyValue);
//*********************红外遥控器中断程序*******************//
#pragma vector=PORT2_VECTOR //中断程序的格式:#pragma vector=中断矢量
__interrupt void port2(void) //格式:__interrupt void 函数名(void)
{
P2IFG = 0X00; //清P1中断标志
unsigned int i = 0, j = 0, time = 0; //time高电平持续时间计数值
if ((P2IN & BIT0) == 0)
{
for (i = 0; i < 7; i++)
{
delay_ms(1);
if (P2IN & BIT0) //9MS内有高电平,则判断为干扰,退出处理程序
{
return;
}
}
while (!(P2IN & BIT0))
; //等待9ms低电平过去,电平变为高电平
for (i = 0; i < 4; i++)
{
for (j = 0; j < 8; j++)
{
while (P2IN & BIT0)
; //等待4.5ms 高电平过去
while (!(P2IN & BIT0))
; //等待变高电平
while (P2IN & BIT0) //计算高电平时间
{
delay_us(100);
time++;
if (time >= 30) //高电平时间过长,则退出处理程序
{
return;
}
}
code[i] = code[i] >> 1; //接收一位数据
if (time >= 8)
{
code[i] = code[i] | 0x80; //高电平时间大于0.56,则为数据1
}
time = 0; //计时清零
}
}
Key_Icode();
}
}
#ifndef __IR
#define __IR
#include "msp430g2553.h"
/* 红外接收头H1838控制脚,单脚控制 */
#define RED_IN P2DIR &= ~BIT0 /* 设置输入,红外接收头接单片机PE3口 */
#define RED_OUT P2DIR |= BIT0 /* 设置输出 */
#define RED_L P2OUT &= ~BIT0 /* 置低电平 */
#define RED_H P2OUT |= BIT0 /* 置高电平 */
#define RED_R (P2IN & BIT0) /* 读电平 */
/*
* ***********************************************************************
* 遥控器键码
* ***********************************************************************
*/
#define KEY_0 0x16 /* 键0 */
#define KEY_1 0x0C /* 键1 */
#define KEY_2 0x18 /* 键2 */
#define KEY_3 0x5E /* 键3 */
#define KEY_4 0x08 /* 键4 */
#define KEY_5 0x1C /* 键5 */
#define KEY_6 0x5A /* 键6 */
#define KEY_7 0x42 /* 键7 */
#define KEY_8 0x52 /* 键8 */
#define KEY_9 0x4A /* 键9 */
#define KEY_POWER 0x45 /* 电源 */
#define KEY_MODE 0x46 /* 模式 */
#define KEY_SOUND 0x47 /* 静音 */
void initIRGPIO();
#endif
KEY_VAL 为全局变量。
while (1)
{
if (KEY_VAL != 0)
{
doUserKeyInput(KEY_VAL); /* 红外输入 传入1234 和硬件的按键一样 */
KEY_VAL = 0; //使用后归0 下次依旧可以使用
}
}
#include "IR.h"
#define CPU_F ( (double) 8000000)
#define delay_us( x ) __delay_cycles( (long) (CPU_F * (double) x / 1000000.0) )
#define delay_ms( x ) __delay_cycles( (long) (CPU_F * (double) x / 1000.0) )
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define u8 unsigned char
#define u16 unsigned int
uchar KEY_VAL = 0; /* 遥控的值 */
uchar code_value = 0;
uchar key_code[4];
/*
* ***********************************************************************
* MSP430IO口初始化
* ***********************************************************************
*/
void initIRGPIO()
{
P2REN |= BIT0 ;
RED_H;
RED_IN;
}
/*
* *************************************************************************
* 遥控器键值赋功能值子程序
* *************************************************************************
*/
void Key_Icode( void )
{
switch ( key_code[2] ) /* 第3个字节是数据,第4个字节是反码 */
{ /* 为了更稳定,可以加上第4个字节数据的判断 */
case KEY_0:
KEY_VAL = 0;
break;
case KEY_1:
KEY_VAL = 1;
break;
case KEY_2:
KEY_VAL = 2;
break;
case KEY_3:
KEY_VAL = 3;
break;
case KEY_4:
KEY_VAL = 4;
break;
case KEY_5:
KEY_VAL = 5;
break;
case KEY_6:
KEY_VAL = 6;
break;
case KEY_7:
KEY_VAL = 7;
break;
case KEY_8:
KEY_VAL = 8;
break;
case KEY_9:
KEY_VAL = 9;
break;
case KEY_POWER:
KEY_VAL = 10;
break;
default:
KEY_VAL = 67;
break;
}
}
/*
* *************************************************************************
* 遥控器解码子程序
* *************************************************************************
*/
void RedCode_UpdataKEY_VAL(void)
{
uchar i, j, k = 0;
for ( i = 0; i < 19; i++ )
{
delay_us( 400 ); /* 延时400us */
if ( RED_R ) /* 9ms内有高电平,则判断为干扰,退出处理程序 */
{
return;
}
}
while ( !RED_R )
; /* 等待9ms低电平过去 */
for ( i = 0; i < 5; i++ ) /* 是否连发码 */
{
delay_us( 500 );
if ( !RED_R )
{
return;
}
}
while ( RED_R )
; /* 等待4.5ms高电平过去 */
for ( i = 0; i < 4; i++ ) /* 接收4个字节的数据 */
{
for ( j = 0; j < 8; j++ ) /* 每个字节的数据8位 */
{
while ( !RED_R )
; /* 等待变高电平 */
while ( RED_R ) /* 计算高电平时间 */
{
delay_us( 100 );
k++;
if ( k > 22 ) /* 高电平时间过长,则退出处理程序 */
{
return;
}
}
code_value >>= 1; /* 接受一位数据 */
if ( k >= 7 )
{
code_value |= 0x80; /* 高电平时间大于0.56,则为数据1 */
}
k = 0; /* 计时清零 */
}
key_code[i] = code_value; /* 四个字节的数据 */
}
Key_Icode(); /* 调用赋值函数 KEY_VAL就是最后值 */
}
#ifndef __IR
#define __IR
#include "msp430g2553.h"
/* 红外接收头H1838控制脚,单脚控制 */
#define RED_IN P2DIR &= ~BIT0 /* 设置输入,红外接收头接单片机PE3口 */
#define RED_OUT P2DIR |= BIT0 /* 设置输出 */
#define RED_L P2OUT &= ~BIT0 /* 置低电平 */
#define RED_H P2OUT |= BIT0 /* 置高电平 */
#define RED_R (P2IN & BIT0) /* 读电平 */
/*
* ***********************************************************************
* 遥控器键码
* ***********************************************************************
*/
#define KEY_0 0x16 /* 键0 */
#define KEY_1 0x0C /* 键1 */
#define KEY_2 0x18 /* 键2 */
#define KEY_3 0x5E /* 键3 */
#define KEY_4 0x08 /* 键4 */
#define KEY_5 0x1C /* 键5 */
#define KEY_6 0x5A /* 键6 */
#define KEY_7 0x42 /* 键7 */
#define KEY_8 0x52 /* 键8 */
#define KEY_9 0x4A /* 键9 */
#define KEY_POWER 0x45 /* 电源 */
#define KEY_MODE 0x46 /* 模式 */
#define KEY_SOUND 0x47 /* 静音 */
void initIRGPIO();
void RedCode_UpdataKEY_VAL(void);
#endif
while (1)
{
RedCode_UpdataKEY_VAL(); //读取红外
if (KEY_VAL != 0)
{
doUserKeyInput(KEY_VAL); /* 红外输入 传入1234 和硬件的按键一样 */
KEY_VAL = 0; //使用后归0 下次依旧可以使用
}
}