n_sonic, попробуйте, альфа версия для Алесты, сам не проверял. Пока поддержка только JCUKEN.

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

Код:
#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 RSTMT 14
#define CSMT  15
#define DATMT 16
#define STBMT 17
#define DATAPIN 2
#define IRQPIN  3

volatile boolean d = HIGH;
uint8_t table[128] = {127,101,127,8,5,3,4,11,127,100,117,127,7,17,118,127,127,65,64,127,33,18,19,127,127,127,50,51,34,35,20,49,127,68,67,52,36,6,21,74,127,70,69,53,22,37,23,127,127,71,54,55,38,39,24,127,127,127,72,56,40,9,10,127,127,57,41,25,26,121,122,127,127,58,88,42,90,106,120,127,127,127,89,127,119,16,127,127,66,64,102,119,127,89,127,127,127,127,127,127,127,127,73,127,127,82,127,83,80,127,127,127,81,97,98,99,115,96,1,127,116,127,114,16,84,112,127,127};

PS2KeyRaw keyboard;
void setup() {
  //Инициализация портов
  pinMode(19, OUTPUT);
  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(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);
}
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 0xF0:              //если считался префикс 0xF0 (отпускание клавиши)
        d = LOW;
        break;
      default:
        SetAddr(table[c]);
        SetKey(d);
        d = HIGH;
    }
  }
}
[свернуть]