nt4ttt

Untitled

Mar 10th, 2023
745
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.97 KB | None | 0 0
  1. #include <Arduino.h>
  2. #include <PS2KeyRaw.h>
  3.  
  4. #define AX0 4
  5. #define AX1 5
  6. #define AX2 6
  7. #define AX3 7
  8. #define AY0 8
  9. #define AY1 9
  10. #define AY2 10
  11. #define RSTMT 14
  12. #define CSMT 15
  13. #define DATMT 16
  14. #define STBMT 17
  15. #define DATAPIN 2
  16. #define IRQPIN 3
  17.  
  18. #define POS(x, y) (x | (y << 4))
  19. #define POS12(x, y) (x >> 1 | (y << 4))  //for x == 12
  20. #define POS13(x, y) (x >> 1 | (y << 4) + 1)  //for x == 13
  21. #define NO_KEY 255
  22.  
  23. bool sinclair_mode = false;
  24.  
  25. struct key
  26. {
  27.   uint8_t scancode;
  28.   uint8_t coords;
  29. };
  30.  
  31. key keymap[] = {
  32.     {4, POS(7, 0)},     // F3
  33.     {5, POS(12, 0)},    // F1
  34.     {6, POS(13, 0)},    // F2
  35.     {12, POS(12, 1)},   // F4
  36.     {13, POS(0, 1)},    // TAB
  37.     {17, POS13(13, 1)}, // L_ALT
  38.     {18, POS(0, 0)},    // L_SHIFT
  39.     {20, POS(13, 1)},   // L_CTRL
  40.     {21, POS(2, 0)},    // Q
  41.     {22, POS(3, 0)},    // 1
  42.     {26, POS(0, 1)},    // Z
  43.     {27, POS(1, 1)},    // S
  44.     {28, POS(1, 0)},    // A
  45.     {29, POS(2, 1)},    // W
  46.     {30, POS(3, 1)},    // 2
  47.     {31, NO_KEY},       // L_WIN
  48.     {33, POS(0, 3)},    // C
  49.     {34, POS(0, 2)},    // X
  50.     {35, POS(1, 2)},    // D
  51.     {36, POS(2, 2)},    // E
  52.     {37, POS(3, 3)},    // 4
  53.     {38, POS(3, 2)},    // 3
  54.     {39, NO_KEY},       // R_WIN
  55.     {41, POS13(13, 0)}, // SPACE
  56.     {42, POS(0, 4)},    // V
  57.     {43, POS(1, 3)},    // F
  58.     {44, POS(2, 4)},    // T
  59.     {45, POS(2, 3)},    // R
  60.     {46, POS(3, 4)},    // 5
  61.     {49, POS13(13, 3)}, // N
  62.     {50, POS13(13, 4)}, // B
  63.     {51, POS12(12, 4)}, // H
  64.     {52, POS(1, 4)},    // G
  65.     {53, POS(5, 4)},    // Y
  66.     {54, POS(4, 4)},    // 6
  67.     {58, POS13(13, 2)}, // M
  68.     {59, POS12(12, 3)}, // J
  69.     {60, POS(5, 3)},    // U
  70.     {61, POS(4, 3)},    // 7
  71.     {62, POS(4, 2)},    // 8
  72.     {65, POS(4, 3)},    // ,<
  73.     {66, POS12(12, 2)}, // K
  74.     {67, POS(5, 2)},    // I
  75.     {68, POS(5, 1)},    // O
  76.     {69, POS(4, 0)},    // 0
  77.     {70, POS(4, 1)},    // 9
  78.     {73, POS(6, 3)},    // .>
  79.     {74, POS(7, 3)},    // /?
  80.     {75, POS12(12, 1)}, // L
  81.     {76, POS(3, 3)},    // ;:
  82.     {77, POS(5, 0)},    // P
  83.     {78, POS(5, 3)},    // -_
  84.     {82, NO_KEY},       // '"
  85.     {84, POS(3, 7)},    // [{
  86.     {85, NO_KEY},       // =+
  87.     {88, NO_KEY},       // CS_LOCK
  88.     {89, POS(9, 0)},    // R_SHIFT
  89.     {90, POS12(12, 0)}, // ENTER
  90.     {91, POS(5, 7)},    // ]}
  91.     {93, POS(4, 7)},    // \|
  92.     {102, POS(3, 1)},   // BACKSPACE
  93.     {105, POS(1, 2)},   // NUM 1
  94.     {107, POS(3, 4)},   // NUM 4
  95.     {108, POS(7, 2)},   // NUM 7
  96.     {112, POS(4, 0)},   // NUM 0
  97.     {113, POS(8, 3)},   // NUM .
  98.     {114, POS(4, 4)},   // NUM 2
  99.     {115, POS(9, 2)},   // NUM 5
  100.     {116, POS(4, 2)},   // NUM 6
  101.     {117, POS(4, 3)},   // NUM 8
  102.     {118, POS(0, 0)},   // ESC
  103.     {119, NO_KEY},      // NUM LOCK
  104.     {120, NO_KEY},      // F11
  105.     {121, POS(3, 3)},   // NUM +
  106.     {122, POS(3, 2)},   // NUM 3
  107.     {123, POS(5, 3)},   // NUM -
  108.     {124, NO_KEY},      // NUM *
  109.     {125, POS(1, 3)},   // NUM 9
  110.     {126, NO_KEY},      // SC LOCK
  111. };
  112.  
  113. volatile boolean d = HIGH;
  114. uint8_t table[128];
  115.  
  116. void initTable()
  117. {
  118.   memset(table, NO_KEY, 128);
  119.   for (uint8_t i = 0; i < (sizeof(keymap) / sizeof(key)); i++)
  120.   {
  121.     table[keymap[i].scancode] = keymap[i].coords;
  122.   }
  123. }
  124.  
  125. PS2KeyRaw keyboard;
  126. uint8_t line = 0;
  127.  
  128. void SetAddr(uint8_t addr)
  129. {
  130.   digitalWrite(AX0, bitRead(addr, 0));
  131.   digitalWrite(AX1, bitRead(addr, 1));
  132.   digitalWrite(AX2, bitRead(addr, 2));
  133.   digitalWrite(AX3, bitRead(addr, 3));
  134.   digitalWrite(AY0, bitRead(addr, 4));
  135.   digitalWrite(AY1, bitRead(addr, 5));
  136.   digitalWrite(AY2, bitRead(addr, 6));
  137. }
  138.  
  139. void SetKey(boolean data)
  140. {
  141.   digitalWrite(CSMT, HIGH);  // выбор чипа
  142.   digitalWrite(STBMT, HIGH); // строб on
  143.   digitalWrite(DATMT, data); // данные
  144.   digitalWrite(STBMT, LOW);  // строб off
  145.   digitalWrite(CSMT, LOW);
  146. }
  147.  
  148. void setup()
  149. {
  150.   // TCCR3B = 4;
  151.   // OCR3A = 62500;
  152.     // CLKPR = 1<<PMCE;    //разрешить изменение
  153.   // CLKPR = B00000100;  //32 MHz
  154.   CLKPR = 1 << 0; // F_CPU 16МГц
  155.  
  156.   Serial.begin(9600);
  157.  
  158.   initTable();
  159.  
  160.   pinMode(19, OUTPUT);
  161.   pinMode(AX0, OUTPUT);   // AX0
  162.   pinMode(AX1, OUTPUT);   // AX1
  163.   pinMode(AX2, OUTPUT);   // AX2
  164.   pinMode(AX3, OUTPUT);   // AX3
  165.   pinMode(AY0, OUTPUT);   // AY0
  166.   pinMode(AY1, OUTPUT);   // AY1
  167.   pinMode(AY2, OUTPUT);   // AY2
  168.   pinMode(RSTMT, OUTPUT); // RES
  169.   pinMode(CSMT, OUTPUT);  // CS
  170.   pinMode(DATMT, OUTPUT); // DAT
  171.   pinMode(STBMT, OUTPUT); // STB
  172.   // Инициализация клавиатуры
  173.   keyboard.begin(DATAPIN, IRQPIN);
  174.   // Инициализация MT8816
  175.   SetAddr(0);
  176.   digitalWrite(RSTMT, LOW);
  177.   digitalWrite(CSMT, LOW);
  178.   digitalWrite(DATMT, LOW);
  179.   digitalWrite(STBMT, LOW); // инициализация
  180.   digitalWrite(CSMT, HIGH); // выбор чипа
  181.   digitalWrite(RSTMT, HIGH);
  182.   digitalWrite(RSTMT, LOW); // сброс
  183.   digitalWrite(CSMT, LOW);
  184.   // table[90] = 6;
  185. }
  186.  
  187. void loop()
  188. {
  189.   // Serial.println(analogRead(A1));
  190.   // Serial.println("hello2");
  191.  
  192.   if (keyboard.available())
  193.   {
  194.     int c = keyboard.read(); // чтение кода
  195.     switch (c)
  196.     {
  197.     case 0xE0: // если считался префикс 0xE0
  198.       break;
  199.     case 0xF0: // если считался префикс 0xF0 (отпускание клавиши)
  200.       d = LOW;
  201.       break;
  202.     case 131: //F7
  203.       if (d == LOW)
  204.         sinclair_mode = !sinclair_mode;
  205.       break;
  206.     default:
  207.       if (table[c] != NO_KEY)
  208.       {
  209.         if (sinclair_mode == true && (c >= 54 && c <= 70) || c == 41)
  210.         {
  211.           Serial.println(sinclair_mode);
  212.           Serial.println(c);
  213.           SetAddr(table[c]);
  214.           SetKey(d);
  215.         }
  216.         else if (sinclair_mode == false)
  217.         {
  218.           Serial.println("-");
  219.           Serial.println(c);
  220.           // Serial.println(table[c]);
  221.           SetAddr(table[c]);
  222.           SetKey(d);
  223.           // _delay_ms(1);
  224.           Serial.println("--");
  225.         }
  226.       }
  227.       d = HIGH;
  228.     }
  229.   }
  230. }
Advertisement
Add Comment
Please, Sign In to add comment