之前曾经做过一个直接用IO接原遥控接收头输出端的 如果用IO驱动红外二极管的话 那得搞定38K载波先
#define IRCODE_GPIO 4 //Pin8 GPIO4
extern const BYTE ir_mapcode[];
static BYTE get_ircode(BYTE IrFunc)
{
BYTE i;
for (i = 0; i < 96; i++)
{
if (ir_mapcode[i] == IrFunc)
break;
}
return i;
}
static void delay_necir_clk(BYTE Clk560uS)
{
UINT16 delay10us = Clk560uS * 56 + 1;
while (delay10us --)
{
delay_1us(10);
}
}
static void send_necir_byte(BYTE data)
{
int i ;
for (i = 0; i < 8; i ++)
{
GPIO_O_SET(IRCODE_GPIO, 0);
delay_necir_clk(1);
GPIO_O_SET(IRCODE_GPIO, 1);
if (data & 0x01)
delay_necir_clk(3);
else
delay_necir_clk(1);
data >>= 1;
}
}
void send_necir_flame_data(BYTE IrFunc)
{
BYTE IRcode = 0;
GPIO_F_SET(IRCODE_GPIO, 1);
GPIO_M_SET(IRCODE_GPIO, 1);
GPIO_E_SET(IRCODE_GPIO, 1);
//Lead code
GPIO_O_SET(IRCODE_GPIO, 0);
delay_necir_clk(16);
GPIO_O_SET(IRCODE_GPIO, 1);
delay_necir_clk(8);
//Custom code
send_necir_byte(0x00);
send_necir_byte(0xFF);
//Data code
IRcode = get_ircode(IrFunc);
send_necir_byte(IRcode);
IRcode = 0xFF - IRcode;
send_necir_byte(IRcode);
GPIO_O_SET(IRCODE_GPIO, 0);
delay_necir_clk(9);
GPIO_O_SET(IRCODE_GPIO, 1);
}
|