2020年5月23日 星期六

四.9 4 X 4 鍵盤與I2C介面LCD顯示器實習


一般的七段LED顯示器必須使用到8隻IO接腳,而且可顯示的訊息也很有限(一般可顯示0~8及A~F),如果使用ESP8266去驅動單一的七段LED顯示器就會面臨只剩一隻IO腳位可用的窘境因此假如有需要在系統上顯示文數字訊息的話最好改用LCD顯示器而且是只需要2隻接腳的I2C介面LCD顯示器本範例就是結合前面【四.6 16 X 2 I2C介面LCD顯示實習】與【四.7 4 X 4 鍵盤實習】這兩個實習把使用者在4 X 4 鍵盤上按下的數值顯示在LCD顯示器上。


功能與動作說明

1、 使用ESP8266的A0類比輸入腳及7顆電阻設計一個16按鍵的4X4鍵盤輸入電路

2、 當按鍵被按下時ESP8266模組板上的Pin2內建LED會閃爍一下而且對應的按鍵值會顯示在Arduino IDE的序列監控視窗中與16 X 2 I2C介面LCD顯示器上

3、LCD顯示器上第一行顯示的訊息為:[4X4 KeyPad test:]第二行為:[Key Number=?]其中的問號即為鍵盤被按下的按鍵值。


電路圖

圖4-18 4X4鍵盤輸入與I2C介面LCD顯示器麵包板接線與電路圖


程式說明與列表

本範例程式基本上也是以【四.7】節的範例程式”Key4X4_1.ino”為基礎在此僅對新增對部分加以說明程式的第1行宣告了使用I2C界面LCD顯示器所需引用的程式庫<LiquidCrystal_I2C.h>,並定義一個I2C介面的LCD顯示器物件變數”lcd” (第3行),由其中的參數可知它的I2C匯流排位址為”0x27”接著的8~14行變數宣告部分和前面4X4鍵盤範例相同


  1. #include <LiquidCrystal_I2C.h>

  2.  

  3. LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display


在初始化程式區(16~31行)中,先設定指示用的LED腳(GPIO2)為輸出,然後初始化Arduino IDE的序列通訊埠的傳輸速率為115200bps(18~21行),接著再初始化LCD顯示器,並啟動LCD背光光源(22、23行),最後把前面設定的功能與動作中第3項的兩行訊息顯示在LCD的螢幕上(25~30行)。

至於主迴圈程式區(33~51行)則是整個複製【四.7】節的範例程式”Key4X4_1.ino並在中間加了下面這兩行程式這樣就成功組合成本節的範例程式。這兩行程式的動作內容已經寫在指令後面的註解部分請自行參閱。


46.    lcd.setCursor(13, 1);   // 將游標移動到LCD顯示器的第二行第14個位置

47.    lcd.print(keyChar[keyNumber]);    // 在此顯示鍵轉換對應值字元


以下是完整的程式列表:


 

#include <LiquidCrystal_I2C.h>

 

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

// 不同按鍵之類比輸入轉換值陣列:

//    按鍵對應值 : 1  E  7  2  0  8  3  F  9  A  D  C  4  5  6  B

const  int  keyValue[]={950,800,670,520,460,410,350,315,280,255,245,230,210,170,140,110};

// 類比輸入轉換值與實際鍵盤值對應轉換陣列

const  byte  keyNumbers[]={1,0x0e,7,2,0,8,3,0x0f,9,0x0a,0x0d,0x0c,4,5,6,0x0b};

// 數字與ASCII碼字元轉換陣列

const  char keyChar[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

byte  keyNumber;

int  KeyIn;

 

void  setup()

{

  pinMode(2,OUTPUT);         // 設定ESP8266模組版的第2腳為輸出

  digitalWrite(2,0);             // 設定第2腳的輸出值為0

  Serial.begin(115200);  // 初始化串列監控視窗,並設定傳輸速率為115200Bps

  Serial.println("Start...");       // 在串列監控視窗中顯示開始提示訊息

  lcd.init();                   // 初始化LCD顯示器 

  lcd.backlight();              // 啟動LCD顯示器的背光

  lcd.home();            // 游標歸位到LCD螢幕左上角第一行的一個位置

  lcd.setCursor(0, 0);            // 將游標移動到第一行的第1個位置

  lcd.print("4X4 KeyPad test:");   //在第一行顯示"4X4 KeyPad test:"的訊息

  lcd.setCursor(1, 1);            // 將游標移動到第二行的第2個位置

  lcd.print("Key Number= ");      // 在第二行顯示"Key Number= "的提示訊息

}

 

void  loop()

{

  if(keyPress())                      // 測試是否有任一鍵被被按下

  {   // 有鍵被被按下將按鍵轉換結果顯示在串列監控視窗中

    digitalWrite(2,0);       // 將內建在ESP8266的第2腳的LED點亮

    delay(50);

    digitalWrite(2,1);       // 將內建在ESP8266的第2腳的LED熄滅

    keyNumber=findKeyNumber();        // 將按鍵輸入轉換結果再轉換成實際的按鍵對應值

    Serial.println(keyNumber);    // 將按鍵轉換對應值顯示在串列監控視窗

    Serial.print("Key => ");

    Serial.println(keyChar[keyNumber]);// 這次以字元的形式將按鍵轉換對應值顯示在串列監控視窗中

    lcd.setCursor(13, 1);             // 將游標移動到第二行的第14個位置

    lcd.print(keyChar[keyNumber]);    // 在此顯示鍵轉換對應值字元

    while(keyPress());               // 等待使用者將按鍵放開

    delay(30);

  }

}  

// 4 X 4鍵盤按鍵轉換副程式 : 依偵測到的輸入電壓判斷並轉換成實際對應的鍵盤按鍵值

byte findKeyNumber(){

    delay(10);

    KeyIn=analogRead(A0);       // 讀取類比輸入腳A0的電壓轉換值

    Serial.println(KeyIn);       // 將類比輸入腳A0的電壓轉換值顯示在串列監控視窗中

    for(byte i=0;i<16;i++)      // 以預設的16個按鍵轉換範圍陣列去判斷可能的按鍵值

    {

      if(KeyIn>keyValue[i])

        return(keyNumbers[i]) ; // 將測試的結果回傳給呼叫者

    }

}

// 按鍵被按下偵測副程式 : 若有任一鍵被被按下會傳回true

boolean keyPress(){

  delay(5);                // 

  KeyIn=analogRead(A0);       // 讀取類比輸入腳A0的電壓轉換值

  if(KeyIn>40)                // 測試電壓輸入值,若有任一鍵被按下其電壓轉換值必定會在40以上

  {

    delay(20);                // 等待50mS好讓輸入腳狀態穩定

    KeyIn=analogRead(A0);     // 再次讀取電壓轉換值

    return(true);             // 若有任一鍵被被按下傳回true

  }

  else

    return(false);            // 若沒有鍵被被按下則傳回false

}    


程式名稱Key4X4_LCD1.ino


沒有留言:

張貼留言