#include "BufferClass.h" //テンキー #define CLOCK 2 //割り込みに使用 #define DATA 4 //ゲームボーイ #define RXD 5 #define TXD 6 #define CLK 7 volatile ReceiveBufferClass keyBuffer; bool keyRelease, numLock; void setup() { pinMode(CLOCK, INPUT_PULLUP); pinMode(DATA, INPUT_PULLUP); pinMode(TXD, OUTPUT); pinMode(RXD, INPUT); pinMode(CLK, OUTPUT); digitalWrite(CLK, HIGH); keyRelease = false; numLock = false; attachInterrupt(digitalPinToInterrupt(CLOCK), keyCodeGet, FALLING); } void loop() { if(keyBuffer.dataExist()) { switch(keyBuffer.getData()) { case 0xF0: //キーリリース keyRelease = true; break; case 0x77: //Num Lock if(keyRelease) { keyRelease = false; numLock = false; } else numLock = true; break; case 0x4A: //'/'(E0 4A) if(keyRelease) keyRelease = false; else if(numLock) sendCode(24); //排他的論理和(XOR) else sendCode(20); break; case 0x7C: //* if(keyRelease) keyRelease = false; else if(numLock) sendCode(23); //論理積(AND) else sendCode(19); break; case 0x7B: //- if(keyRelease) keyRelease = false; else if(numLock) sendCode(22); //否定(NOT) else sendCode(18); break; case 0x79: //+ if(keyRelease) keyRelease = false; else if(numLock) sendCode(21); //論理和(OR) else sendCode(17); break; case 0x6C: //7 if(keyRelease) keyRelease = false; else if(numLock) sendCode(25); //'+/-' else sendCode(7); break; case 0x75: //8 if(keyRelease) keyRelease = false; else if(numLock) sendCode(26); //クリア else sendCode(8); break; case 0x7D: //9 if(keyRelease) keyRelease = false; else if(numLock) sendCode(27); //スタッククリア else sendCode(9); break; case 0x6B: //4 if(keyRelease) keyRelease = false; else if(numLock) sendCode(13); //D else sendCode(4); break; case 0x73: //5 if(keyRelease) keyRelease = false; else if(numLock) sendCode(14); //E else sendCode(5); break; case 0x74: //6 if(keyRelease) keyRelease = false; else if(numLock) sendCode(15); //F else sendCode(6); break; case 0x69: //1 if(keyRelease) keyRelease = false; else { if(numLock) sendCode(10); //A else sendCode(1); } break; case 0x72: //2 if(keyRelease) keyRelease = false; else if(numLock) sendCode(11); //B else sendCode(2); break; case 0x7A: //3 if(keyRelease) keyRelease = false; else if(numLock) sendCode(12); //C else sendCode(3); break; case 0x70: //0 if(keyRelease) keyRelease = false; else sendCode(0); break; case 0x71: //. if(keyRelease) keyRelease = false; else sendCode(28); //基数 break; case 0x5A: //Enter(E0 5A) if(keyRelease) keyRelease = false; else sendCode(16); break; } } } //テンキーからキーコードを受け取る(割り込みエントリ) void keyCodeGet() { static uint8_t past = 0; static uint8_t counter = 0; static uint8_t code; static uint8_t parity; uint8_t now, onebit, p; onebit = digitalRead(DATA); now = millis(); if (now - past > 250) counter = 0; past = now; switch (counter++) { case 0: //スタートビット code = 0; parity = 0; break; case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: code |= onebit << counter - 2; parity += onebit; break; case 9: if (onebit == (~parity & 1)) { //キーバッファにコードを入れる keyBuffer.setData(code); } break; case 10: //ストップビット counter = 0; break; } } void sendCode(uint8_t code) { uint8_t onebit; for(int i=0; i<8; i++) { onebit = (code >> (7 - i)) & 1; digitalWrite(TXD, onebit); digitalWrite(CLK, LOW); digitalWrite(CLK, HIGH); } }