Код:
// Вектор-06ц / ПК-6128ц
#include "ps2_Keyboard.h"
#include "ps2_NullDiagnostics.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 // J1:4
#define US 12 // J1:1
#define RUS 13 // J1:3
#define VVD 1 // H2:TX
#define SBR 0 // H2:RX
#define IRUS 18 // вывод 27
#define RSTMT 14
#define CSMT 15
#define DATMT 16
#define STBMT 17
#define DATAPIN 2
#define IRQPIN 3
// J2 -- PB
// J3 -- PA
typedef ps2::NullDiagnostics Diagnostics_;
static Diagnostics_ diagnostics;
static ps2::Keyboard<DATAPIN, IRQPIN, 1, Diagnostics_> ps2Keyboard(diagnostics);
static ps2::KeyboardLeds lastLedSent = ps2::KeyboardLeds::none;
volatile boolean d = HIGH;
volatile boolean OldRUS;
volatile boolean extkey = LOW;
const uint8_t table[128] = {0xFF, 0xFF, 0xFF, 0x71, 0x51, 0x31, 0x41, 0xFF, // 0 00 - - - F5 F3 F1 F2 - (код клавиши PB PA)
0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x00, 0x33, 0xFF, // 8 08 - - - - F4 TB ; -
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x25, 0x12, 0xFF, // 16 10 - - - - - J 1 -
0xFF, 0xFF, 0x16, 0x17, 0x64, 0x34, 0x22, 0xFF, // 24 18 - - Q Y F C 2 -
0xFF, 0x36, 0x67, 0x76, 0x56, 0x42, 0x32, 0xFF, // 32 20 - S ^ W U 4 3 -
0xFF, 0x77, 0x55, 0x14, 0x54, 0x35, 0x52, 0xFF, // 40 28 - _ M A E K 5 -
0xFF, 0x46, 0x15, 0x26, 0x06, 0x65, 0x62, 0xFF, // 48 30 - T I R P N 6 -
0xFF, 0xFF, 0x07, 0x75, 0x74, 0x72, 0x03, 0xFF, // 56 38 - - X O G 7 8 -
0xFF, 0x24, 0x45, 0x37, 0x57, 0x02, 0x13, 0xFF, // 64 40 - B L [ ] 0 9 -
0xFF, 0x04, 0x43, 0x44, 0x66, 0x27, 0x53, 0xFF, // 72 48 - @ , D V Z = -
0xFF, 0xFF, 0x47, 0xFF, 0x05, 0x73, 0xFF, 0xFF, // 80 50 - - \ - H / - -
0xFF, 0x10, 0x20, 0x23, 0xFF, 0x63, 0xFF, 0xFF, // 88 58 - ПС ВК : - . - -
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x30, 0xFF, // 96 60 - - - - - - ЗБ -
0xFF, 0xFF, 0xFF, 0x40, 0x01, 0xFF, 0xFF, 0xFF, // 104 68 - - - < HM - - -
0xFF, 0xFF, 0x70, 0xFF, 0x60, 0x50, 0x21, 0xFF, // 112 70 - - v - > ^ А2 -
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x11, 0xFF, 0xFF // 120 78 - - - - - СТ - -
};
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(IRUS, INPUT_PULLUP); //индикатор RUS
pinMode(VVD, OUTPUT); //ВВОД
pinMode(SBR, OUTPUT); //СБРОС
pinMode(RSTMT, OUTPUT); //RES
pinMode(CSMT, OUTPUT); //CS
pinMode(DATMT, OUTPUT); //DAT
pinMode(STBMT, OUTPUT); //STB
OldRUS = digitalRead(IRUS);
//Инициализация клавиатуры
ps2Keyboard.begin();
ps2Keyboard.awaitStartup();
if ( OldRUS == HIGH ) {
ps2Keyboard.sendLedStatus(ps2::KeyboardLeds::numLock);
lastLedSent = ps2::KeyboardLeds::numLock;
}
else {
ps2Keyboard.sendLedStatus(ps2::KeyboardLeds::numLock | ps2::KeyboardLeds::scrollLock);
lastLedSent == (ps2::KeyboardLeds::numLock | ps2::KeyboardLeds::scrollLock);
}
digitalWrite(SS, HIGH);
digitalWrite(US, HIGH);
digitalWrite(RUS, HIGH);
digitalWrite(VVD, HIGH);
digitalWrite(SBR, HIGH);
//Инициализация MT8816
SetAddr(0);
digitalWrite(RSTMT, LOW);
digitalWrite(CSMT, LOW);
digitalWrite(DATMT, LOW);
digitalWrite(STBMT, LOW); //инициализация
digitalWrite(STBMT, HIGH); //инициализация
digitalWrite(CSMT, HIGH); //выбор чипа
digitalWrite(RSTMT, HIGH);
digitalWrite(RSTMT, LOW); //сброс
digitalWrite(CSMT, LOW);
digitalWrite(STBMT, 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()
{
//чтение кода
ps2::KeyboardOutput scanCode = ps2Keyboard.readScanCode();
if ( scanCode != ps2::KeyboardOutput::none ) {
switch (scanCode) {
case ps2::KeyboardOutput::unmake: { //если считался префикс 0xF0 (отпускание клавиши)
d = LOW;
break;
}
case ps2::KeyboardOutput::extend: { //если считался префикс 0xE0 -- игнорим
extkey = HIGH;
break;
}
case ps2::KeyboardOutput::sc2_leftShift: { //если считался код 0x12 SS (Shift)
if ( extkey == LOW) { // если был код с префиксом 0xE0, то игнорируем нажатие
digitalWrite(SS, !d);
}
extkey = LOW;
d = HIGH;
break;
}
case ps2::KeyboardOutput::sc2_leftCtrl: { //если считался код 0x14 RUS (Ctrl)
digitalWrite(RUS, !d);
d = HIGH;
extkey = LOW;
break;
}
case ps2::KeyboardOutput::sc2_capsLock: { //если считался код 0x58 US (CapsLock)
digitalWrite(US, !d);
d = HIGH;
break;
}
case ps2::KeyboardOutput::sc2_f11: { //если считался код 0x78 VVD (F11)
digitalWrite(VVD, !d);
}
case ps2::KeyboardOutput::sc2_f12: { //если считался код 0x07 SBR (F12)
digitalWrite(SBR, !d);
d = HIGH;
break;
}
default: {
byte c = (byte)scanCode;
if ( c < 128 ) { // скан-код может быть больше!
if ( table[c] != 0xFF ) {
SetAddr(table[c]);
SetKey(d);
}
}
extkey = LOW;
d = HIGH;
}
}
}
else {
if (digitalRead(IRUS) == LOW) { //проверяем состояние индикатора РУС
if ( OldRUS == HIGH ) {
ps2Keyboard.sendLedStatus(ps2::KeyboardLeds::numLock | ps2::KeyboardLeds::scrollLock);
lastLedSent == (ps2::KeyboardLeds::numLock | ps2::KeyboardLeds::scrollLock);
OldRUS = LOW;
}
}
else {
if ( OldRUS == LOW ) {
ps2Keyboard.sendLedStatus(ps2::KeyboardLeds::numLock);
lastLedSent == ps2::KeyboardLeds::numLock;
OldRUS = HIGH;
}
}
}
}