User Tag List

Показано с 1 по 3 из 3

Тема: Контроллер клавиатуры PS/2 для Пентагона

  1. #1

    Регистрация
    17.09.2020
    Адрес
    г. Шахты
    Сообщений
    17
    Спасибо Благодарностей отдано 
    2
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Контроллер клавиатуры PS/2 для Пентагона

    https://www.youtube.com/watch?v=Fo7E3_Vwk2w&t=1031s
    Кто-то смотрел или повторял это? Собрал для пентагона - не работает. Память только поставил AS6C1008, так как меньше нет ничего. Все неиспользуемые ноги шины адреса заземлил. CE# - на землю, СЕ2 - подтянул к питанию. По итогу вместо прижима KD0 - KD4 к земле - там пачка импульсов. Пачка импульсов также на WE памяти. Вручную (замыкая адрес и данные) все работает. Ниже скетч для ардуины
    Код:
    /*
    #define ADR8  A7
    #define ADR9  A6
    #define ADR10 A5
    #define ADR11 A4
    #define ADR12 A3
    #define ADR13 A2
    #define ADR14 A1
    #define ADR15 A0
    */
    #define ADR8  A0
    #define ADR9  A1
    #define ADR10 A2
    #define ADR11 A3
    #define ADR12 A4
    #define ADR13 A5
    #define ADR14 A6
    #define ADR15 A7
    
    #define X0 4
    #define X1 5
    #define X2 6
    #define X3 7
    #define X4 8
    
    /*
    #define X0 8 
    #define X1 7
    #define X2 6
    #define X3 5
    #define X4 4
    */
    #define WE  10
    #define OE  9
    
    #define PS2DATA 3
    #define PS2CLK  2
    
    #define debug  1
    
    char ROW_7F[6] = "12345";
    char ROW_BF[6] = "QWERT";
    char ROW_DF[6] = "ASDFG";
    char ROW_FB[6] = ":ZXCV"; // Caps Shift
    char ROW_EF[6] = "09876";
    char ROW_F7[6] = "POIUY";
    char ROW_FD[6] = "=LKJH"; // Enter
    char ROW_FE[6] = " @MNB"; // Space, Symbol Shift
    
    byte MEM[256];
    byte MAP[256];
    
    // 0 - 9
    // LShift,Backspace,Enter,,RShift
    // A - Z
    // UP DOWN LEFT RIGHT
    
    char SCAN[256]= {0x45, 0x16, 0x1E, 0x26, 0x25, 0x2E, 0x36, 0x3D, 0x3E, 0x46, \
                     0x12, 0x66, 0xFF, 0x5A, 0xFF, 0xFF, 0x59, \
                     0x1C, 0x32, 0x21, 0x23, 0x24, 0x2B, 0x34, 0x33, 0x43, 0x3B, 0x42, 0x4B, 0x3A, 0x31, 0x44, 0x4D, 0x15, 0x2D, 0x1B, 0x2C, 0x3C, 0x2A, 0x1D, 0x22, 0x35, 0x1A, \
                     117, 114, 107, 116};
    
    void setup() {
    
    pinMode(OE,OUTPUT);
    pinMode(WE,OUTPUT);
    pinMode(PS2CLK,INPUT);
    pinMode(PS2DATA,INPUT);
    Idle();
    
    for(int i=0;i<0x100;i++) {
      MEM[i]=0xFF;
      MAP[i]=0;
    }
    
    WriteByte(0xFF,0xFF, 0);
    
    //for(int i=0;i<0x100;i++) {
    //  WriteByte(i,0xFF, 0);
    //}
    
    Idle();
    digitalWrite(OE,LOW);
    delay(250);
    digitalWrite(OE,HIGH);
    delay(250);
    
    //#ifdef debug
    Serial.begin(230400);
    Serial.println("PS2 test: ");
    //#endif
    
    }
    
    byte SYM = 0;
    bool F0_MARK = false;
    
    void loop() {
      // put your main code here, to run repeatedly:
    
    if (digitalRead(PS2CLK)==LOW) { 
      if (digitalRead(PS2DATA)==LOW) {
    
        while(digitalRead(PS2CLK)==LOW) {} // wait for LOW to end
    
        byte DATA=0;
        for (int i=0;i<8;i++) {
          while(digitalRead(PS2CLK)==HIGH) {} // wait for HIG to end
          //delayMicroseconds(10);
          byte n = digitalRead(PS2DATA) << 7;
          DATA = (DATA >> 1) | n;
          
          while(digitalRead(PS2CLK)==LOW) {} // wait for LOW to end
          
          }
    
          for (int i=0;i<2;i++) { // read 3 extra bits
          while(digitalRead(PS2CLK)==HIGH) {} // wait for HIG to end
          while(digitalRead(PS2CLK)==LOW) {} // wait for LOW to end
          }
    
    
          if (DATA == 0xF0) {
          F0_MARK = true;
          } else {
            
            if (F0_MARK) {
            MAP[DATA] = 0;
            F0_MARK = false;
            #ifdef debug 
            Serial.println((String)"RELEASE: " + (char)(Scan2Char(DATA)));
            #endif
            Release(Scan2Char(DATA));
    
    
            if (CheckIdle()) Idle();
            
            } else {
            if (MAP[DATA]==0) {
                #ifdef debug 
                Serial.println((String)"PRESS: " + (char)(Scan2Char(DATA)));
                #endif
                Press(Scan2Char(DATA));
                MAP[DATA]=1;
                }
            
            }
         
          }
    
         
        }
      }
    
    } // loop
    
    int CheckIdle() {
    
    for (int i=0;i<256;i++) {
     
      if (MEM[i]!=0xFF) return 0;
      
      }
    return 1;
    }
    
    int Scan2Char(byte value) {
    
    if (value == 0x29) return 0x20; // Space
    
    for(int i=0;i<sizeof(SCAN);i++) {
      if (SCAN[i] == value) return (0x30 + i);
      }
    return 0;  
    }
    
    void Message(char msg[]) {
    for(int i=0;i<strlen(msg);i++) {
      Press(msg[i]);
      delay(50);
      Release(msg[i]);
      delay(250);
      }
    }
    
    // Backspace, up, down, left, right
    
    char extras[] = {';',':','0', \
                     '[',':','7', \
                     '\\',':','6', \
                     ']',':','5', \
                     '^',':','8', \
                    };
    
    void Press(char code) {
    
    for (int i=0;i<sizeof(extras);i+=3) {
    
    if (code == extras[i]) { // backspace
    Press(extras[i+1]);
    code = extras[i+2];
    }
    
    }
    
    Post(code,1);
    }
    
    void Release(char code) {
    
    for (int i=0;i<sizeof(extras);i+=3) {
    
    if (code == extras[i]) { // backspace
    Release(extras[i+1]);
    code = extras[i+2];
    }
    
    }
    
    Post(code,0);  
    }
    
    void Post(char code,int action) {
      // action = 1 PRESS
      // action = 0 RELEASE
    int n;
    int row;
    byte j;
    
    // FE - B-SPACE
    // FD - H-ENTER 
    // FB - CAPS - V
    // F7 - Y-P
    // EF - 6-0
    // DF - A-G
    // BF - Q-T
    // 7F - 1-5
    
    if (n=InArray(ROW_7F,code)) row=0x7F; else  // 7f
    if (n=InArray(ROW_BF,code)) row=0xBF; else  // bf
    if (n=InArray(ROW_DF,code)) row=0xDF; else  // df
    if (n=InArray(ROW_FB,code)) row=0xFB; else  // fb
    if (n=InArray(ROW_EF,code)) row=0xEF; else  // ef
    if (n=InArray(ROW_F7,code)) row=0xF7; else  // f7
    if (n=InArray(ROW_FD,code)) row=0xFD; else  // fd
    if (n=InArray(ROW_FE,code)) row=0xFE;       // fe
    
    n = (0b00100000 >> n) ^ 0xFF;
    
    WriteByte(row,n,action);
    Execute();
    }
    
    int InArray(char ARR[], char SEARCH) {
    for(int i=0;i<5;i++) {
      if (ARR[i]==SEARCH) return (i+1);
      }  
    return 0;
    }
    
    void Idle() {
    digitalWrite(WE,HIGH);
    digitalWrite(OE,HIGH);
    AddressBusMode(INPUT);
    DataBusMode(INPUT);
    }
    
    void Execute() {
    digitalWrite(WE,HIGH);
    digitalWrite(OE,HIGH);
    DataBusMode(INPUT);
    AddressBusMode(INPUT);
    digitalWrite(OE,LOW);
    //delay(10); 
    }
    
    void ReadByte(int address) {
    digitalWrite(WE,HIGH);
    digitalWrite(OE,HIGH);
    DataBusMode(INPUT);
    AddressBusMode(OUTPUT);
    SetAddress(address);
    digitalWrite(OE,LOW); 
    }
    
    void WriteByte(int address,int data, int action) {
    
    int newdata;
    int j;
    
    digitalWrite(WE,HIGH);
    digitalWrite(OE,HIGH);
    AddressBusMode(OUTPUT);
    DataBusMode(OUTPUT);
    
    if (action) newdata = (MEM[address] & data); else newdata = (MEM[address] | (data ^ 0xFF));
    
    SetData(newdata);
    MEM[address]=newdata;
    Serial.println(newdata, BIN);
    Serial.println(address, BIN);
    for(j=0;j<0x100;j++) {
      SetAddress(j & address);
      digitalWrite(WE,LOW);
    //  delayMicroseconds(2);
      digitalWrite(WE,HIGH);
    //  delayMicroseconds(2);
      }
    }
    
    void AddressBusMode(int active) {
    pinMode(ADR8,active);
    pinMode(ADR9,active);
    pinMode(ADR10,active);
    pinMode(ADR11,active);
    pinMode(ADR12,active);
    pinMode(ADR13,active);
    pinMode(ADR14,active);
    pinMode(ADR15,active);
    }  
    
    void DataBusMode(int active) {
    pinMode(X0,active);
    pinMode(X1,active);
    pinMode(X2,active);
    pinMode(X3,active);
    pinMode(X4,active);
    }
    
    void SetAddress(int address) {
    if (address & 0x01) digitalWrite(ADR8,HIGH); else digitalWrite(ADR8,LOW);
    if (address & 0x02) digitalWrite(ADR9,HIGH); else digitalWrite(ADR9,LOW);
    if (address & 0x04) digitalWrite(ADR10,HIGH); else digitalWrite(ADR10,LOW);
    if (address & 0x08) digitalWrite(ADR11,HIGH); else digitalWrite(ADR11,LOW);
    if (address & 0x10) digitalWrite(ADR12,HIGH); else digitalWrite(ADR12,LOW);
    if (address & 0x20) digitalWrite(ADR13,HIGH); else digitalWrite(ADR13,LOW);
    if (address & 0x40) digitalWrite(ADR14,HIGH); else digitalWrite(ADR14,LOW);
    if (address & 0x80) digitalWrite(ADR15,HIGH); else digitalWrite(ADR15,LOW);
    }
    
    void SetData(int data) {
    if (data & 0x01) digitalWrite(X0,HIGH); else digitalWrite(X0,LOW);  
    if (data & 0x02) digitalWrite(X1,HIGH); else digitalWrite(X1,LOW);  
    if (data & 0x04) digitalWrite(X2,HIGH); else digitalWrite(X2,LOW);  
    if (data & 0x08) digitalWrite(X3,HIGH); else digitalWrite(X3,LOW);  
    if (data & 0x10) digitalWrite(X4,HIGH); else digitalWrite(X4,LOW);  
    }

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

  3. #2

    Регистрация
    03.05.2020
    Адрес
    г. Тюмень
    Сообщений
    74
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    38
    Поблагодарили
    27 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    .
    Последний раз редактировалось Alex Shiloff; 08.09.2022 в 08:56.

  4. #3

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

    По умолчанию

    Странный какой то скетч... ADR14 и ADR15 подключены к А6 и А7. Это чисто аналоговые входы, а работают с ними как с цифровыми выходами. Или Ардуино не на AVR чипе.

    - - - Добавлено - - -

    Ну нет. На видео похоже AVR, да ещё и в ДИП корпусе. А у них физически А6 и А7 отсутствует.) А схему то как спаяли?

    - - - Добавлено - - -

    Код:
    #define ADR8    6
    #define ADR9    7
    #define ADR10   8
    #define ADR11   9
    #define ADR12   10
    #define ADR13   11
    #define ADR14   12
    #define ADR15   13
      
    #define X0      A0
    #define X1      A1
    #define X2      A2
    #define X3      A3
    #define X4      A4
    
    #define WE      4
    #define OE      5
    
    #define PS2CLK  3
    #define PS2DATA 2
    
    #define debug   1
    Код не соответствует схеме. Переименовал согласно схемы. На UNO по идее и компиляция не должна проходить.) Вообще, по видео вроде как грамотный мужик, но код... словно бык поссал.(

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

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

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

Похожие темы

  1. Ответов: 40
    Последнее: 27.06.2021, 15:41
  2. Ответов: 146
    Последнее: 31.05.2020, 19:00
  3. Ответов: 28
    Последнее: 06.06.2018, 15:28
  4. Ответов: 1
    Последнее: 19.09.2010, 18:15

Ваши права

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