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

User Tag List

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

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

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

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

    Регистрация
    06.02.2018
    Адрес
    г. Волгоград
    Сообщений
    1,065
    Спасибо Благодарностей отдано 
    582
    Спасибо Благодарностей получено 
    471
    Поблагодарили
    253 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Сделал прошивку под Вектор-06ц (она же подходит и для ПК-6128ц -- там клавиатуры одинаковые). Для показа состояния индикатора "РУС" использовал на клавиатуре индикатор ScrollLock, для индикатора "СЕТЬ" -- NumLock. Для того, чтобы задействовать эти индикаторы пришлось перейти с библиотеки PS2KeyRaw на PS2KeyboardHost (есть в библиотеке ArduinoIDE).

    Скетч

    Код:
    // Вектор-06ц / ПК-6128ц
    #include "ps2_Keyboard.h"
    #include "ps2_NullDiagnostics.h"
    
    #define AX0 4
    #define AX1 5
    #define AX2 6
    #define AX3 7
    #define AY0 8
    #define AY1 9
    #define AY2 10
    #define SS 11     // J1:4
    #define US  12    // J1:1
    #define RUS 13    // J1:3
    #define VVD 1     // H2:TX
    #define SBR 0     // H2:RX
    #define IRUS 18   // вывод 27
    #define RSTMT 14
    #define CSMT  15
    #define DATMT 16
    #define STBMT 17
    #define DATAPIN 2
    #define IRQPIN  3
    
    // J2 -- PB
    // J3 -- PA
    
    typedef ps2::NullDiagnostics Diagnostics_;
    static Diagnostics_ diagnostics;
    static ps2::Keyboard<DATAPIN, IRQPIN, 1, Diagnostics_> ps2Keyboard(diagnostics);
    static ps2::KeyboardLeds lastLedSent = ps2::KeyboardLeds::none;
    
    volatile boolean d = HIGH;
    volatile boolean OldRUS;
    volatile boolean extkey = LOW;
    const uint8_t table[128] = {0xFF, 0xFF, 0xFF, 0x71, 0x51, 0x31, 0x41, 0xFF,  //   0 00 -  -  -  F5 F3 F1 F2 - (код клавиши PB PA)
                                0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x00, 0x33, 0xFF,  //   8 08 -  -  -  -  F4 TB ;  -
                                0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x25, 0x12, 0xFF,  //  16 10 -  -  -  -  -  J  1  -
                                0xFF, 0xFF, 0x16, 0x17, 0x64, 0x34, 0x22, 0xFF,  //  24 18 -  -  Q  Y  F  C  2  -
                                0xFF, 0x36, 0x67, 0x76, 0x56, 0x42, 0x32, 0xFF,  //  32 20 -  S  ^  W  U  4  3  -
                                0xFF, 0x77, 0x55, 0x14, 0x54, 0x35, 0x52, 0xFF,  //  40 28 -  _  M  A  E  K  5  -
                                0xFF, 0x46, 0x15, 0x26, 0x06, 0x65, 0x62, 0xFF,  //  48 30 -  T  I  R  P  N  6  -
                                0xFF, 0xFF, 0x07, 0x75, 0x74, 0x72, 0x03, 0xFF,  //  56 38 -  -  X  O  G  7  8  -
                                0xFF, 0x24, 0x45, 0x37, 0x57, 0x02, 0x13, 0xFF,  //  64 40 -  B  L  [  ]  0  9  -
                                0xFF, 0x04, 0x43, 0x44, 0x66, 0x27, 0x53, 0xFF,  //  72 48 -  @  ,  D  V  Z  =  -
                                0xFF, 0xFF, 0x47, 0xFF, 0x05, 0x73, 0xFF, 0xFF,  //  80 50 -  -  \  -  H  /  -  -
                                0xFF, 0x10, 0x20, 0x23, 0xFF, 0x63, 0xFF, 0xFF,  //  88 58 -  ПС ВК :  -  .  -  -
                                0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x30, 0xFF,  //  96 60 -  -  -  -  -  -  ЗБ -
                                0xFF, 0xFF, 0xFF, 0x40, 0x01, 0xFF, 0xFF, 0xFF,  // 104 68 -  -  -  <  HM -  -  -
                                0xFF, 0xFF, 0x70, 0xFF, 0x60, 0x50, 0x21, 0xFF,  // 112 70 -  -  v  -  >  ^  А2 -
                                0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x11, 0xFF, 0xFF   // 120 78 -  -  -  -  -  СТ -  -
                               };
    
    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(SS, OUTPUT); //SS
      pinMode(US, OUTPUT);  //US
      pinMode(RUS, OUTPUT); //RUS
      pinMode(IRUS, INPUT_PULLUP); //индикатор RUS
      pinMode(VVD, OUTPUT); //ВВОД
      pinMode(SBR, OUTPUT); //СБРОС
      pinMode(RSTMT, OUTPUT); //RES
      pinMode(CSMT, OUTPUT);  //CS
      pinMode(DATMT, OUTPUT); //DAT
      pinMode(STBMT, OUTPUT); //STB
    
      OldRUS = digitalRead(IRUS);
    
      //Инициализация клавиатуры
      ps2Keyboard.begin();
      ps2Keyboard.awaitStartup();
    
      if ( OldRUS == HIGH ) {
        ps2Keyboard.sendLedStatus(ps2::KeyboardLeds::numLock);
        lastLedSent = ps2::KeyboardLeds::numLock;
      }
      else {
        ps2Keyboard.sendLedStatus(ps2::KeyboardLeds::numLock | ps2::KeyboardLeds::scrollLock);
        lastLedSent == (ps2::KeyboardLeds::numLock | ps2::KeyboardLeds::scrollLock);
      }
    
      digitalWrite(SS, HIGH);
      digitalWrite(US, HIGH);
      digitalWrite(RUS, HIGH);
      digitalWrite(VVD, HIGH);
      digitalWrite(SBR, HIGH);
    
      //Инициализация MT8816
      SetAddr(0);
      digitalWrite(RSTMT, LOW);
      digitalWrite(CSMT, LOW);
      digitalWrite(DATMT, LOW);
      digitalWrite(STBMT, LOW); //инициализация
      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()
    {
      //чтение кода
      ps2::KeyboardOutput scanCode = ps2Keyboard.readScanCode();
    
      if ( scanCode != ps2::KeyboardOutput::none ) {
        switch (scanCode) {
          case ps2::KeyboardOutput::unmake: {             //если считался префикс 0xF0 (отпускание клавиши)
              d = LOW;
              break;
            }
          case ps2::KeyboardOutput::extend: {             //если считался префикс 0xE0 -- игнорим
              extkey = HIGH;
              break;
            }
          case ps2::KeyboardOutput::sc2_leftShift: {      //если считался код 0x12 SS (Shift)
              if ( extkey == LOW) { // если был код с префиксом 0xE0, то игнорируем нажатие
                digitalWrite(SS, !d);
              }
              extkey = LOW;
              d = HIGH;
              break;
            }
          case ps2::KeyboardOutput::sc2_leftCtrl: {       //если считался код 0x14 RUS (Ctrl)
              digitalWrite(RUS, !d);
              d = HIGH;
              extkey = LOW;
              break;
            }
          case ps2::KeyboardOutput::sc2_capsLock: {       //если считался код 0x58 US (CapsLock)
              digitalWrite(US, !d);
              d = HIGH;
              break;
            }
          case ps2::KeyboardOutput::sc2_f11: {            //если считался код 0x78 VVD (F11)
              digitalWrite(VVD, !d);
            }
          case ps2::KeyboardOutput::sc2_f12: {            //если считался код 0x07 SBR (F12)
              digitalWrite(SBR, !d);
              d = HIGH;
              break;
            }
          default: {
              byte c = (byte)scanCode;
              if ( c < 128 ) {    // скан-код может быть больше!
                if ( table[c] != 0xFF ) {
                  SetAddr(table[c]);
                  SetKey(d);
                }
              }
              extkey = LOW;
              d = HIGH;
            }
        }
      }
      else {
        if (digitalRead(IRUS) == LOW) { //проверяем состояние индикатора РУС
          if ( OldRUS == HIGH ) {
            ps2Keyboard.sendLedStatus(ps2::KeyboardLeds::numLock | ps2::KeyboardLeds::scrollLock);
            lastLedSent == (ps2::KeyboardLeds::numLock | ps2::KeyboardLeds::scrollLock);
            OldRUS = LOW;
          }
        }
        else {
          if ( OldRUS == LOW ) {
            ps2Keyboard.sendLedStatus(ps2::KeyboardLeds::numLock);
            lastLedSent == ps2::KeyboardLeds::numLock;
            OldRUS = HIGH;
          }
        }
      }
    }
    [свернуть]

    Подключение к Вектору:
    J2 -- порт PB
    J3 -- порт PA
    J1:4 -- PC5 (кнопка СС)
    J1:1 -- PC6 (кнопка УС)
    J1:3 -- PC7 (кнопка РУС)
    H2:TX -- сигнал ВВОД
    H2:RX -- сигнал СБРОС
    Сигнал индикатора РУС следует подпаять к выводу 27 чипа ATMEGA168 на плате. Удобнее было бы использовать выводы под кварц, но они что-то не заработали...

    Важный момент: для нормальной работы клавиатуры требуется подтяжка линий порта РВ (резисторы R35..R42, RP43) и установка диодов (VD3..VD8, VD12, VD13) в линии порта РА в соответствии со схемой клавиатуры Вектора.

    Фото

    [свернуть]
    Последний раз редактировалось Improver; 03.06.2024 в 09:51. Причина: исправления в скетче

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

    Xrust(28.05.2024)

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

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

Эту тему просматривают: 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

Ваши права

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