Arduino PS2 клавиатура отжатие клавиши
- Войдите на сайт для отправки комментариев
Ср, 11/07/2018 - 08:46
как на ардуино определить момент отжатия клавиши на клавиатуре 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);
}
}
Циклы до 255 максимального значения должны быть, да и логика странная, не проще запоминать скан код предыдущий и если он изменился, значит клавиша отжата.
да я совсем забыл что если массив размером 256 его последний индекс 255.
Все получилось, я отказался от предыдущего кода, теперь показывает нажатие и отпуск клавиши
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