User Tag List

Страница 9 из 29 ПерваяПервая ... 5678910111213 ... ПоследняяПоследняя
Показано с 81 по 90 из 282

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

  1. #81

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

    По умолчанию

    Цитата Сообщение от izzx Посмотреть сообщение
    К плате, которая не DIP, надо проводочки припаивать?
    Да, на плате PLCC не предусмотрены контакты для подключения отладочного порта.

  2. #82

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

    По умолчанию

    Выкладываю альфа-версию прошивки под Вектор-06Ц
    Подключение: PA - J3, PB - J2, J1: 1 - УС, 3 - РУС/ЛАТ, 4 - СС.
    Раскладка пока только ЙЦУКЕН.
    Сам, к сожалению, протестировать не могу.



    Код:
    #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 SS 11
    #define US  12
    #define RUS 13
    #define RSTMT 14
    #define CSMT  15
    #define DATMT 16
    #define STBMT 17
    #define DATAPIN 2
    #define IRQPIN  3
    
    volatile boolean d = HIGH;
    volatile boolean ss = HIGH;
    volatile boolean us = HIGH;
    volatile boolean rus = HIGH;
    uint8_t table[128] = {127,127,127,112,80,48,64,127,127,127,127,127,96,127,127,127,127,1,127,127,127,37,18,127,127,127,22,23,
    100,52,34,127,127,54,103,118,86,66,50,127,127,119,85,20,84,53,82,127,127,70,21,38,6,101,98,127,127,127,7,117,116,114,3,127,
    127,36,69,55,87,2,19,127,127,4,115,68,102,39,83,127,127,127,71,127,5,127,127,127,127,17,33,87,127,71,127,127,127,127,127,127,
    127,127,49,127,127,65,127,0,48,127,127,127,32,16,113,81,112,64,32,127,127,96,97,127,127,80,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(SS, OUTPUT); //SS
      pinMode(US, OUTPUT);  //US
      pinMode(RUS, OUTPUT); //RUS
      pinMode(RSTMT, OUTPUT); //RES
      pinMode(CSMT, OUTPUT);  //CS
      pinMode(DATMT, OUTPUT); //DAT
      pinMode(STBMT, OUTPUT); //STB
      //Инициализация клавиатуры
      keyboard.begin( DATAPIN, IRQPIN );
      
      digitalWrite(SS, HIGH);
      digitalWrite(US, HIGH);
      digitalWrite(RUS, HIGH);
      
      //Инициализация MT8816
      SetAddr(0);
      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 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 0xE0:              //если считался префикс 0xE0
            break;
          case 0x12:              //если считался префикс 0x12 SS
            ss = !ss;
            digitalWrite(SS, ss);
            d = HIGH;
            break;
          case 0x14:              //если считался префикс 0x14 RUS
            if (d == HIGH) rus = !rus;
            digitalWrite(RUS, rus);
            d = HIGH;
            break;
          case 0x58:              //если считался префикс 0xE0 US
            us = !us;
            digitalWrite(US, us);
            d = HIGH;
            break;
          case 0xF0:              //если считался префикс 0xF0 (отпускание клавиши)
            d = LOW;
            break;
          default:  
            SetAddr(table[c]);
            SetKey(d);
            d = HIGH;
        }
      }
    }

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

    crackintosh(19.12.2021), KACTET(07.12.2021)

  3. #83

    Регистрация
    09.01.2006
    Адрес
    Bryansk
    Сообщений
    1,339
    Спасибо Благодарностей отдано 
    47
    Спасибо Благодарностей получено 
    140
    Поблагодарили
    107 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Всем привет.
    Собираюсь купить сей девайс для УКНЦ, но нужна помощь клуба сделать под УКНЦ прошивку и развести шлейф.
    Объясните, что нужно для разведения шлейфа? В идеале, хочу взять шлейф и колодку IDC-34 и развести нужные пины (пропуская ненужные на J2) на 2 шлейфа в линию для МС-7007.
    УКНЦ, ДВК-3, Ленинград-1 (48 кб)

  4. #84

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

    По умолчанию

    Arseny, нужно схему клавиатуры, прошивку сделать помогу.

  5. #85

    Регистрация
    09.01.2006
    Адрес
    Bryansk
    Сообщений
    1,339
    Спасибо Благодарностей отдано 
    47
    Спасибо Благодарностей получено 
    140
    Поблагодарили
    107 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Xrust Посмотреть сообщение
    Arseny, нужно схему клавиатуры, прошивку сделать помогу.
    В сообщении #53 есть ссылка на схемы для Алесты aleste_keyboard.zip. Там есть и распиновка матрицы и даже картинка как будут распределены кнопки :-)
    УКНЦ, ДВК-3, Ленинград-1 (48 кб)

  6. #86

    Регистрация
    23.04.2020
    Адрес
    г. Тотьма
    Сообщений
    903
    Спасибо Благодарностей отдано 
    273
    Спасибо Благодарностей получено 
    339
    Поблагодарили
    182 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Так никто и не захотел сделать кнопки сброс и nmi? Я всё ещё надеюсь, а то привык, руки тянутся.

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


    https://drive.google.com/drive/folde...xZ83juCuaBe32I

    Scorpion ZS 256 Turbo+/GMX 2MB/SMUC v1.3 OP/CF-IDE 2GB/TS ARM/Covox #DD/FDD 5'25/FDD 3'5/AT Kbrd & Mouse Ctrl v2.5/Universal PS/2 Kbrd Ctrl/ZX WiFi
    Leningrad 1/Sega Joy Adapter
    DivGMX
    ZX Spectrum +2A
    ZX Evolution rev. C

    TCK Computer 486DX2-66/512K Tridend 9000i/8MB SIMM72/CF-IDE 512MB/ESS 1869/CNet CN200/FDD 5'25/FDD 3'5
    [свернуть]

  7. #87

    Регистрация
    20.01.2020
    Адрес
    г. Калуга
    Сообщений
    146
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    19
    Поблагодарили
    16 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    izzx,

    Планирую, в принципе написал (хотя в С я и не ахти как разбираюсь) но еще отлаживать надо, а у меня самодельная клава пока не полностью запустилась. Однако потребуется доработка платы (хотя если только RESET и NMI) можно обойтись и без доработок, можно будет использовать пины программирования меги, надо будет просто в прошивке поправить пины) для вывода наружу не используемых пинов меги.

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

    izzx(14.12.2021)

  8. #88

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

    По умолчанию

    nemo, еще один выход можно попробовать взять с вывода CS матрицы, а ее прицепить к +5в.

    izzx, Пример реализации можно взять из кода для Ветора - там таким образом переключаются кнопки СС, УС, РУС.

  9. #89

    Регистрация
    23.04.2020
    Адрес
    г. Тотьма
    Сообщений
    903
    Спасибо Благодарностей отдано 
    273
    Спасибо Благодарностей получено 
    339
    Поблагодарили
    182 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Xrust, спасибо. Если не дождусь готового варианта, буду сам делать.

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


    https://drive.google.com/drive/folde...xZ83juCuaBe32I

    Scorpion ZS 256 Turbo+/GMX 2MB/SMUC v1.3 OP/CF-IDE 2GB/TS ARM/Covox #DD/FDD 5'25/FDD 3'5/AT Kbrd & Mouse Ctrl v2.5/Universal PS/2 Kbrd Ctrl/ZX WiFi
    Leningrad 1/Sega Joy Adapter
    DivGMX
    ZX Spectrum +2A
    ZX Evolution rev. C

    TCK Computer 486DX2-66/512K Tridend 9000i/8MB SIMM72/CF-IDE 512MB/ESS 1869/CNet CN200/FDD 5'25/FDD 3'5
    [свернуть]

  10. #90

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

    По умолчанию

    izzx, попробуйте. Сам не испытывал еще, но компилируется без ошибок.

    Код:
    #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 RES 11
    #define NMI 12
    #define RSTMT 14
    #define CSMT  15
    #define DATMT 16
    #define STBMT 17
    #define DATAPIN 2
    #define IRQPIN  3
    
    volatile boolean d = HIGH;
    volatile boolean res = HIGH;
    volatile boolean nmi = 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(RES, OUTPUT);   //Reset
      pinMode(NMI, OUTPUT);   //NMI
      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); //инициализация
      digitalWrite(CSMT, HIGH); //выбор чипа
      digitalWrite(RSTMT, HIGH);
      digitalWrite(RSTMT, LOW);  //сброс
      digitalWrite(CSMT, LOW);
      
      digitalWrite(RES, res);
      digitalWrite(NMI, nmi);
      
      SetAddr(table[0x12]);
      SetKey(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 0xE0:              //если считался префикс 0xE0
            break;
          case 0x7E:                 //если считался код 0x7E RES (значит клавишу сброса нажали или отпустили - не важно)
            res = !res;              //просто инвертируем состояние переменной
            digitalWrite(RES, res);   //и записываем 
            d = HIGH;                //даже если было отпускание клавиши, эта клавиша (Reset) не писалась в матрицу, так что LOW записывать в нее точно не надо. 
            break;
          case 0x07:              //если считался код 0x07 NMI
            nmi = !nmi;
            digitalWrite(NMI, nmi);
            d = HIGH;
            break;
          case 0xF0:              //если считался префикс 0xF0 (отпускание клавиши)
            d = LOW;              //значит при следующей записи кода в матрицу нужно будет записать LOW, если это не будет какое-то сочетание или NMI/Reset
            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;           //Мы ведь могли и LOW записать, если ранее был считан префикс отпускания 0xF0. Так что теперь приготовимся записать HIGH.
        }
      }
    }
    Начальное состояние выходов определяется переменными res и nmi. Они расположены на J1 1 и 4. В качестве клавиши Res- Scroll Lock, в качестве NMI - F12. Если на клавиатуре есть Power, Sleep и Wake, наверное удобнее их использовать. С сочетаниями чуть сложнее, но тоже можно сделать. Давайте пока так испытаем.

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

    izzx(15.12.2021)

Страница 9 из 29 ПерваяПервая ... 5678910111213 ... ПоследняяПоследняя

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

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

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

Ваши права

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