User Tag List

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

Тема: Универсальный контроллер PS/2 клавиатуры для компьютеров с матричными клавиатурами.

Комбинированный просмотр

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

    Регистрация
    12.04.2017
    Адрес
    г. Тольятти
    Сообщений
    931
    Спасибо Благодарностей отдано 
    243
    Спасибо Благодарностей получено 
    167
    Поблагодарили
    81 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Новая версия прошивки для Спектрум 128
    Добавлен сброс матрицы клавишей [Pause Break].

    Скрытый текст

    Код:
    #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
    
    volatile boolean d = HIGH;
    
    uint8_t table[128] = {127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,0,127,127,32,48,127,127,127,1,17,16,33,49,127,
    127,3,2,18,34,51,50,127,127,112,4,19,36,35,52,127,127,115,116,100,20,84,68,127,127,127,114,99,83,67,66,127,
    127,127,98,82,81,64,65,127,127,127,127,97,127,80,127,127,127,127,127,127,127,127,127,127,127,113,96,127,127,127,127,127,
    127,127,127,127,127,127,64,127,127,127,127,52,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127};
    
    PS2KeyRaw keyboard;
    void setup() {
      //Инициализация портов
      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);
      InitMt();
    }
    //Сброс MT
    void InitMt() {
      digitalWrite(STBMT, HIGH); //инициализация
      digitalWrite(CSMT, HIGH); //выбор чипа
      digitalWrite(RSTMT, HIGH);
      digitalWrite(RSTMT, LOW);  //сброс
      digitalWrite(CSMT, LOW);
      digitalWrite(STBMT, LOW);
    }
    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 loop()
    {
      if( keyboard.available() ){
        int c = keyboard.read(); //чтение кода
        switch (c) {
          case 0xE1:              //Если считался префикс 0xE1 сброс MK
            InitMt();
            break;
          case 0xE0:              //если считался префикс 0xE0
            break;
          case 0xF0:              //если считался префикс 0xF0 (отпускание клавиши)
            d = LOW;
            break;
          case 0x66:              //если считался код 0x66 [BS]
            SetAddr(table[0x12]);
            SetKey(d);
            SetAddr(table[0x45]);
            SetKey(d);
            d = HIGH;
            break;
          case 0x6B:              //если считался код 0x6B [Left]
            SetAddr(table[0x12]);
            SetKey(d);
            SetAddr(table[0x2E]);
            SetKey(d);
            d = HIGH;
            break;
          case 0x72:              //если считался код 0x72 [Down]
            SetAddr(table[0x12]);
            SetKey(d);
            SetAddr(table[0x36]);
            SetKey(d);
            d = HIGH;
            break;
          case 0x75:              //если считался код 0x75 [Up]
            SetAddr(table[0x12]);
            SetKey(d);
            SetAddr(table[0x3D]);
            SetKey(d);
            d = HIGH;
            break;
          case 0x74:              //если считался код 0x74 [Right]
            SetAddr(table[0x12]);
            SetKey(d);
            SetAddr(table[0x3E]);
            SetKey(d);
            d = HIGH;
            break;
          case 0x76:              //если считался код 0x76 [Edit]
            SetAddr(table[0x12]);
            SetKey(d);
            SetAddr(table[0x16]);
            SetKey(d);
            d = HIGH;
            break;
          case 0x58:              //если считался код 0x58 [Caps lock]
            SetAddr(table[0x12]);
            SetKey(d);
            SetAddr(table[0x1E]);
            SetKey(d);
            d = HIGH;
            break;
          case 0x0D:              //если считался код 0x0D [Ext mode]
            SetAddr(table[0x12]);
            SetKey(d);
            SetAddr(table[0x59]);
            SetKey(d);
            d = HIGH;
            break;
          case 0x41:              //если считался код 0x41 [,]
            SetAddr(table[0x59]);
            SetKey(d);
            SetAddr(table[0x31]);
            SetKey(d);
            d = HIGH;
            break;
          case 0x49:              //если считался код 0x49 [.]
            SetAddr(table[0x59]);
            SetKey(d);
            SetAddr(table[0x3A]);
            SetKey(d);
            d = HIGH;
            break;
          case 0x4C:              //если считался код 0x4C [;]
            SetAddr(table[0x59]);
            SetKey(d);
            SetAddr(table[0x44]);
            SetKey(d);
            d = HIGH;
            break;
          case 0x52:              //если считался код 0x52 ["]
            SetAddr(table[0x59]);
            SetKey(d);
            SetAddr(table[0x4D]);
            SetKey(d);
            d = HIGH;
            break;
          default:  
            SetAddr(table[c]);
            SetKey(d);
            d = HIGH;
        }
      }
    }
    [свернуть]

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

  3. #2

    Регистрация
    19.10.2022
    Адрес
    г. Смоленск
    Сообщений
    30
    Спасибо Благодарностей отдано 
    11
    Спасибо Благодарностей получено 
    6
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Что значит сброс матрицы? Какое действие он производит?

  4. #3

    Регистрация
    12.04.2017
    Адрес
    г. Тольятти
    Сообщений
    931
    Спасибо Благодарностей отдано 
    243
    Спасибо Благодарностей получено 
    167
    Поблагодарили
    81 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от solonoid Посмотреть сообщение
    Что значит сброс матрицы? Какое действие он производит?
    Производит инициализацию матрицы. Если вдруг какие-то ключи "залипли", чтобы долго не искать.

  5. #4

    Регистрация
    18.01.2023
    Адрес
    г. Брест, Беларусь
    Сообщений
    693
    Спасибо Благодарностей отдано 
    345
    Спасибо Благодарностей получено 
    500
    Поблагодарили
    218 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Xrust Посмотреть сообщение
    Новая версия прошивки для Спектрум 128
    Может есть эта прошивка в .hex формате?

  6. #5

    Регистрация
    12.04.2017
    Адрес
    г. Тольятти
    Сообщений
    931
    Спасибо Благодарностей отдано 
    243
    Спасибо Благодарностей получено 
    167
    Поблагодарили
    81 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Froggy Посмотреть сообщение
    Может есть эта прошивка в .hex формате?
    Могу выложить, но чуть позже. Я в отпуске сейчас.

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

    Froggy(15.07.2024)

  7. #6

    Регистрация
    12.04.2017
    Адрес
    г. Тольятти
    Сообщений
    931
    Спасибо Благодарностей отдано 
    243
    Спасибо Благодарностей получено 
    167
    Поблагодарили
    81 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    atmega168p_8000000L.zip
    Fuse High Byte D7
    Fuse Low Byte E2

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

    Froggy(18.07.2024)

  8. #7

    Регистрация
    18.01.2023
    Адрес
    г. Брест, Беларусь
    Сообщений
    693
    Спасибо Благодарностей отдано 
    345
    Спасибо Благодарностей получено 
    500
    Поблагодарили
    218 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Xrust Посмотреть сообщение
    atmega168p_8000000L.zip
    Fuse High Byte D7
    Fuse Low Byte E2
    Есть маленькая проблема. У меня в контроллере установлена Атмега8. Я так понимаю, что hex от атмеги168р не подойдет?

  9. #8

    Регистрация
    18.01.2010
    Адрес
    Крым
    Сообщений
    238
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    41
    Поблагодарили
    34 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Нет. Много отличий.
    Как бы, теоретически, можно было бы сделать одну прошивку для всех (мега8/мегахх8), только муторно. Да и зачем, когда есть исходник.
    Последний раз редактировалось M80; 02.01.2025 в 08:45.

  10. #9

    Регистрация
    18.01.2023
    Адрес
    г. Брест, Беларусь
    Сообщений
    693
    Спасибо Благодарностей отдано 
    345
    Спасибо Благодарностей получено 
    500
    Поблагодарили
    218 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от M80 Посмотреть сообщение
    Нет. Много отличий.
    Как бы, теоретически, можно было бы сделать одну прошивку для всех (мега8/мегахх8), только муторно. Да и зачем, когда есть исходник.
    Исходник - это хорошо. Просто у меня нет программатора USBASP. Поэтому, хотел использовать .HEX прошивку для Спектрум 128.
    Впрочем, этот вопрос решил. Михаил Андреев (Дед) дал мне прошивку для Atmega8. Прошил с помощью программатора T48. Работает.

    Прошивка в Атмега8 в аттаче.
    Fuse High Byte E4
    Fuse Low Byte D9

    ATMEGA8A@TQFP32_Mikka_kbd.zip
    Последний раз редактировалось Froggy; 02.01.2025 в 16:41.

  11. #10

    Регистрация
    12.04.2017
    Адрес
    г. Тольятти
    Сообщений
    931
    Спасибо Благодарностей отдано 
    243
    Спасибо Благодарностей получено 
    167
    Поблагодарили
    81 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Froggy, не обязательно использовать USBASP. Подойдет любой программатор. Просто выберите в меню Скетч Arduino IDE пункт "Экспорт бинарного файла" и получите .hex файл.

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

    Froggy(03.01.2025)

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

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

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

Похожие темы

  1. Ответов: 34
    Последнее: 24.11.2022, 16:05
  2. Ответов: 40
    Последнее: 27.06.2021, 15:41
  3. Ответов: 146
    Последнее: 31.05.2020, 19:00
  4. Ответов: 29
    Последнее: 24.03.2019, 18:11

Ваши права

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