User Tag List

Показано с 1 по 10 из 12

Тема: Как подключить любую матричную клавиатуру к Спектруму

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    24.08.2022
    Адрес
    г. Ставрополь
    Сообщений
    13
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Как подключить любую матричную клавиатуру к Спектруму

    Всем привет, предлагаю на ваш суд, схему и код подключения любой матричной клавиатуры к спектруму, я делал клаву от корвета. Идея была взята из ветки про подключение PS2 клавы к спектруму. Основная цель была не мгтэфить клаву, а подрубить программно используя ATmega16 и ключ MT8816. Использовал 8х8, без доп. клавиш и F, а там сколько фантазии хватит, пинов меги в принципе хватит. Код для arduino, ибо я мамкин хакер.
    Код:
    #include <Keypad.h>
    #define AX0 8
    #define AX1 9
    #define AX2 10
    #define AX3 11
    #define AY0 1
    #define AY1 2
    #define AY2 3
    #define RSTMT 14
    #define CSMT  12
    #define DATMT 0
    #define STBMT 13
    const byte ROWS=8;
    const byte COLS=8;
    byte rowPins[ROWS] = {31, 30, 29, 28, 27, 26, 25, 24};	//линия A0..A7
    byte colPins[COLS] = {16, 17, 18, 19, 20, 21, 22, 23};  //линия D0..D7
    
    // 7 битные адреса управления MT8816, порядковый номер массива = dec значению ASCII символа из массива keys, (последний элемент массива №90 = 1, char 'Z' = 90, 7bit(1)= 0000001,
    //т.е. AX0=1, AX1..AY2=0, контакт Y0 на X1, (соответствия X0..X4 = D0..D4, Y0..Y7 = A0..A7 - раскладка ZX клавиатуры)
    int8_t table[127] = {
    127,127,127,127,127,127,127,127,127,127,
    127,127,127,127,127,127,127,127,127,127,
    127,127,127,127,127,127,127,127,127,127,
    127,127,127,127,127,127,127,127,127,127,
    127,127,127,127,127,127,127,127,64,48,49,
    50,51,52,68,67,66,65,127,127,127,
    127,127,127,127,16,116,3,18,34,19,
    20,100,82,99,98,97,114,115,81,80,
    32,35,17,36,83,4,33,2,84,1};
    
    
    //матриц клавиш корвета, заглавные - символы, прописные - служебные (комбинации), A0 на D0 = ., или 30 на 17 = B
    // p - Space, u - Up, d - Down, r - Right, l - left, e - Enter, s -SS, c - CS, t- Edit, i - Inv,  n - TRUE, g - Graph, k- Capslock, x - Ext, b - Break, y - Del, z-reserv ИЗ DEL
    char keys[ROWS][COLS] = {
    {'.','F',',','W','L','T','A','U'},
    {'u','B','Q','R','K','V','Y','J'},
    {'G','Z','H','C','N','E','l','D'},
    {'M','S','P','I','d','O','X','/'},
    {'-','2','3','4','5','6','7','8'},
    {'9','0','=','1',':','+','r','*'},
    {'e','i','b','z','n','y','a','p'},
    {'c','t','g','x','s','k','s','c'}};
    
    
    Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
    int c;
    void setup() {
      pinMode(AX0, OUTPUT);
      pinMode(AX1, OUTPUT);
      pinMode(AX2, OUTPUT);
      pinMode(AX3, OUTPUT);
      pinMode(AY0, OUTPUT);
      pinMode(AY1, OUTPUT);
      pinMode(AY2, OUTPUT);
      pinMode(RSTMT, OUTPUT);
      pinMode(CSMT, OUTPUT);
      pinMode(DATMT, OUTPUT);
      pinMode(STBMT, OUTPUT);
      digitalWrite(RSTMT, LOW);
      digitalWrite(CSMT, LOW);
      digitalWrite(DATMT, LOW);
      digitalWrite(STBMT, LOW);
      digitalWrite(CSMT, HIGH);
      digitalWrite(RSTMT, HIGH);
      digitalWrite(RSTMT, LOW);
      digitalWrite(CSMT, LOW);
      }
    
    void ON(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));
      digitalWrite(CSMT, HIGH);
      digitalWrite(STBMT, HIGH);
      digitalWrite(DATMT, HIGH);
      digitalWrite(STBMT, LOW); 
      digitalWrite(CSMT, LOW);
    }
    void OFF(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));
      digitalWrite(CSMT, HIGH);
      digitalWrite(STBMT, HIGH);
      digitalWrite(DATMT, LOW);
      digitalWrite(STBMT, LOW); 
      digitalWrite(CSMT, LOW);
    }
    
    
    //если изменилось состояние любой клавишы, в случае 'u' если нажата клавиша замыкаем 0 и 67 (7bit значения управления) если отжата разымкает 67 и 0
    void loop() {
        if (kpd.getKeys())
        {
            for (int i=0; i<LIST_MAX; i++) //принцип работы keypad.h
            {
                if ( kpd.key[i].stateChanged )
                {
                      switch (kpd.key[i].kchar) {
                        case 'u': //Up
                        if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(67); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(67); OFF(0); } 
                    break;
                        case 'd': //Down
                        if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(68); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(68); OFF(0); }
                    break;
                        case 'l': //Left
                        if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(52); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(52); OFF(0); }
                    break;
                        case 'r': //Right
                        if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(66); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(66); OFF(0); }
                    break;
                        case 'e': //Enter
                        if ((kpd.key[i].kstate) == PRESSED) { ON(96); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(96); }
                    break;
                        case 'p': //Space
                        if ((kpd.key[i].kstate) == PRESSED) { ON(112); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(112); }
                    break;
                        case 'c': //CS
                        if ((kpd.key[i].kstate) == PRESSED) { ON(0); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(0); }
                    break;
                        case 's': //SS
                        if ((kpd.key[i].kstate) == PRESSED) { ON(113); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(113); }
                    break;
                        case 't': //Edit
                        if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(48); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(48); OFF(0); }
                    break;
                        case 'i': //Inv
                        if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(51); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(51); OFF(0); }
                    break;
                        case 'n': //True
                        if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(50); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(50); OFF(0); }
                    break;
                        case 'g': //Gpaph
                        if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(65); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(65); OFF(0); }
                    break;
                        case 'k': //CapsLock
                        if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(49); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(49); OFF(0); }
                    break;
                        case 'x': //Ext
                        if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(113); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(113); OFF(0); }
                    break;
                        case 'b': //Break
                        if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(112); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(112); OFF(0); }
                    break;
                        case 'y': //Del
                        if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(64); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(64); OFF(0); }
                    break;
                        case '.': //.
                        if ((kpd.key[i].kstate) == PRESSED) { ON (113); ON(114); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(114); OFF(113); }
                    break;
                        case ',': //.
                        if ((kpd.key[i].kstate) == PRESSED) { ON (113); ON(115); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(115); OFF(113); }
                    break;
                        case '-': //-
                        if ((kpd.key[i].kstate) == PRESSED) { ON (113); ON(99); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(99); OFF(113); }
                    break;
                        case '+': //+
                        if ((kpd.key[i].kstate) == PRESSED) { ON (113); ON(98); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(98); OFF(113); }
                    break;
                        case '=': //=
                        if ((kpd.key[i].kstate) == PRESSED) { ON (113); ON(97); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(97); OFF(113); }
                    break;
                        case ':': //:
                        if ((kpd.key[i].kstate) == PRESSED) { ON (113); ON(1); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(1); OFF(113); }
                    break;
                        case '*': 
                        if ((kpd.key[i].kstate) == PRESSED) { ON (113); ON(116); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(116); OFF(113); }
                    break;
                     case '/': //back
                         if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(113); delay(50); OFF(113); delay (50); ON(18); delay (50); OFF(18);} else if ((kpd.key[i].kstate) == RELEASED) {OFF(0); }
                    break;
                    
                        default:
                        c = kpd.key[i].kchar;
                        if ((kpd.key[i].kstate) == PRESSED) {ON(table[c]);} else if ((kpd.key[i].kstate) == RELEASED) {OFF(table[c]);}                
                        
                    }
                   
                }
            }
        }
    }
    схема просто для примера т.к пины использовались в скетче, вариации любые.

    Этот пользователь поблагодарил Savir за это полезное сообщение:

    Rio444(03.02.2023)

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 39
    Последнее: 20.01.2025, 14:20
  2. Как переделать практически любую клавиатуру в PS/2
    от CLR в разделе Устройства ввода
    Ответов: 87
    Последнее: 31.03.2024, 00:27
  3. Ответов: 30
    Последнее: 07.04.2020, 15:49
  4. Ответов: 6
    Последнее: 12.09.2017, 15:38
  5. Как подключить дисководы от PC к спектруму?
    от dhau в разделе Внешние накопители
    Ответов: 22
    Последнее: 23.09.2005, 19:41

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •