Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Kolik posuvných registrů je spojeno? */
- #define POCET_SHIFT_REGISTRU 6
- // _______
- /* Kolik vstupů má každý shift registr? */ // Paralel load -> | |_| | <- VCC
- #define POCET_VSTUPU POCET_SHIFT_REGISTRU * 8 // Clock -> | 7 | <- Clock enable
- // switch 4 -> | 4 | <- switch 5
- /* Kolik microsekund má trvat puls pro zachycení stavů tlačítek? */ // switch 3 -> | HC | <- switch 6
- #define DELKA_PULSU_USEC 5 // switch 2 -> | 6 | <- switch 7
- // switch 1 -> | 5 | <- switch 8
- /* Doporučená prodleva mezi čtením posuvných registrů.*/ // Nothing -> | 1 | <- From next
- #define PRODLEVA_CTENI 1 // GROUND -> |_______| <- Q7
- /* Celkový pošer tlačítek připojených k Arduino */
- #define CELKEM_VSTUPU 48
- //══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════//
- int ploadPin = 8; // Připojení k Parallel load pinu posuvného registru (1)
- int clockEnablePin = 9; // Připojení k Clock Enable pinu posuvného registru (15)
- int dataPin = 11; // Připojení k Q7 pinu posuvného registru (9)
- int clockPin = 12; // Připojení k Clock pinu posuvného registru (2)
- int klavesaJeStisknuta;
- int pozmeneno[POCET_VSTUPU]= {};
- int tlacitkoOLD[POCET_VSTUPU] = {};
- int tlacitko[POCET_VSTUPU] = {};
- int ZakladniVstupy[] = {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
- /* Knifovny a proměnné potřebné pro knihovnu zpoždění */
- #include <Arduino.h> //Přibal knihovnu Arduina
- #include "avdweb_VirtualDelay.h" //github.com/avandalen/VirtualDelay
- VirtualDelay singleDelay; //Deklarace proměnné potřebné pro délku stisknutí tlačítka
- VirtualDelay twoDelay;
- /* Proměnné pro otočný přepínač Poměrného tahu */
- char klavesaPT[] = {"_abcdefghijkl"};
- int pomernyTahVstupy[4];
- int aktualniStavPT;
- int staryStavPT = 1;
- int zapisovatelnyStavPT;
- int staryZapisovatelnyStavPT;
- //#include <Keyboard.h>
- char klavesa[] = {"qwertyuiopasdfghjklzxcvbnm"};
- int Ctrl[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
- int Shift[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
- //══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════//
- void cteniPosuvnychRegistru() {
- int bitVal; //Deklarace proměnné určující stav vstupu
- digitalWrite(clockEnablePin, HIGH); //
- digitalWrite(ploadPin, LOW); //
- delayMicroseconds(DELKA_PULSU_USEC); //
- digitalWrite(ploadPin, HIGH); //
- digitalWrite(clockEnablePin, LOW); //
- for(int i=0; i<POCET_VSTUPU; i++){ //Cyklus čtení stavu tlačítka a jeho převodu do pole "Tlačítko"
- bitVal = digitalRead(dataPin); //BitValue je rovno stavu dataPinu
- tlacitko[i] = bitVal; //Bit v polu je roven tomuto stavu
- digitalWrite(clockPin, HIGH); //
- delayMicroseconds(DELKA_PULSU_USEC); //
- digitalWrite(clockPin, LOW); //
- }
- }
- //══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════//
- void kontrolaZmen() {
- boolean dosloKeZmene = false; //Deklarace proměnné došlo ke změně
- cteniPosuvnychRegistru(); //Spusť funkci ČteníPosuvnýchRegistrů
- for(int i=0; i<POCET_VSTUPU; i++) { //Zkoušej všechna tlačítka
- if(tlacitko[i] != tlacitkoOLD[i]){ dosloKeZmene = true; } //Pokud se nějteré z tlačítek nerovná jeho starému stavu, došloKeZmeně =1
- } //
- if(dosloKeZmene == true){ //Pokud došlo na některém z tlačítek ke změně
- for(int i=0; i<POCET_VSTUPU; i++) { Serial.print(tlacitko[i]); } //Vytiskni stav všech tlačítek připojených k arduinu
- Serial.print("\r\n"); //Vytiskni na Serial nový řádek
- dosloKeZmene = false; //Vracení promenné DošloKeZmeně do základního stavu
- } //
- for(int i=0; i<POCET_VSTUPU; i++){ //
- if(tlacitko[i] >> tlacitkoOLD[i]){ pozmeneno[i] = 1; } //Pokud je tlačítko nově stisknuto, do pole prozměněno se zapíše 1
- tlacitkoOLD[i] = tlacitko[i]; //Nahrazení starých hodnot novými
- }
- }
- //══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════//
- void stiskKlaves() {
- for(int j=4; j<CELKEM_VSTUPU; j++){
- if(klavesaJeStisknuta == 0){ //Pokud není stisknuta žádná klávesa
- if(pozmeneno[j] == 1){ //a pokud rovněž došlo ke změně na jednom z tlačítek
- pozmeneno[j] = 0; //Je jisté že funkce proběhne, takže zakážeme její opakování
- Serial.print("Stisknuta klavesa "); //Vypiš po Serial že je stisknuta klávesa
- Serial.println(j); //A k ní napiš její číslo
- // Keyboard.press(klavesa[j]);
- // if (Ctrl[j] == 1 && Shift[j] == 0) {Keyboard.press(KEY_LEFT_CTRL); }
- // else if(Ctrl[j] == 0 && Shift[j] == 1) {Keyboard.press(KEY_LEFT_SHIFT); }
- // else if(Ctrl[j] == 1 && Shift[j] == 1) {Keyboard.press(KEY_LEFT_CTRL);
- // Keyboard.press(KEY_LEFT_SHIFT); }
- klavesaJeStisknuta = 1; //Klávesa byla stisknuta, takže zamezíme zároveň stisku další klávesy
- singleDelay.start(1000); //Započni stisk s délkou "x" milisekund
- } } }
- if(singleDelay.elapsed()){ //Pokud už prodleva mezi stiskem a uvolněním proběhla
- if(klavesaJeStisknuta == 1){ //A je stisknutá nějaká klávesa
- Serial.println("Pusteno"); //Napiš na Serial, že došlo k jejímu uvolnění
- // Keyboard.releaseAll(); tlacitkoOLD[i] = tlacitko[i];
- klavesaJeStisknuta =0; //Je možno stisknout další klávesu
- } }
- }
- //══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════//
- void pomernyTah() { //Funkce pro čtení ovladače poměrného tahu
- for(int i=0; i<4; i++){ pomernyTahVstupy[i] = tlacitko[i]; } //PomernyTahVstupy je roven stavu napětí na pinu
- for(int i=0; i<4; i++){ bitWrite(aktualniStavPT, i, pomernyTahVstupy[i]); } //Jednotlivé bity jsou rovny poli hodnot PomernyTahVstupy
- if(aktualniStavPT != staryStavPT){twoDelay.start(120);} //Pokud došlo ke změně napětí, začni počítat zpoždění
- if(aktualniStavPT != staryStavPT && twoDelay.elapsed()){ //Pokud došlo ke změně napětí a zároveň skončila doba zpoždění
- staryStavPT = aktualniStavPT; //Nahraď starý stav novým
- zapisovatelnyStavPT = aktualniStavPT; } //ZapisovatelnyStavPT je roven aktuálnímu
- for(int i=1; i<13; i++) { //Počítej od 1 do 13
- if(zapisovatelnyStavPT == i && staryZapisovatelnyStavPT != zapisovatelnyStavPT && klavesaJeStisknuta == 0) {
- Serial.print("Stisknuta klavesa PT "); //Stiskni klávesu
- Serial.println(klavesaPT[i]);
- klavesaJeStisknuta=1;
- singleDelay.start(1000);
- staryZapisovatelnyStavPT = zapisovatelnyStavPT; //Nahrazení StaréhoZapisovatelnéhoStavu novým
- } }
- if(singleDelay.elapsed()){ //Pokud už prodleva mezi stiskem a uvolněním proběhla
- if(klavesaJeStisknuta == 1){ //A je stisknutá nějaká klávesa
- Serial.println("Pusteno"); //Napiš na Serial, že došlo k jejímu uvolnění
- // Keyboard.releaseAll();
- klavesaJeStisknuta =0; //Je možno stisknout další klávesu
- } }
- }
- //══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════//
- void setup() {
- // Keyboard.begin();
- Serial.begin(2000000); //Začni sériovou komunikaci ve zvolené rychlosti
- pinMode(ploadPin, OUTPUT); //Nahrávací (shiftregister 1 na 8 pin Arduina)
- pinMode(clockEnablePin, OUTPUT); //Sepnutí časovače (shiftregister 15 na 9 pin Arduina)
- pinMode(clockPin, OUTPUT); //Časovač (shiftregister 2 to na 12 pin Arduina)
- pinMode(dataPin, INPUT); //Data z 74HC165 (shiftregister 9 to 11 pin Arduina)
- digitalWrite(clockPin, LOW); //Ujisti se, že clock pin je LOW
- digitalWrite(ploadPin, HIGH); //Nastav nahrávací pin na HIGH
- for(int i=4; i<CELKEM_VSTUPU; i++){
- if(tlacitko[i] >> ZakladniVstupy[i]){ pozmeneno[i] = 1; }
- tlacitkoOLD[i] = tlacitko[i];
- }
- stiskKlaves();
- }
- //══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════//
- void loop() {
- kontrolaZmen(); //Zkontroluj, zda na nějakém tlačítku nedošlo ke změně
- pomernyTah(); //A co ovladač poměrného tahu?
- stiskKlaves(); //Vyzkoušej možnost provést funkci stiskKlaves
- delay(PRODLEVA_CTENI); //Doporeučená prodleva
- }
- //══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════//
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement