#define CLOCK 3 #define DATA 2 uint8_t IP[4] = {12, 14, 15, 16}; //ProMiniは13pinプルアップ動作しない uint8_t OP[8] = {11, 10, 9, 8, 7, 6, 5, 4}; const char keyMap[7][3] = { {12, 8, 23}, {9, 10, 11}, {17, 13, 22}, {18, 14, 21}, {19, 15, 20}, {7, 4, 3}, {6, 5, 1}, }; const char keyMapExt[2] = {16, 2}; uint8_t keyStat[7][3]; uint8_t keyStatExt[2]; uint8_t keyin; void setup() { pinMode(CLOCK, OUTPUT); pinMode(DATA, OUTPUT); for(int i=0; i<4; i++) pinMode(IP[i], INPUT_PULLUP); for(int i=0; i<8; i++) { pinMode(OP[i], OUTPUT); digitalWrite(OP[i], HIGH); } //前回押されたキーの状態リセット for(int i=0; i<7; i++) for(int j=0; j<3; j++) keyStat[i][j] = 1; keyStatExt[0] = 1; keyStatExt[1] = 1; //Digisparkが動作するまで待つ digitalWrite(CLOCK, LOW); pinMode(CLOCK, INPUT); while(digitalRead(CLOCK) == LOW) delay(1); pinMode(CLOCK, OUTPUT); } void loop() { pinMode(OP[7], INPUT); //ハイインピーダンスにする pinMode(OP[0], OUTPUT); //clearキー digitalWrite(OP[0], LOW); delay(1); //信号線の状態が安定するのを待つ keyin = digitalRead(IP[0]); if(keyin != keyStatExt[0]) { if(!keyin) //キーが押された sendCode(keyMapExt[0]); keyStatExt[0] = keyin; } //shiftキー keyin = digitalRead(IP[3]); if(keyin != keyStatExt[1]) { if(!keyin) //キーが押された sendCode(keyMapExt[1]); keyStatExt[1] = keyin; } //その他のキー for(int i=0; i<7; i++) { pinMode(OP[i], INPUT); //ハイインピーダンスにする pinMode(OP[i+1], OUTPUT); digitalWrite(OP[i+1], LOW); delay(1); //信号線の状態が安定するのを待つ for(int j=0; j<3; j++) { keyin = digitalRead(IP[j]); if(keyin != keyStat[i][j]) { if(!keyin) //キーが押された sendCode(keyMap[i][j]); } keyStat[i][j] = keyin; } } } void sendCode(uint8_t code) { for(int i=0; i<5; i++) //キー番号1-23は5ビットで充分 { digitalWrite(DATA, (code >> i) & 1); digitalWrite(CLOCK, LOW); delayMicroseconds(100); digitalWrite(CLOCK, HIGH); delayMicroseconds(100); } }