//#define PROMINI #ifdef PROMINI #define SERIAL Serial #else #define SERIAL Serial1 #endif #define RST 0 //リセット要求 #define RDY 2 //送信可能 #define RXD 1 //データ送信 #define RTY 3 //再送要求 #ifdef PROMINI uint8_t IP[4] = {14, 12, 11, 10}; uint8_t OP[8] = {15, 16, 4, 5, 6, 7, 8, 9}; #else uint8_t IP[4] = {15, 14, 16, 10}; uint8_t OP[8] = {18, 19, 4, 5, 6, 7, 8, 9}; #endif const char keyMap[7][3] = { {0x42, 0x46, 0x56}, // 7 4 F15(pasteキー) {0x47, 0x48, 0x41}, // 5 6 / {0x4D, 0x43, 0x55}, // = 8 F14(copyキー) {0x41, 0x44, 0x53}, // / 9 F12(cutキー) {0x45, 0x40, 0x52}, // * - F11(undoキー) {0x4C, 0x1C, 0x50}, // 3 RET . {0x4B, 0x4A, 0x4E}, // 2 1 0 }; const char keyMapExt[2] = {0x3E, 0x4F}; // HOME/CLR , uint8_t keyStat[7][3]; uint8_t keyStatExt[2]; uint8_t keyin; void setup() { pinMode(RST, INPUT); pinMode(RDY, INPUT); //pinMode(RXD, OUTPUT); pinMode(RTY, INPUT); //テンキー pinMode(IP[0], INPUT_PULLUP); pinMode(IP[1], INPUT_PULLUP); pinMode(IP[2], INPUT_PULLUP); pinMode(IP[3], INPUT_PULLUP); pinMode(OP[0], OUTPUT); pinMode(OP[1], OUTPUT); pinMode(OP[2], OUTPUT); pinMode(OP[3], OUTPUT); pinMode(OP[4], OUTPUT); pinMode(OP[5], OUTPUT); pinMode(OP[6], OUTPUT); pinMode(OP[7], OUTPUT); for(int i=0; i<8; i++) 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; //ハードウェアシリアル初期化 //19.2kbps 8ビット 奇数パリティ ストップビット1ビット SERIAL.begin(19200, SERIAL_8O1); SERIAL.write(0); //何故か必要 } void loop() { //PC98の状態 while(digitalRead(RDY) == HIGH) //送信不可 delayMicroseconds(1); if(digitalRead(RTY) == LOW) //再送要求 SERIAL.write(0); //ダミーデータ if(digitalRead(RST) == LOW) //リセット要求 delayMicroseconds(30); 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) SERIAL.write(keyMapExt[0] | 0x80); //break else SERIAL.write(keyMapExt[0]); keyStatExt[0] = keyin; } //shiftキー keyin = digitalRead(IP[3]); if(keyin != keyStatExt[1]) { if(keyin) SERIAL.write(keyMapExt[1] | 0x80); //break else SERIAL.write(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) SERIAL.write(keyMap[i][j] | 0x80); //break else SERIAL.write(keyMap[i][j]); } keyStat[i][j] = keyin; } } }