Lesson7
TM1637は7セグLEDの他に16個のキー読み出しが出来ます。前回の基板にタクトスイッチをはんだ付けして、押したテンキーの数値を7セグLEDに表示してみます。keyscan()関数は反転されたデータが返るので、keyConverter()関数を作って都合の良い値に変換しました。keyscan()の値はLesson6で紹介したSerial.printで確かめました。

Arduinoフォーラム(forum.arduino.cc)にアタッチされていた、キースキャンを追加したTM1637ライブラリを拝借して、クラス定義をTM1637keyにしました。
グローバル定義
//定義ファイルインクルード
#include "TM1637key.h"
//デバッグを有効にする
#define DEBUG
//I/Oポート番号定義
#define PIN_CLK 13
#define PIN_DIO 11
//TM1637keyライブラリをクラス定義して初期化
TM1637 tm1637key(PIN_CLK, PIN_DIO);
//グローバル変数定義
byte KeyBuff[] = {0x7f,0x7f,0x7f,0x7f}; //4桁のブランクデータ
byte gKeyByte; //ローカル変数定義
//function
byte keyConverter(byte inkey);
//Task Schedule
unsigned long gPreviousL1 = 0;
セットアップと実行
void setup() {
Serial.begin(115200);
while (!Serial);
tm1637key.init();
tm1637key.set(BRIGHT_TYPICAL);
tm1637key.display(KeyBuff); //ブランク表示
gPreviousL1 = millis();
}
void loop() {
byte aKeybyte;
if( millis() - gPreviousL1 > 1000) {
//Reset task
gPreviousL1 = millis();
aKeybyte = tm1637key.keyscan();
if (aKeybyte != 255) {
#ifdef DEBUG
Serial.println(aKeybyte);
#endif
//7セグ表示に都合の良い値に変換
gKeyByte = keyConverter(aKeybyte);
//7セグに表示する
DisplayKey(gKeyByte);
}
}
デバッグ出力
247
246
245
244
243
242
241
240
239
238
スキャンデータ変換関数
byte keyConverter(byte inKey)
{
byte aKey_bit = inKey & 0x1f; //上位3ビットをマスク
aKey_bit = aKey_bit ^ 0x1f; //ビットを反転
aKey_bit -= 8; //7セグに表示できる値にする
return aKey_bit; //結果を返す
}
表示関数
void DisplayKey(byte inDat)
{
//直前の表示を上位桁にシフト
for (byte i=3; i>0; i--) {
KeyBuff[i] = KeyBuff[i - 1];
}
//押されたキーを最下位桁に表示
KeyBuff[0] = inDat;
//display(uint8_t, int8_t)関数のオーバーロードを使う
tm1637key.display(KeyBuff);
}
最近のコメント