天天看点

24.USB键盘模拟实验

实验现象:

  模拟键盘上的←和→按键,控制“是男人就下一百层”游戏。

理论学习:

  利用Leonardo板子的USB控制器,模仿一个USB键盘。

  关于USB键盘的资料,请查看官方网站:

  http://arduino.cc/en/Reference/KeyboardWrite

  关于键盘上的按键名称和键值,请查看:

  http://arduino.cc/en/Reference/KeyboardModifiers

  关于 ASCII 码表,请查看:

  http://www.asciitable.com/ 

程序代码:

#define KEY1 2          //向左按键
#define KEY2 3          //向右按键
 
int Flag_up = 1;
 
void setup()
{
  pinMode(KEY1, INPUT_PULLUP);
  pinMode(KEY2, INPUT_PULLUP);
  Keyboard.begin();
}
  
void loop()
{
  if( ScanKey(1) == 1)          //向左按键按下
  {
    Keyboard.press(KEY_LEFT_ARROW); //向电脑发送向左按键按下的指令
    delay(50);     
    Keyboard.releaseAll();      //向电脑发送按键释放的指令
  }
  else if(ScanKey(1) == 2)  //向右按键按下
  {
    Keyboard.press(KEY_RIGHT_ARROW);    //向电脑发送向右按键按下的指令
    delay(50);
    Keyboard.releaseAll();      //向电脑发送按键释放的指令
  }
}
 
unsigned char ScanKey(int mode)     //按键扫描程序,返回键值
{
  if(mode)              //mode = 1时候,该代码支持长按。mode = 0时候,不支持长按
  {
    Flag_up = 1;
  }
   
  if(Flag_up  && (digitalRead(KEY1) == LOW || digitalRead(KEY2) == LOW) )  //当Flag_up = 1并且按键按下时
  {
    Flag_up = 0;                    //清空Flag_up
    delay(10);                      //延时去抖动
    if(digitalRead(KEY1) == LOW)            //按键按下
    {
      return 1;                     //返回键值1
    }
    if(digitalRead(KEY2) == LOW)            //按键按下
    {
      return 2;                     //返回键值1
    }
  }
  if(digitalRead(KEY1) == HIGH && digitalRead(KEY2) == HIGH)        //按键松开时候
  {
    Flag_up = 1;                            //置位Flag_up
  }
  return 0;                             //返回键值0
}
           
24.USB键盘模拟实验
24.USB键盘模拟实验

继续阅读