////////////////////////////////////////// // Arduino Sketch: ポケベルコード解読器 // // Written by Gaecen UENO. Oct.29,2011 // ////////////////////////////////////////// // ClcdPlusライブラリ初期化 // http://www.microfan.jp/lib/arduino/ClcdPlus-0.95.zip #include ClcdPlus lcd; // 使用ピンと割込番号定義 #define INTPIN 3 // Arduino D3ピン ← CM8870 STD端子に接続(割り込み1使用) #define Q1PIN 4 // Arduino D4~D7ピン ← CM8870 Q1~Q4端子に接続(データ入力) #define INTNUM INTPIN-2 // 割り込み番号 // DTMFデータ取り込み時のBEEP音長(0~65535) #define BEEP_LENGTH 3000 // カスタムキャラクタ定義データ #define C_CHR_NUM 5 // 登録数 #define C_CHR_TOP 0x01 // カスタムキャラクタ領域 0x01~に定義 #define CURSOR 0x01 // 1文字目押下時に表示するカーソル文字コード byte c_chr_data[C_CHR_NUM][8] = { { // 0x01 カーソル(1度目のボタン押下時に表示) B00000, B00000, B00000, B00000, B00000, B00000, B00000, B11111 },{ // 0x02 時計 B01110, B10101, B10101, B10111, B10001, B10001, B01110, B00000 },{ // 0x03 電話 B01110, B10001, B01110, B01010, B10001, B10001, B11111, B00000 },{ // 0x04 カップ B11100, B10111, B10101, B10101, B10110, B10100, B11100, B00000 },{ // 0x05 ハート B01010, B11111, B11111, B11111, B11111, B01110, B00100, B00000 } }; // ポケベルコード→LCDキャラクタコード変換テーブル const byte chr_table[100] = { 0xb1,0xb2,0xb3,0xb4,0xb5,0x41,0x42,0x43,0x44,0x45, // アイウエオABCDE 0xb6,0xb7,0xb8,0xb9,0xba,0x46,0x47,0x48,0x49,0x4a, // カキクケコFGHIJ 0xbb,0xbc,0xbd,0xbe,0xbf,0x4b,0x4c,0x4d,0x4e,0x4f, // サシスセソKLMNO 0xc0,0xc1,0xc2,0xc3,0xc4,0x50,0x51,0x52,0x53,0x54, // タチツテトPQRST 0xc5,0xc6,0xc7,0xc8,0xc9,0x55,0x56,0x57,0x58,0x59, // ナニヌネノUVWXY 0xca,0xcb,0xcc,0xcd,0xce,0x5a,0x3f,0x21,0x2d,0x2f, // ハヒフヘホZ?!-/ 0xcf,0xd0,0xd1,0xd2,0xd3,0x5c,0x26,0x02,0x03,0x04, // マミムメモ¥&時電カ (時=時計、電=電話、カ=カップ) 0xd4,0x28,0xd5,0x29,0xd6,0x2a,0x23,0x20,0x05,0x20, // ヤ(ユ)ヨ*# ハ  (ハ=ハート) 0xd7,0xd8,0xd9,0xda,0xdb,0x31,0x32,0x33,0x34,0x35, // ラリルレロ12345 0xdc,0xa6,0xdd,0xde,0xdf,0x36,0x37,0x38,0x39,0x30 // ワヲン゛゜67890 }; //////////// // 初期化 // //////////// void setup() { char i; // ピンモード設定 for(i = INTPIN; i < INTPIN + 5; i++){ pinMode(i, INPUT); // 入力に設定 digitalWrite(i, HIGH); // 内蔵プルアップ有効 } // カスタムキャラクタ定義 for(i = 0; i < C_CHR_NUM; i++){ lcd.createChar(C_CHR_TOP+i, c_chr_data[i]); } // タイトル表示 lcd.begin(16, 2); // LCD初期化(横16字×縦2行) lcd.print("PB-CODE Decoder"); // 割り込み処理開始 // (STD端子L→H時にデータ取り込み) attachInterrupt(INTNUM, readDtmfData, RISING); } void loop(){ } //////////////////////////////////// // DTMFレシーバからデータ取り込み // //////////////////////////////////// void readDtmfData(){ static char data_buffer[] = {0, 0}; // データ入力バッファ static char data_buffer_ctr = 0; // データ入力カウンタ volatile char code; volatile unsigned int i; // Q1~Q4読み込み for(i = 0; i < 4; i++){ code |= digitalRead(Q1PIN+i) << i; } // デコード // [1]~[0](0x01~0x0a)の場合のみ処理、[D][*][#][A][B][C]入力時無効 if(code && code < 0x0b){ data_buffer[data_buffer_ctr] = code; if( !data_buffer_ctr ){ // 1度目のキー入力時にカーソル「_」を表示 lcd_putchar(CURSOR, true); data_buffer_ctr++; } else { // 2度目のキー入力時に文字表示 // (ポケベルコードからLCDキャラクタコードに変換→文字表示) lcd_putchar(chr_table[(data_buffer[0]-1)*10 + (data_buffer[1]-1)], false); // データ入力バッファ & カウンタクリア data_buffer[0] = data_buffer[1] = data_buffer_ctr = 0; } // BEEP_LENGTH != 0ならBEEP発生 if( BEEP_LENGTH ){ lcd.beep(1); for(i = 0; i < BEEP_LENGTH; i++){} lcd.beep(0); } } } ///////////////////////////////////////// // 文字表示(下行・疑似横スクロール) // ///////////////////////////////////////// void lcd_putchar(char chr, boolean scroll){ static char *str_buffer = " "; // 文字列バッファ初期化(半角スペース16字) if(scroll){ // scroll != false なら右スクロール // (文字列バッファの2文字目以降を、1文字目~にコピー) strcpy(str_buffer, str_buffer+1); } str_buffer[15] = chr; // 文字列バッファ末尾に文字chrをセット lcd.setCursor(0, 1); // 文字出力位置を2行目左端に設定 lcd.print(str_buffer); // 文字列出力 }