Важная информация

User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 12

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

  1. #1
    Junior
    Регистрация
    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]);}                
                        
                    }
                   
                }
            }
        }
    }
    схема просто для примера т.к пины использовались в скетче, вариации любые.

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

    Rio444 (03.02.2023)

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

  4. #2
    Veteran
    Регистрация
    24.07.2010
    Адрес
    Tver
    Сообщений
    1,087
    Спасибо Благодарностей отдано 
    34
    Спасибо Благодарностей получено 
    62
    Поблагодарили
    46 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    "Savir", а ты сам то в этой схеме (про код можно не говорить) что-нибудь понимаешь? Это я к тому, что размещена картинка, какой-то код, и нет вменяемого описания, как это код понимать, нет описания, что изображено на картинке, что там за выходы или входы и к чему они. Когда Малевич нарисовал свой "Черный квадрат", никто многие годы не понимал это произведение. Так и здесь. "Нате вам!". А уж догадаться, что тут к чему, это уж сами! Так? Или как-то по другому?
    Если невозможно связаться со мной через форум, то можно написать на электронный адрес: [email protected]

  5. #3
    Master Аватар для Rio444
    Регистрация
    23.11.2015
    Адрес
    г. Ростов-на-Дону
    Сообщений
    557
    Спасибо Благодарностей отдано 
    177
    Спасибо Благодарностей получено 
    159
    Поблагодарили
    111 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    На схеме вроде всё понятно. Код в целом тоже понятен. Хотелось бы только ещё увидеть модуль (или библиотеку?) "Keypad".

  6. #4
    Veteran
    Регистрация
    24.07.2010
    Адрес
    Tver
    Сообщений
    1,087
    Спасибо Благодарностей отдано 
    34
    Спасибо Благодарностей получено 
    62
    Поблагодарили
    46 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Rio444 Посмотреть сообщение
    На схеме вроде всё понятно. Код в целом тоже понятен. Хотелось бы только ещё увидеть модуль (или библиотеку?) "Keypad".
    Другого ответа не ожидал. Бог с ним, с кодом, тут не все "хакеры". А что за разъемы "J1" и "J2", их куда?
    Если невозможно связаться со мной через форум, то можно написать на электронный адрес: [email protected]

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

    По умолчанию

    @Rio444, забыл выложить ссылку на библиотеку keypad.h, https://github.com/Chris--A/Keypad, она в принципе есть в репе ардуины, но можно и с гита скачать установить разницы нет. @ZXFanat, слыш, тебе никто ничего не должен, что то непонятно спроси, а требовать будешь у партии.

    В двух словах по схеме и коду: J2 разъем 16 пинов, подключен к портам меги и к 8*8 матрица клавиатуры корвета(и всех с ним совместимых), keypad.h обрабатывает события с матрицы через case и передает их на ключ mt8816 которые в свою очередь дает "почти сухи контакты" подключенные к разъему J1, пин с 1 по 13 как раз и есть стандартная спековская матрица 5*8 (5 данных и 8 адресов) подключается согласно распиновке конкретной модели.
    В самом коде есть сноски дающие понимание как и что. Схему тестил на пенте, работает сразу.

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

    ZXFanat (04.02.2023)

  9. #6
    Veteran
    Регистрация
    24.07.2010
    Адрес
    Tver
    Сообщений
    1,087
    Спасибо Благодарностей отдано 
    34
    Спасибо Благодарностей получено 
    62
    Поблагодарили
    46 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А кто это такой "@ZXFanat", которому никто ничего не должен, и который требовать будет у партии? Новый пользователь форума?
    Если невозможно связаться со мной через форум, то можно написать на электронный адрес: [email protected]

  10. #7
    Guru Аватар для creator
    Регистрация
    02.07.2006
    Адрес
    Новосибирск
    Сообщений
    2,200
    Спасибо Благодарностей отдано 
    442
    Спасибо Благодарностей получено 
    221
    Поблагодарили
    131 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от creator Посмотреть сообщение
    За окном шёл дождь и рота красногвардейцев...
    Иосиф Виссарионович отвернулся от окна и спросил:
    – Товарищ Жюков, вас еще не убили?
    ...
    В правильно заданном вопросе содержится половина ответа

  11. #8
    Master Аватар для Rio444
    Регистрация
    23.11.2015
    Адрес
    г. Ростов-на-Дону
    Сообщений
    557
    Спасибо Благодарностей отдано 
    177
    Спасибо Благодарностей получено 
    159
    Поблагодарили
    111 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Savir Посмотреть сообщение
    @Rio444, забыл выложить ссылку на библиотеку keypad.h, https://github.com/Chris--A/Keypad
    Спасибо! Теперь совсем всё понятно
    Хотя Вы правы, тут главное идея. А там уже каждый под себя сделает при необходимости.
    Когда есть уже какой-то рабочий код, это безусловно упрощает реализацию.

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

    ZXFanat (04.02.2023)

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

    По умолчанию

    Там в последнем кейсе кода, пробовал типа макроса исполнить, вывести \ , работает но без повтора при удержанной клавише, с времянками нужно поэкспериментировать, а так можно любых добавить комбинаций, и ещё нюанс, обязательно при прошивке не силами ардуино, фьюз jtag отключить, т.к. его пины используются в скетче

  14. #10
    Master Аватар для Rio444
    Регистрация
    23.11.2015
    Адрес
    г. Ростов-на-Дону
    Сообщений
    557
    Спасибо Благодарностей отдано 
    177
    Спасибо Благодарностей получено 
    159
    Поблагодарили
    111 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Savir Посмотреть сообщение
    и ещё нюанс, обязательно при прошивке не силами ардуино, фьюз jtag отключить, т.к. его пины используются в скетче
    Зачем же его отключать? Тогда будет невозможно прошивку обновить.
    Да и судя по схеме все пины jtag висят в воздухе. Хотя и их можно использовать. Главное reset не трогать.

Страница 1 из 2 12 ПоследняяПоследняя

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

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

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

Похожие темы

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

Ваши права

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