#include "Keyboard.h"
// led
#define LED_PIN A2
// liczby
#define MATRIX_SIZE 6
// stany
#define KEY_RELESED 0
#define KEY_PRESSED 1
// klawisze
#define KEY_NONE 'x'
#define KEY_ENTER 'e'
#define KEY_NUM 'n'
#define KEY_BACK 'B'
#define KEY_0 '0'
#define KEY_1 '1'
#define KEY_2 '2'
#define KEY_3 '3'
#define KEY_4 '4'
#define KEY_5 '5'
#define KEY_6 '6'
#define KEY_7 '7'
#define KEY_8 '8'
#define KEY_9 '9'
#define KEY_DOT '.'
#define KEY_PLUS '+'
#define KEY_MINUS '-'
#define KEY_MUL '*'
#define KEY_DIV '/'
// wyjscia - wiersze
#define OUT_LINE_1 15
#define OUT_LINE_2 14
#define OUT_LINE_6 8
#define OUT_LINE_A 7
#define OUT_LINE_B 6
#define OUT_LINE_C 5
const int OUTPUTS[] = {OUT_LINE_1, OUT_LINE_2, OUT_LINE_6, OUT_LINE_A, OUT_LINE_B, OUT_LINE_C};
// wejscia - kolumny
#define IN_LINE_3 16
#define IN_LINE_4 10
#define IN_LINE_5 9
#define IN_LINE_D 4
#define IN_LINE_E 3
#define IN_LINE_F 2
const int INPUTS[] = {IN_LINE_3, IN_LINE_4, IN_LINE_5, IN_LINE_D, IN_LINE_E, IN_LINE_F};
// macierze reprezentujące fizyczne symbole i stan zatrzasku
char symbols[MATRIX_SIZE * MATRIX_SIZE];
int states[MATRIX_SIZE * MATRIX_SIZE];
int index = 0;
// funkcja wewnatrz której definiujemy fizyczne połączenia klawiszy i ich symbole
void mapKeys(){
setSymbol(OUT_LINE_1, IN_LINE_3, KEY_9);
setSymbol(OUT_LINE_1, IN_LINE_4, KEY_3);
setSymbol(OUT_LINE_1, IN_LINE_5, KEY_MUL);
setSymbol(OUT_LINE_1, IN_LINE_D, KEY_6);
setSymbol(OUT_LINE_1, IN_LINE_E, KEY_DOT);
setSymbol(OUT_LINE_1, IN_LINE_F, KEY_MINUS);
setSymbol(OUT_LINE_2, IN_LINE_3, KEY_7);
setSymbol(OUT_LINE_2, IN_LINE_4, KEY_1);
setSymbol(OUT_LINE_2, IN_LINE_D, KEY_4);
setSymbol(OUT_LINE_6, IN_LINE_5, KEY_NUM);
setSymbol(OUT_LINE_A, IN_LINE_3, KEY_PLUS);
setSymbol(OUT_LINE_A, IN_LINE_4, KEY_ENTER);
setSymbol(OUT_LINE_B, IN_LINE_3, KEY_8);
setSymbol(OUT_LINE_B, IN_LINE_4, KEY_2);
setSymbol(OUT_LINE_B, IN_LINE_5, KEY_DIV);
setSymbol(OUT_LINE_B, IN_LINE_D, KEY_5);
setSymbol(OUT_LINE_B, IN_LINE_E, KEY_0);
setSymbol(OUT_LINE_C, IN_LINE_D, KEY_BACK);
}
// funckja w której wyzwalane są zdarzenia od kliknięć fizycznych przycisków
void onPress(int index){
//załącz diodę umieszczoną na przodzie klawiatury
digitalWrite(LED_PIN, HIGH);
// pobierz symbol spod konkretnego indeksu
switch(symbols[index]){
//wierz 1
case KEY_NUM:
Keyboard.write(KEY_ESC);
break;
case KEY_DIV:
Keyboard.write(KEY_PAGE_UP);
break;
case KEY_MUL:
Keyboard.write(KEY_PAGE_DOWN);
break;
case KEY_MINUS:
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.write(' ');
Keyboard.releaseAll();
break;
//wiersz 2
case KEY_7:
Keyboard.write(KEY_F10);
break;
case KEY_8:
Keyboard.write(KEY_F5);
break;
case KEY_9:
Keyboard.press(KEY_LEFT_SHIFT);
Keyboard.press(KEY_LEFT_ALT);
Keyboard.write('q');
Keyboard.releaseAll();
break;
case KEY_PLUS:
Keyboard.press(KEY_LEFT_SHIFT);
Keyboard.press(KEY_LEFT_ALT);
Keyboard.write('o');
Keyboard.releaseAll();
break;
//wiersz 3
case KEY_4:
Keyboard.write(KEY_F8);
break;
case KEY_5:
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.write(KEY_PAGE_UP);
Keyboard.releaseAll();
break;
case KEY_6:
Keyboard.press(KEY_LEFT_SHIFT);
Keyboard.write(KEY_PAGE_UP);
Keyboard.releaseAll();
break;
case KEY_BACK:
Keyboard.write(KEY_F9);
break;
//wiersz 4,5
case KEY_1:
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.write('q');
Keyboard.releaseAll();
break;
case KEY_2:
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.write(KEY_PAGE_DOWN);
Keyboard.releaseAll();
break;
case KEY_3:
Keyboard.press(KEY_LEFT_SHIFT);
Keyboard.write(KEY_PAGE_DOWN);
Keyboard.releaseAll();
break;
case KEY_0:
Keyboard.print(":)");
break;
case KEY_DOT:
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.write('u');
Keyboard.releaseAll();
break;
case KEY_ENTER:
Keyboard.write(KEY_ENTER);
break;
}
delay(200);
digitalWrite(LED_PIN, LOW);
}
// funckja wiążąca symbol z numerami (indeksami w tablicach)
// linii wejścia i wyjścia
void setSymbol(int lineOutput, int lineInput, char symbol){
// zmienne odpowiedajace indeksom w tablicy dla fizycznych linii
// wpisanych przez użytkownika.
int iRow, iColumn;
// odszukaj indeks wiersza czyli lini wyjsc w macierzy
for(iRow = 0; iRow < MATRIX_SIZE; ++iRow){
if(OUTPUTS[iRow] == lineOutput)
break;
}
// odszukaj indeks kolumny czyli lini wejsc w maciery
for(iColumn = 0; iColumn < MATRIX_SIZE; ++iColumn){
if(INPUTS[iColumn] == lineInput)
break;
}
// zapisz symbol w komorce macierzy 1-wymiarowej
// przy pomocy 2 współrzędnych
symbols[iRow * MATRIX_SIZE + iColumn] = symbol;
}
// wstępne ustawienia peryferiów i mapowanie przycisków
void setup() {
//LED
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
for(int i = 0; i < MATRIX_SIZE; ++i){
pinMode(OUTPUTS[i], OUTPUT);
digitalWrite(OUTPUTS[i], HIGH);
//WEJSCIA
pinMode(INPUTS[i], INPUT);
digitalWrite(INPUTS[i], HIGH);
}
// domyślnie nie ma żadnych połączeń w klawiaturze
for(int i = 0; i < MATRIX_SIZE * MATRIX_SIZE; ++i){
symbols[i] = KEY_NONE;
states[i] = KEY_RELESED;
}
// użyj połączeń zdefiniownaych przez użytkownika
mapKeys();
Keyboard.begin();
}
// główna pętla w której sprawdzane są kliknięcia
void loop() {
for(int iOutput = 0; iOutput < MATRIX_SIZE; ++iOutput){
// aktywuj sprawdzanie wiersza o indeksie iOutput
digitalWrite(OUTPUTS[iOutput], LOW);
for(int iInput = 0; iInput < MATRIX_SIZE; ++iInput){
// oblicz numer indeksu w macierzy wszystkich przycisków
index = iOutput * MATRIX_SIZE + iInput;
// jeżeli obecny stan jest LOW (przycisk wciśnięty)
if((digitalRead(INPUTS[iInput]) == LOW)){
if(states[index] == KEY_RELESED){
// to wywołaj kliknięcie
onPress(index);
}
// ustaw flagę żeby zadziałał zatrzask
states[index] = KEY_PRESSED;
} else if(states[index] == KEY_PRESSED)
// zresetuj zatrzask w momencie puszczenia przycisku
states[index] = KEY_RELESED;
}
// opuść linię aby przejść do następnej
digitalWrite(OUTPUTS[iOutput], HIGH);
}
}
Trwa ładowanie komentarzy...