2015年9月7日月曜日

LCDモジュール1602 シリアル通信とLCD表示のサンプルスケッチ



//*******************************************
//押したeyのNo.をLCDに表示し、Serialに出力
//keyはチャタ取りをする。
//
//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 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int newkey=-1;
int oldkey=-1;
boolean keyEnable = false;

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

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

  Serial.begin(115200);           //Serial port 設定
}

//Main LOOP**************************
void loop() {

  //key入力があったら、LCDに表示し、Serialポートへ出力。
  if(key != -1) {
    //LCDに表示
    lcd.clear();               // 画面をクリア
    lcd.print("keyNo= ");       // key Noを表示
    lcd.print(key); 
    
    //Serial portへ出力
    Serial.print("keyNo= ");    
    Serial.println(key);
    
    key = -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){   
          key = newkey;
          keyEnable = false;
        } 
    }
  }
  else {
    keyEnable = true;
  }
  
  //keyデータをoldkeyに保存
  oldkey = newkey;            
  
}

0 件のコメント:

コメントを投稿