实验现象:
模拟键盘上的←和→按键,控制“是男人就下一百层”游戏。
理论学习:
利用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
}