(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; //恢复默认的高
- }
|