Прошивка написана, по большей части, методом "гугления" в Яндексе по разным нюансам работы библиотек
///////////////////////////////////////////////////////////////////////////////////////
//
// Клавиатура макросов на основе Arduino Leo / Arduino PRO Micro
// автор: Акулов А.С. aka DrAku1a
// дата: 18.08.2021
//
// Thanks to: https://forum.arduino.cc/t/numpad-keys/257542/8
// and https://forum.arduino.cc/t/numpad-keys/257542/9
// and: https://habr.com/ru/post/460409/
//
// (с) Free + Open Source
//
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
//
// В данной прошивке прописаны макросы для программирования на языке "1С"
// Опрашивается 12 клавиш кейпада (4 ряда x 3 колонки)
// Не изменяет текущий язык ввода, а введенные символы не зависят от текущего языка ввода
// Ввод осуществляется имитацией ввода ALT+(код на цифровой клавиатуре)
// Ориентировано на RU-клавиатуры, как будет вести себя в других языках - неизвестно (предполагаю, проблема возникнет только при написании "ЕстьNULL"
//
// Скетч использует 7332 байт памяти устройства.
// Глобальные переменные используют 373 байт динамической памяти.
//
///////////////////////////////////////////////////////////////////////////////////////
#include "Keypad.h"
#include "Keyboard.h"
const byte ROWS = 5; //число строк у нашей клавиатуры
const byte COLS = 4; //число столбцов у нашей клавиатуры
char hexaKeys[ROWS][COLS] = {// здесь мы располагаем названия наших клавиш, как на клавиатуре,для удобства пользования
{'L', '|', 'A', '"'},
{'>', '{', '#', 'B'},
{'<', '}', '$', 'B'},
{'[', ']', '&', 'N'},
{'I', 'I', '@', 'N'}
};
char altKeys[ROWS][COLS] = {// альтернативная раскладка - аналог цифровой клавиатуры
{'L', '/', 'x', '-'},
{'7', '8', '9', '+'},
{'4', '5', '6', '+'},
{'1', '2', '3', 'R'},
{'0', '0', '.', 'R'}
};
bool keyMode = false;
byte rowPins[ROWS] = { 5, 6, 7, 8, 9}; //к каким выводам подключаем управление строками
byte colPins[COLS] = {10, 16, 14, 15}; //к каким выводам подключаем управление столбцами
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
#define KEYPAD_0 234
#define KEYPAD_1 225
#define KEYPAD_2 226
#define KEYPAD_3 227
#define KEYPAD_4 228
#define KEYPAD_5 229
#define KEYPAD_6 230
#define KEYPAD_7 231
#define KEYPAD_8 232
#define KEYPAD_9 233
#define KEYPAD_DIV 220
#define KEYPAD_MLT 221
#define KEYPAD_MNS 222
#define KEYPAD_PLS 223
#define KEYPAD_ENT 224
#define KEYPAD_DOT 235
const uint8_t _keypadmap[10] = {KEYPAD_0, KEYPAD_1, KEYPAD_2, KEYPAD_3, KEYPAD_4, KEYPAD_5, KEYPAD_6, KEYPAD_7, KEYPAD_8, KEYPAD_9};
void SendCode(uint8_t code) {
if (code>=32) {
Keyboard.press(KEY_LEFT_ALT);
delay(10);
uint8_t digit = (uint8_t)(code / 100);
if(digit>=1) {
Keyboard.press(_keypadmap[digit]);
Keyboard.release(_keypadmap[digit]);
};
digit = (uint8_t)((code % 100) / 10);
Keyboard.press(_keypadmap[digit]);
Keyboard.release(_keypadmap[digit]);
digit = (uint8_t)(code % 10);
Keyboard.press(_keypadmap[digit]);
Keyboard.release(_keypadmap[digit]);
Keyboard.release(KEY_LEFT_ALT);
}
}
void SendNumericKey(byte code) {
Keyboard.releaseAll();
Keyboard.press(code);
Keyboard.release(code);
Keyboard.releaseAll();
}
char GetNumericKey(char customKey) {
for(byte r=0; r<ROWS; r++)
for(byte c=0; c<COLS; c++)
if(hexaKeys[r][c]==customKey) return altKeys[r][c];
}
void setup() {
Keyboard.begin();
pinMode(A3, OUTPUT);
pinMode(2, INPUT_PULLUP);
delay(10);
if(digitalRead(2)==0){
keyMode = !keyMode;
Keyboard.releaseAll();
digitalWrite(A3, keyMode?HIGH:LOW);
};
}
void loop() {
char customKey = customKeypad.getKey();
if (customKey) {
if(!keyMode) {
customKey = GetNumericKey(customKey);
};
switch (customKey) {
case 'N':
//NULL = [78][85][76][76]
Keyboard.releaseAll();
SendCode(78);
SendCode(85);
SendCode(76);
SendCode(76);
Keyboard.releaseAll();
break;
case 'I':
//ЕстьNULL = [133][225][226][236][78][85][76][76]
Keyboard.releaseAll();
SendCode(133);
SendCode(225);
SendCode(226);
SendCode(236);
SendCode(78);
SendCode(85);
SendCode(76);
SendCode(76);
Keyboard.releaseAll();
break;
case '&':
//& = [38]
Keyboard.releaseAll();
SendCode(38);
Keyboard.releaseAll();
break;
case 'A':
// ' (одинарная кавычка)
Keyboard.releaseAll();
SendCode(39);
Keyboard.releaseAll();
break;
case '|':
// | (вертикальная черта / вертикальный слэш / "пайп")
Keyboard.releaseAll();
SendCode(124);
Keyboard.releaseAll();
break;
case 'B':
// <> (больше-меньше / не равно)
Keyboard.releaseAll();
SendCode(60);
SendCode(62);
Keyboard.releaseAll();
break;
case 'C':
// <= (меньше или равно)
Keyboard.releaseAll();
SendCode(60);
SendCode(61);
Keyboard.releaseAll();
break;
case 'D':
// >= (больше или равно)
Keyboard.releaseAll();
SendCode(62);
SendCode(61);
Keyboard.releaseAll();
break;
case '[':
// [ - открывающая квадратная скобка, обычно, для массивов
Keyboard.releaseAll();
SendCode(91);
Keyboard.releaseAll();
break;
case ']':
// ] - закрывающая квадратная скобка, обычно, для массивов
Keyboard.releaseAll();
SendCode(93);
Keyboard.releaseAll();
break;
case '{':
// [ - открывающая квадратная скобка, обычно, для массивов
Keyboard.releaseAll();
SendCode(123);
Keyboard.releaseAll();
break;
case '}':
// ] - закрывающая квадратная скобка, обычно, для массивов
Keyboard.releaseAll();
SendCode(125);
Keyboard.releaseAll();
break;
case '<':
// < (меньше)
Keyboard.releaseAll();
SendCode(60);
Keyboard.releaseAll();
break;
case '>':
// > (больше)
Keyboard.releaseAll();
SendCode(62);
Keyboard.releaseAll();
break;
case '#':
// # (решетка)
Keyboard.releaseAll();
SendCode(35);
Keyboard.releaseAll();
break;
case '@':
// @ (собака)
Keyboard.releaseAll();
SendCode(64);
Keyboard.releaseAll();
break;
case '"':
// " (двойная кавычка)
Keyboard.releaseAll();
SendCode(34);
Keyboard.releaseAll();
break;
case '$':
// $ (доллар)
Keyboard.releaseAll();
SendCode(36);
Keyboard.releaseAll();
break;
case '/':
SendNumericKey(KEYPAD_DIV);
break;
case 'x':
SendNumericKey(KEYPAD_MLT);
break;
case '-':
SendNumericKey(KEYPAD_MNS);
break;
case '+':
SendNumericKey(KEYPAD_PLS);
break;
case '.':
SendNumericKey(KEYPAD_DOT);
break;
case '0':
SendNumericKey(KEYPAD_0);
break;
case '1':
SendNumericKey(KEYPAD_1);
break;
case '2':
SendNumericKey(KEYPAD_2);
break;
case '3':
SendNumericKey(KEYPAD_3);
break;
case '4':
SendNumericKey(KEYPAD_4);
break;
case '5':
SendNumericKey(KEYPAD_5);
break;
case '6':
SendNumericKey(KEYPAD_6);
break;
case '7':
SendNumericKey(KEYPAD_7);
break;
case '8':
SendNumericKey(KEYPAD_8);
break;
case '9':
SendNumericKey(KEYPAD_9);
break;
case 'R':
SendNumericKey(KEYPAD_ENT);
break;
case 'L':
// NUM LOCK
keyMode = !keyMode;
//Keyboard.getLedStatus();
//if(!Keyboard.GetNumLockState()) Keyboard.press(219);
Keyboard.releaseAll();
digitalWrite(A3, keyMode?HIGH:LOW);
break;
}
}
}