开发板鸿蒙Hi3861之俄罗斯方块的历程

接收器有三个管脚(左:输出,中:电源负,右:电源正)

配置该管脚为普通输入、启用内部上拉电阻、并注册中断函数;


  1. IoSetFunc(WIFI_IOT_IO_NAME_GPIO_6, WIFI_IOT_IO_FUNC_GPIO_6_GPIO); 
  2.    GpioSetDir(WIFI_IOT_IO_NAME_GPIO_6, WIFI_IOT_GPIO_DIR_IN); 
  3.    IoSetPull(WIFI_IOT_IO_NAME_GPIO_6, WIFI_IOT_IO_PULL_UP); 
  4.    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个字节是否刚好是互补的,成功可执行命令解析执行相关操作。

  1. static void rc_decode(char *arg) 
  2.  
  3.  
  4. (void) arg; 
  5.  
  6. time_r = hi_get_us(); 
  7.  
  8. // t = 13500 
  9.  
  10. if(time_r – time_c > 13000 && time_r – time_c < 14000) 
  11.  
  12.  
  13. n = 0; 
  14.  
  15. data.Int = 0; 
  16.  
  17.  
  18. // t = 1120 
  19.  
  20. if(time_r – time_c > 920 && time_r – time_c < 1320) 
  21.  
  22.  
  23. ++n; 
  24.  
  25.  
  26. // t = 2250 
  27.  
  28. if(time_r – time_c > 2050 && time_r – time_c < 2450) 
  29.  
  30.  
  31. data.Int |= 1< 
  32.  
  33. ++n; 
  34.  
  35.  
  36. if(n == 32) 
  37.  
  38.  
  39. if ((data.Char[2] ^ data.Char[3]) == 0xff) 
  40.  
  41.  
  42. //printf("user_code:%x\tcom_code:%x\n", data.Short[0], data.Char[2]); 
  43.  
  44. switch_key(data.Char[2]); 
  45.  
  46.  
  47. data.Int = 0; 
  48.  
  49.  
  50. time_c = time_r; 
  51.  

要获取每个按键的命令码是什么,可以直接打印到串口


  1. printf("user_code:%x\tcom_code:%x\n", data.Short[0], data.Char[2]); 

然后对不同的键码进行一个switch操作就OK了!


  1. void switch_key(unsigned char key
  2.     switch(key
  3.     { 
  4.         case 0x99: block_left();break; 
  5.         case 0xc1: block_right();break; 
  6.         case 0xca: game_stop();break; 
  7.         case 0xd2: block_down();break; 
  8.         case 0xce: block_turn();break; 
  9.     } 

三、同时也实现了红外编码

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章