Код:
//UKNZ
#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
#define LAT 0
#define EXT 1
#define RUS 2
volatile boolean d = HIGH;
volatile uint8_t lang = LAT;
volatile uint8_t e = lang;
uint8_t table[3][132] = {{127,116,127,8,5,3,4,127,127,11,100,117,7,17,0,127,
127,65,64,127,33,50,19,127,127,127,106,68,53,52,20,127,
127,35,72,42,22,6,21,127,127,70,90,34,71,55,23,127,
127,39,57,105,40,51,24,127,127,127,69,18,36,9,10,127,
127,74,37,54,56,121,122,127,127,88,118,41,2,38,67,127,
127,127,58,127,25,120,127,127,66,49,102,26,127,89,127,127,
127,127,127,127,127,127,85,127,127,82,127,83,80,127,127,127,
81,97,98,99,115,96,1,127,127,84,114,16,84,112,127,127,
127,127,127,101},
{127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,
127,49,127,127,33,127,127,127,127,127,127,127,127,127,127,127,
127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,
127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,
127,127,127,127,127,127,127,127,127,127,119,127,127,127,127,127,
127,127,127,127,127,127,127,127,127,127,113,127,127,127,127,127,
127,127,127,127,127,127,127,127,127,127,127,73,127,127,127,127,
127,127,87,127,86,103,127,127,127,127,127,127,127,127,127,127,
127,127,127,127},
{127,116,127,8,5,3,4,127,127,127,100,117,7,17,127,127,
127,65,64,127,33,18,19,127,127,127,50,51,34,35,20,127,
127,68,67,52,36,6,21,127,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,119,42,90,106,67,127,
127,127,89,127,105,120,127,127,66,49,102,104,127,127,127,127,
127,127,127,127,127,127,85,127,127,82,127,83,80,127,127,127,
81,97,98,99,115,96,1,127,127,127,114,16,84,112,127,127,
127,127,127,101}};
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(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);
InitMt();
}
//Сброс MT
void InitMt() {
digitalWrite(STBMT, HIGH); //инициализация
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(RSTMT, HIGH);
digitalWrite(RSTMT, LOW); //сброс
digitalWrite(CSMT, LOW);
digitalWrite(STBMT, LOW);
}
//Установка адреса MT
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));
}
//Установка ключа MT
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 0xE1: //Если считался префикс 0xE1 сброс MK
InitMt();
break;
case 0xE0: //Если считался префикс 0xE0
e = EXT; //тогда код будет из table[1]
break;
case 0xF0: //Если считался префикс 0xF0 (отпускание клавиши)
d = LOW; //тогда готовимся записывать "0" в MT
break;
case 0x78: //Если считался код 0x78 [F11]
lang = RUS; //переключаемся на русскую раскладку
e = lang;
d = HIGH; //помним о 0xF0 при отпускании [F11],
break; //фактически раскладка переключается дважды.
case 0x07: //Если считался код 0x07 [F12]
lang = LAT; //переключаемся на латинскую раскладку
e = lang;
d = HIGH; //помним о 0xF0 при отпускании [F12]
break;
default:
SetAddr(table[e][c]); //получаем адрес ключа из текущей таблицы
SetKey(d); //переключаем ключ в состояние d
d = HIGH; //если было отжатие ключа, принудительно переводим в нажатие
e = lang; //если был код из table[1], возвращаем на текущую раскладку
}
}
}