接收器有三个管脚(左:输出,中:电源负,右:电源正)
配置该管脚为普通输入、启用内部上拉电阻、并注册中断函数;
- IoSetFunc(WIFI_IOT_IO_NAME_GPIO_6, WIFI_IOT_IO_FUNC_GPIO_6_GPIO);
- GpioSetDir(WIFI_IOT_IO_NAME_GPIO_6, WIFI_IOT_GPIO_DIR_IN);
- IoSetPull(WIFI_IOT_IO_NAME_GPIO_6, WIFI_IOT_IO_PULL_UP);
- GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_6, WIFI_IOT_INT_TYPE_EDGE, WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW, rc_decode, NULL);
有输出(下降沿)的时候触发中断,中断里读取us时钟;
- 然后判断本次中断与上一次中断的时间间隔;
- 如果在13500(9000+4500)左右,说明接收到了一个引导信号,准备接收数据;
- 如果在1120(560+560)左右,说明接收到一个 bit 0,接收数据不变,接收序号++;
- 如果在2240(560+1680)左右,说明接收到一个 bit 1,接收数据与上接收序号所在的位为1;
- 如果接收序号=32说明该次接收结束
- 判断第3个字节与第4个字节是否刚好是互补的,成功可执行命令解析执行相关操作。
- static void rc_decode(char *arg)
- {
- (void) arg;
- time_r = hi_get_us();
- // t = 13500
- if(time_r – time_c > 13000 && time_r – time_c < 14000)
- {
- n = 0;
- data.Int = 0;
- }
- // t = 1120
- if(time_r – time_c > 920 && time_r – time_c < 1320)
- {
- ++n;
- }
- // t = 2250
- if(time_r – time_c > 2050 && time_r – time_c < 2450)
- {
- data.Int |= 1<
- ++n;
- }
- if(n == 32)
- {
- if ((data.Char[2] ^ data.Char[3]) == 0xff)
- {
- //printf("user_code:%x\tcom_code:%x\n", data.Short[0], data.Char[2]);
- switch_key(data.Char[2]);
- }
- data.Int = 0;
- }
- time_c = time_r;
- }
要获取每个按键的命令码是什么,可以直接打印到串口
- printf("user_code:%x\tcom_code:%x\n", data.Short[0], data.Char[2]);
然后对不同的键码进行一个switch操作就OK了!
- void switch_key(unsigned char key)
- {
- switch(key)
- {
- case 0x99: block_left();break;
- case 0xc1: block_right();break;
- case 0xca: game_stop();break;
- case 0xd2: block_down();break;
- case 0xce: block_turn();break;
- }
- }
三、同时也实现了红外编码