2015年9月7日月曜日

LCDモジュール1602 key入力のサンプルスケッチ



//****************************************
//押したKey名をLCDに表示する。
//keyはチャタ取りをする。
//AD値をLCDに表示する。
//key 0 = RIGHT
//key 1 = UP
//key 2 = DOWN
//key 3 = LEFT
//key 4 = SELECT
//****************************************
#include <LiquidCrystal.h>
#include <MsTimer2.h>

LiquidCrystal lcd(8,9,4,5,6,7); //lcdタイプの変数を定義

int adc_key_val[5] ={70, 200, 400, 600, 900 };
String keyname[5] = {"RIGHT","UP","DOWN","LEFT","SELECT"};
int NUM_KEYS = 5;
volatile int adc_key_in;
volatile int keyNo=-1;
int newkey=-1;
int oldkey=-1;
boolean keyEnable = false;

//*SETUP****************************
void setup() {

  MsTimer2::set(50, timerInt);    // 50ms毎 タイマー割り込み処理名を設定 
  lcd.begin(16, 2);               // 行と列を設定
  MsTimer2::start();              //タイマースタート
}


//Main LOOP**************************
void loop() {
   //key 入力ADポートで読み込んだAD値を表示する。
    lcd.setCursor(0,0);
    lcd.print("PushKey! AD=    ");
    lcd.setCursor(12,0);       //カーソルをAD=の後に持ってくる。
    lcd.print(adc_key_in);     // AD値を表示

  //key入力があったら、key番号をLCDに表示する。
  if(keyNo != -1) {
    lcd.setCursor(0,1);        //カーソルを2行目頭に持ってくる
    lcd.print("key=       ");       // key Noを表示
    lcd.setCursor(5,1);
    lcd.print(keyname[keyNo]);           
    keyNo = -1;                   //keyのフラグをクリア
  }
}

//*********************************
void timerInt() {
  
  // ADポートからkey電圧を読み取る。表示する。
  adc_key_in = analogRead(0); 
  
  //どのkeyに一致するかチェック newkeyに入れる。
  newkey = -1;
  int k;
  for (k = 0; k < NUM_KEYS; k++)
  {
    if (adc_key_in < adc_key_val[k]) {
      newkey= k;
      break;
      } 
  }
  
  // key 入力があり、かつ古いkey入力と一致すれば、key入力確定
  //一度keyが確定したら、keyがoffになるまで入力は無効とする。
  if(newkey != -1) {
    if(keyEnable == true){
       if(newkey == oldkey){   
          keyNo = newkey;
          keyEnable = false;
        } 
    }
  }
  else {
    keyEnable = true;
  }
  
  //keyデータをoldkeyに保存
  oldkey = newkey;            
  
}

0 件のコメント:

コメントを投稿