Код:
#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;
}
}
}