// PS/2 #define DATA 3 #define CLOCK 4 //SWITCH #define SW1 0 #define SW2 1 #define WAIT 25 #define TIMER 0x500 uint8_t stat[2], oldstat[2]; uint8_t sw[] = {SW1, SW2}; uint8_t keymap[] = {0x1C, 0x32}; //a b uint16_t reptime[2]; void setup() { pinMode(CLOCK, OUTPUT); pinMode(DATA, OUTPUT); digitalWrite(CLOCK, HIGH); digitalWrite(DATA, HIGH); for(int i=0; i<2; i++) { pinMode(sw[i], INPUT_PULLUP); oldstat[i] = 1; reptime[i] = TIMER; } } void loop() { for(int i=0; i<2; i++) { if(digitalRead(sw[i]) == LOW) stat[i] = 0; else stat[i] = 1; if(stat[i] != oldstat[i]) { if(stat[i] == 0) //キーを押した { sendKeyCode(keymap[i]); delay(200); sendKeyCode(0xF0); sendKeyCode(keymap[i]); } else //キーを離した { reptime[i] = TIMER; } oldstat[i] = stat[i]; } else { if(stat[i] == 0) //キーは押しっぱなし { if(reptime[i] == 0) { sendKeyCode(keymap[i]); delay(20); sendKeyCode(0xF0); sendKeyCode(keymap[i]); } else --reptime[i]; } } } } void sendClock() { digitalWrite(CLOCK, LOW); //クロック delayMicroseconds(WAIT); digitalWrite(CLOCK, HIGH); delayMicroseconds(WAIT); } //PCにキーコードを送る void sendKeyCode(uint8_t code) { uint8_t onebit, parity = 0; if(digitalRead(CLOCK) == LOW) //PCがキーボードの通信を禁止 return; if(digitalRead(DATA) == LOW) //PCからの送信要求 return; digitalWrite(DATA, LOW); //スタートビット sendClock(); //コードを1バイト送る for(int i = 0; i < 8; i++) { onebit = (code >> i) & 1; digitalWrite(DATA, onebit); sendClock(); parity += onebit; } digitalWrite(DATA, ~parity & 1); //パリティビット sendClock(); digitalWrite(DATA, HIGH); sendClock(); return; }