(2)用一个GPIO口模拟IR,来输出到另一个接收端,程序如下:
void Simulate_IR_Init(void) //GPIO初始化
{
MFT4MOD=0;
PTDIR0_4=1; //设置输出
IR_LINE=1; //默认为高,IR脚的默认电平也是为高
}
void T_560US(void)
{
BusWait(_560us); //使用一定的机器时间来耗时,精度可以用示波器来测出
}
void T_1680US(void) //3个560US
{
T_560US();
T_560US();
T_560US();
}
void T_500US(void)
{
BusWait(_500_us);
}
void T_1MS(void)
{
T_500US();
T_500US();
}
void T_9MS(void) //开始码
{
T_1MS();
T_1MS();
T_1MS();
T_1MS();
T_1MS();
T_1MS();
T_1MS();
T_1MS();
T_1MS();
}
void T_4_5_MS(void) //结果码
{
T_1MS();
T_1MS();
T_1MS();
T_1MS();
T_500US();
}
void send_d0(void) //发数据0,参照上述图示反向
{
IR_LINE=0;
T_560US();
IR_LINE=1;
T_560US();
}
void send_d1(void) //发数据1,参照上述图示反向
{
IR_LINE=0;
T_560US();
IR_LINE=1;
T_1680US();
}
void send_ir_byte(uchar tp) //发送一个字节
{
uchar i;
for(i=0;i<8;i++)
{
if(tp&0x80)
{
send_d1();
}
Else
{
send_d0();
}
tp<<=1; //从高位往低位发送
}
}
void ir_start(void) //NEC遥控码起始条件
{
IR_LINE=0;
T_9MS();
IR_LINE=1;
T_4_5_MS();
}
void send_ir_key(uchar key) //发送单个遥控码的完整程序
{
Simulate_IR_Init(); //初始化GPIO
ir_start(); //NEC起始
send_ir_byte(IR_USER_CODE); //客户码
send_ir_byte(~IR_USER_CODE); //客户码反码
send_ir_byte(key); //数据码
send_ir_byte(~key); //数据码反码
IR_LINE=0;
T_560US(); //为了跟最后一个数据位区别开来,如上图所示
IR_LINE=1; //恢复默认的高
}
|