實驗現象:
模拟鍵盤上的←和→按鍵,控制“是男人就下一百層”遊戲。
理論學習:
利用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
}