Arduino PS2 клавиатура отжатие клавиши

4kspw
Offline
Зарегистрирован: 11.07.2018

как на ардуино определить момент отжатия клавиши на клавиатуре ps2

у меня чето нихера не работает вот код


#include <PS2Keyboard.h>
 int i;
unsigned long TimePresKey[256];
const int DataPin = 2;
const int IRQpin =  3;

PS2Keyboard keyboard;

void setup() {
  delay(1000);
  
  for (i=0;i<257;i=i+1){
  TimePresKey[i]=0;  
  }
  keyboard.begin(DataPin, IRQpin);
  Serial.begin(9600);
  Serial.println("Keyboard Test:");
}

void loop() {
 
 for (i=0;i<257;i=i+1){
  if (TimePresKey[i]!=0){
   if (((millis()-TimePresKey[i])>100)) {
   TimePresKey[i]=0;
   Serial.print("up ");
   Serial.println(i, HEX); 
   } 
    
  }
 }
 
  if (keyboard.available()) {
    
    // read the next key
    byte c = keyboard.read();
    
    // check for some of the special keys
     TimePresKey[c]=millis();
      // otherwise, just print all normal characters
       Serial.println("down ");
      Serial.println(c,HEX);
    
  }
}

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Циклы до 255 максимального значения должны быть, да и логика странная, не проще запоминать скан код предыдущий и если он изменился, значит клавиша отжата.

4kspw
Offline
Зарегистрирован: 11.07.2018

да я совсем забыл что если массив размером 256 его последний индекс 255.

 

4kspw
Offline
Зарегистрирован: 11.07.2018

Все получилось, я отказался от предыдущего кода, теперь показывает нажатие и отпуск клавиши

const int DataPin = 2; // канал DATA клавиатуры
const int IRQpin =  3; // канал CLK клавиатуры
 
int count=1;          // счетчик текущего бита 11-битного кода от клавиатуры
int m=0;              // счетчик текущего бита скан-кода
uint8_t scan_code=0;  // скан-код нажатой клавиши
uint8_t keyOld=0;
void ps2interrupt(void) {        /* обработчик прерывания от CLK клавиатуры */
 
  /* считываем скан-код с клавиатуры по битно в переменную scan_code */
  if ((count>1) and (count<11)) { /* вырезаем из 11-и битного кадра, 8-и битные скан код */
    scan_code |=(digitalRead(2)<<m);
    m++;    
  };
  count++;                          
 
  /* выводим результат на экран, когда все 11 бит массива заполнены */      
  if (count>11) {  
    WriteKey(scan_code);  /* ВЫВОДИМ */      
    m=0;    
    count=1;
    scan_code=0;
  }
}
void WriteKey(uint8_t key){
  if (key == 0xc0) {return;}
  if (key == 0xf0 || key ==0xE0){
  keyOld=key;
  return;}
  if (keyOld == 0xf0 || keyOld == 0xe0){
    Serial.print("up ");
    Serial.println(key,HEX);
    keyOld=0;
    key=0;
   return; 
  }else if (keyOld != key){
    Serial.print("down ");
    Serial.println(key,HEX);
   keyOld=key; 
  }
  
  
}
 
void setup() {  
  delay(1000);
  Serial.begin(9600);  
  pinMode(DataPin, INPUT);
  pinMode(IRQpin, INPUT);  
 
  attachInterrupt(1, ps2interrupt, FALLING); //посадим на прерывание от 3 pin (канал клавиатуры CLK) обработчик ps2interrupt
  Serial.begin(9600);
}
 
void loop() {
  delay(1000);
}

только у меня отличаются скан коды от того что здесь: https://ru.wikipedia.org/wiki/%D0%A1%D0%BA%D0%B0%D0%BD-%D0%BA%D0%BE%D0%B4