Arduino 團購中買了 DFRobot LCD Keypad Shield, 取貨後即試玩. 但沒有跟原理圖, 只好上網找.
DFRobot website 只說 LCD 用了 digital PIN 4, 5, 6, 7, 8, 9 和 Keypad 用了 analog PIN A0. 經再三找尋, 終於有以下設定:- LCD Arduino
- ---------------
- RS 8
- Enable 9
- D4 4
- D5 5
- D6 6
- D7 7
複製代碼 咁 Shield 上的 5 個 keys 呢? 根據資料, 每個 按下後, A0 讀數不同, 所以先寫程式去讀此數据:- /* LCD Keypad Shield
- Author: acw@home
- Aug 25, 2009
-
- LCD PIN assignment:
- LCD Arduino
- -------------------
- RS 8
- ENABLE 9
- D4 4
- D5 5
- D6 6
- D7 7
- Keypad PIN = A0
- */
- #include <LiquidCrystal.h>
- // analog PIN A0
- #define KEY_PIN 0
- LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
- int key;
- int last_key = -1; // save the last key pressed
- void setup()
- {
- lcd.begin(16, 2);
- lcd.print("Press any key");
- }
- void loop()
- {
- key = analogRead(KEY_PIN);
- if (key != last_key) {
- lcd.setCursor(0, 1);
- lcd.print(key);
- lcd.print(" ");
- last_key = key;
- }
- }
複製代碼 上載程式到 Arduino 執行, 按下每個 key, 得到以下數据:- Key Value
- --------------
- RIGHT 0
- UP 145
- DOWN 329
- LEFT 504
- SELECT 739
- <NONE> 1023
複製代碼 根據以上數据, 更改程式嘗試:- /* LCD Keypad Shield
- Author: acw@home
- Aug 25, 2009
-
- LCD PIN assignment:
- LCD Arduino
- -------------------
- RS 8
- ENABLE 9
- D4 4
- D5 5
- D6 6
- D7 7
- Keypad PIN = A0
- Key pressed A0 Reading
- --------------------------------
- RIGHT 0
- UP 145
- DOWN 329
- LEFT 504
- SELECT 739
- <NONE> 1023
- */
- #include <LiquidCrystal.h>
- enum {
- KEY_RIGHT,
- KEY_UP,
- KEY_DOWN,
- KEY_LEFT,
- KEY_SELECT,
- NUM_KEYS
- };
- #define LED_PIN 13
- #define KEY_PIN 0
- #define KEY_NONE 1020
- LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
- int key_val[]= { 140, 320, 500, 730, KEY_NONE };
- char *key_name[] = { "right", "up", "down", "left", "select" };
- int key;
- int last_key; // save the last key pressed
- void setup()
- {
- lcd.begin(16, 2);
- lcd.print("Press any key");
- last_key = KEY_NONE;
- }
- int readKey(int pin)
- {
- int n, key_in;
-
- n = analogRead(KEY_PIN);
- if (n < KEY_NONE) {
- // a key is pressed
- digitalWrite(LED_PIN, HIGH); // turn on LED
- // show the A0 reading
- lcd.setCursor(0, 0);
- lcd.print("Value: ");
- lcd.print(n);
- lcd.print(" ");
- // wait for the key being released
- do {
- key_in = n;
- n = analogRead(KEY_PIN);
- } while (n < KEY_NONE);
- digitalWrite(LED_PIN, LOW); // turn off LED
- // decode the key
- for (int i=KEY_RIGHT; i<NUM_KEYS; ++i) {
- if (key_in < key_val[i]) {
- return i;
- }
- }
- }
- return KEY_NONE;
- }
- void loop()
- {
- key = readKey(KEY_PIN);
- if (key != KEY_NONE && key != last_key) {
- lcd.setCursor(0, 1);
- lcd.print("Key : ");
- lcd.print(key_name[key]);
- lcd.print(" ");
- last_key = key;
- }
- }
複製代碼 上載程式到 Arduino 執行, 按下 DOWN key, 得到以下:
|