Код:
#include <Keypad.h>
#define AX0 8
#define AX1 9
#define AX2 10
#define AX3 11
#define AY0 1
#define AY1 2
#define AY2 3
#define RSTMT 14
#define CSMT 12
#define DATMT 0
#define STBMT 13
const byte ROWS=8;
const byte COLS=8;
byte rowPins[ROWS] = {31, 30, 29, 28, 27, 26, 25, 24}; //линия A0..A7
byte colPins[COLS] = {16, 17, 18, 19, 20, 21, 22, 23}; //линия D0..D7
// 7 битные адреса управления MT8816, порядковый номер массива = dec значению ASCII символа из массива keys, (последний элемент массива №90 = 1, char 'Z' = 90, 7bit(1)= 0000001,
//т.е. AX0=1, AX1..AY2=0, контакт Y0 на X1, (соответствия X0..X4 = D0..D4, Y0..Y7 = A0..A7 - раскладка ZX клавиатуры)
int8_t table[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,64,48,49,
50,51,52,68,67,66,65,127,127,127,
127,127,127,127,16,116,3,18,34,19,
20,100,82,99,98,97,114,115,81,80,
32,35,17,36,83,4,33,2,84,1};
//матриц клавиш корвета, заглавные - символы, прописные - служебные (комбинации), A0 на D0 = ., или 30 на 17 = B
// p - Space, u - Up, d - Down, r - Right, l - left, e - Enter, s -SS, c - CS, t- Edit, i - Inv, n - TRUE, g - Graph, k- Capslock, x - Ext, b - Break, y - Del, z-reserv ИЗ DEL
char keys[ROWS][COLS] = {
{'.','F',',','W','L','T','A','U'},
{'u','B','Q','R','K','V','Y','J'},
{'G','Z','H','C','N','E','l','D'},
{'M','S','P','I','d','O','X','/'},
{'-','2','3','4','5','6','7','8'},
{'9','0','=','1',':','+','r','*'},
{'e','i','b','z','n','y','a','p'},
{'c','t','g','x','s','k','s','c'}};
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int c;
void setup() {
pinMode(AX0, OUTPUT);
pinMode(AX1, OUTPUT);
pinMode(AX2, OUTPUT);
pinMode(AX3, OUTPUT);
pinMode(AY0, OUTPUT);
pinMode(AY1, OUTPUT);
pinMode(AY2, OUTPUT);
pinMode(RSTMT, OUTPUT);
pinMode(CSMT, OUTPUT);
pinMode(DATMT, OUTPUT);
pinMode(STBMT, OUTPUT);
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 ON(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));
digitalWrite(CSMT, HIGH);
digitalWrite(STBMT, HIGH);
digitalWrite(DATMT, HIGH);
digitalWrite(STBMT, LOW);
digitalWrite(CSMT, LOW);
}
void OFF(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));
digitalWrite(CSMT, HIGH);
digitalWrite(STBMT, HIGH);
digitalWrite(DATMT, LOW);
digitalWrite(STBMT, LOW);
digitalWrite(CSMT, LOW);
}
//если изменилось состояние любой клавишы, в случае 'u' если нажата клавиша замыкаем 0 и 67 (7bit значения управления) если отжата разымкает 67 и 0
void loop() {
if (kpd.getKeys())
{
for (int i=0; i<LIST_MAX; i++) //принцип работы keypad.h
{
if ( kpd.key[i].stateChanged )
{
switch (kpd.key[i].kchar) {
case 'u': //Up
if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(67); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(67); OFF(0); }
break;
case 'd': //Down
if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(68); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(68); OFF(0); }
break;
case 'l': //Left
if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(52); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(52); OFF(0); }
break;
case 'r': //Right
if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(66); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(66); OFF(0); }
break;
case 'e': //Enter
if ((kpd.key[i].kstate) == PRESSED) { ON(96); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(96); }
break;
case 'p': //Space
if ((kpd.key[i].kstate) == PRESSED) { ON(112); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(112); }
break;
case 'c': //CS
if ((kpd.key[i].kstate) == PRESSED) { ON(0); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(0); }
break;
case 's': //SS
if ((kpd.key[i].kstate) == PRESSED) { ON(113); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(113); }
break;
case 't': //Edit
if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(48); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(48); OFF(0); }
break;
case 'i': //Inv
if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(51); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(51); OFF(0); }
break;
case 'n': //True
if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(50); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(50); OFF(0); }
break;
case 'g': //Gpaph
if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(65); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(65); OFF(0); }
break;
case 'k': //CapsLock
if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(49); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(49); OFF(0); }
break;
case 'x': //Ext
if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(113); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(113); OFF(0); }
break;
case 'b': //Break
if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(112); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(112); OFF(0); }
break;
case 'y': //Del
if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(64); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(64); OFF(0); }
break;
case '.': //.
if ((kpd.key[i].kstate) == PRESSED) { ON (113); ON(114); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(114); OFF(113); }
break;
case ',': //.
if ((kpd.key[i].kstate) == PRESSED) { ON (113); ON(115); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(115); OFF(113); }
break;
case '-': //-
if ((kpd.key[i].kstate) == PRESSED) { ON (113); ON(99); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(99); OFF(113); }
break;
case '+': //+
if ((kpd.key[i].kstate) == PRESSED) { ON (113); ON(98); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(98); OFF(113); }
break;
case '=': //=
if ((kpd.key[i].kstate) == PRESSED) { ON (113); ON(97); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(97); OFF(113); }
break;
case ':': //:
if ((kpd.key[i].kstate) == PRESSED) { ON (113); ON(1); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(1); OFF(113); }
break;
case '*':
if ((kpd.key[i].kstate) == PRESSED) { ON (113); ON(116); } else if ((kpd.key[i].kstate) == RELEASED) { OFF(116); OFF(113); }
break;
case '/': //back
if ((kpd.key[i].kstate) == PRESSED) { ON (0); ON(113); delay(50); OFF(113); delay (50); ON(18); delay (50); OFF(18);} else if ((kpd.key[i].kstate) == RELEASED) {OFF(0); }
break;
default:
c = kpd.key[i].kchar;
if ((kpd.key[i].kstate) == PRESSED) {ON(table[c]);} else if ((kpd.key[i].kstate) == RELEASED) {OFF(table[c]);}
}
}
}
}
}
схема просто для примера т.к пины использовались в скетче, вариации любые.