Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Arduino.h>
- #include <PS2KeyRaw.h>
- #define AX0 4
- #define AX1 5
- #define AX2 6
- #define AX3 7
- #define AY0 8
- #define AY1 9
- #define AY2 10
- #define RSTMT 14
- #define CSMT 15
- #define DATMT 16
- #define STBMT 17
- #define DATAPIN 2
- #define IRQPIN 3
- #define POS(x, y) (x | (y << 4))
- #define POS12(x, y) (x >> 1 | (y << 4)) //for x == 12
- #define POS13(x, y) (x >> 1 | (y << 4) + 1) //for x == 13
- #define NO_KEY 255
- bool sinclair_mode = false;
- struct key
- {
- uint8_t scancode;
- uint8_t coords;
- };
- key keymap[] = {
- {4, POS(7, 0)}, // F3
- {5, POS(12, 0)}, // F1
- {6, POS(13, 0)}, // F2
- {12, POS(12, 1)}, // F4
- {13, POS(0, 1)}, // TAB
- {17, POS13(13, 1)}, // L_ALT
- {18, POS(0, 0)}, // L_SHIFT
- {20, POS(13, 1)}, // L_CTRL
- {21, POS(2, 0)}, // Q
- {22, POS(3, 0)}, // 1
- {26, POS(0, 1)}, // Z
- {27, POS(1, 1)}, // S
- {28, POS(1, 0)}, // A
- {29, POS(2, 1)}, // W
- {30, POS(3, 1)}, // 2
- {31, NO_KEY}, // L_WIN
- {33, POS(0, 3)}, // C
- {34, POS(0, 2)}, // X
- {35, POS(1, 2)}, // D
- {36, POS(2, 2)}, // E
- {37, POS(3, 3)}, // 4
- {38, POS(3, 2)}, // 3
- {39, NO_KEY}, // R_WIN
- {41, POS13(13, 0)}, // SPACE
- {42, POS(0, 4)}, // V
- {43, POS(1, 3)}, // F
- {44, POS(2, 4)}, // T
- {45, POS(2, 3)}, // R
- {46, POS(3, 4)}, // 5
- {49, POS13(13, 3)}, // N
- {50, POS13(13, 4)}, // B
- {51, POS12(12, 4)}, // H
- {52, POS(1, 4)}, // G
- {53, POS(5, 4)}, // Y
- {54, POS(4, 4)}, // 6
- {58, POS13(13, 2)}, // M
- {59, POS12(12, 3)}, // J
- {60, POS(5, 3)}, // U
- {61, POS(4, 3)}, // 7
- {62, POS(4, 2)}, // 8
- {65, POS(4, 3)}, // ,<
- {66, POS12(12, 2)}, // K
- {67, POS(5, 2)}, // I
- {68, POS(5, 1)}, // O
- {69, POS(4, 0)}, // 0
- {70, POS(4, 1)}, // 9
- {73, POS(6, 3)}, // .>
- {74, POS(7, 3)}, // /?
- {75, POS12(12, 1)}, // L
- {76, POS(3, 3)}, // ;:
- {77, POS(5, 0)}, // P
- {78, POS(5, 3)}, // -_
- {82, NO_KEY}, // '"
- {84, POS(3, 7)}, // [{
- {85, NO_KEY}, // =+
- {88, NO_KEY}, // CS_LOCK
- {89, POS(9, 0)}, // R_SHIFT
- {90, POS12(12, 0)}, // ENTER
- {91, POS(5, 7)}, // ]}
- {93, POS(4, 7)}, // \|
- {102, POS(3, 1)}, // BACKSPACE
- {105, POS(1, 2)}, // NUM 1
- {107, POS(3, 4)}, // NUM 4
- {108, POS(7, 2)}, // NUM 7
- {112, POS(4, 0)}, // NUM 0
- {113, POS(8, 3)}, // NUM .
- {114, POS(4, 4)}, // NUM 2
- {115, POS(9, 2)}, // NUM 5
- {116, POS(4, 2)}, // NUM 6
- {117, POS(4, 3)}, // NUM 8
- {118, POS(0, 0)}, // ESC
- {119, NO_KEY}, // NUM LOCK
- {120, NO_KEY}, // F11
- {121, POS(3, 3)}, // NUM +
- {122, POS(3, 2)}, // NUM 3
- {123, POS(5, 3)}, // NUM -
- {124, NO_KEY}, // NUM *
- {125, POS(1, 3)}, // NUM 9
- {126, NO_KEY}, // SC LOCK
- };
- volatile boolean d = HIGH;
- uint8_t table[128];
- void initTable()
- {
- memset(table, NO_KEY, 128);
- for (uint8_t i = 0; i < (sizeof(keymap) / sizeof(key)); i++)
- {
- table[keymap[i].scancode] = keymap[i].coords;
- }
- }
- PS2KeyRaw keyboard;
- uint8_t line = 0;
- void SetAddr(uint8_t addr)
- {
- digitalWrite(AX0, bitRead(addr, 0));
- digitalWrite(AX1, bitRead(addr, 1));
- digitalWrite(AX2, bitRead(addr, 2));
- digitalWrite(AX3, bitRead(addr, 3));
- digitalWrite(AY0, bitRead(addr, 4));
- digitalWrite(AY1, bitRead(addr, 5));
- digitalWrite(AY2, bitRead(addr, 6));
- }
- void SetKey(boolean data)
- {
- digitalWrite(CSMT, HIGH); // выбор чипа
- digitalWrite(STBMT, HIGH); // строб on
- digitalWrite(DATMT, data); // данные
- digitalWrite(STBMT, LOW); // строб off
- digitalWrite(CSMT, LOW);
- }
- void setup()
- {
- // TCCR3B = 4;
- // OCR3A = 62500;
- // CLKPR = 1<<PMCE; //разрешить изменение
- // CLKPR = B00000100; //32 MHz
- CLKPR = 1 << 0; // F_CPU 16МГц
- Serial.begin(9600);
- initTable();
- pinMode(19, OUTPUT);
- pinMode(AX0, OUTPUT); // AX0
- pinMode(AX1, OUTPUT); // AX1
- pinMode(AX2, OUTPUT); // AX2
- pinMode(AX3, OUTPUT); // AX3
- pinMode(AY0, OUTPUT); // AY0
- pinMode(AY1, OUTPUT); // AY1
- pinMode(AY2, OUTPUT); // AY2
- pinMode(RSTMT, OUTPUT); // RES
- pinMode(CSMT, OUTPUT); // CS
- pinMode(DATMT, OUTPUT); // DAT
- pinMode(STBMT, OUTPUT); // STB
- // Инициализация клавиатуры
- keyboard.begin(DATAPIN, IRQPIN);
- // Инициализация MT8816
- SetAddr(0);
- digitalWrite(RSTMT, LOW);
- digitalWrite(CSMT, LOW);
- digitalWrite(DATMT, LOW);
- digitalWrite(STBMT, LOW); // инициализация
- digitalWrite(CSMT, HIGH); // выбор чипа
- digitalWrite(RSTMT, HIGH);
- digitalWrite(RSTMT, LOW); // сброс
- digitalWrite(CSMT, LOW);
- // table[90] = 6;
- }
- void loop()
- {
- // Serial.println(analogRead(A1));
- // Serial.println("hello2");
- if (keyboard.available())
- {
- int c = keyboard.read(); // чтение кода
- switch (c)
- {
- case 0xE0: // если считался префикс 0xE0
- break;
- case 0xF0: // если считался префикс 0xF0 (отпускание клавиши)
- d = LOW;
- break;
- case 131: //F7
- if (d == LOW)
- sinclair_mode = !sinclair_mode;
- break;
- default:
- if (table[c] != NO_KEY)
- {
- if (sinclair_mode == true && (c >= 54 && c <= 70) || c == 41)
- {
- Serial.println(sinclair_mode);
- Serial.println(c);
- SetAddr(table[c]);
- SetKey(d);
- }
- else if (sinclair_mode == false)
- {
- Serial.println("-");
- Serial.println(c);
- // Serial.println(table[c]);
- SetAddr(table[c]);
- SetKey(d);
- // _delay_ms(1);
- Serial.println("--");
- }
- }
- d = HIGH;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment