Advertisement
zdenekpetrzd

Zápis na klávesnici

Dec 21st, 2017
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.52 KB | None | 0 0
  1. /* Kolik posuvných registrů je spojeno? */                            
  2. #define POCET_SHIFT_REGISTRU   6                                      
  3.                                                                        //                      ╔══╦╦══╗
  4. /* Kolik vstupů má každý shift registr? */                             //     Paralel load ->  ║   ╚╝    ║ <- VCC
  5. #define POCET_VSTUPU   POCET_SHIFT_REGISTRU * 8                        //            Clock ->  ║    7     ║ <- Clock enable
  6.                                                                        //         switch 4 ->  ║    4     ║ <- switch 5
  7. /* Kolik microsekund má trvat puls pro zachycení stavů tlačítek? */    //         switch 3 ->  ║    H     ║ <- switch 6
  8. #define DELKA_PULSU_USEC   5                                           //         switch 2 ->  ║    C     ║ <- switch 7
  9.                                                                        //         switch 1 ->  ║    1     ║ <- switch 8
  10. /* Doporučená prodleva mezi čtením posuvných registrů.*/               //          Nothing ->  ║    6     ║ <- From next
  11. #define PRODLEVA_CTENI   1                                             //           GROUND ->  ║    5     ║ <- Q7      
  12.                                                                        //                      ╚══════╝
  13. /* Celkový pošer tlačítek připojených k Arduino */
  14. #define CELKEM_VSTUPU 48
  15.  
  16. //═════════════════════════════════════════════════════════════════════════════════════════//
  17. int ploadPin        = 8;  // Připojení k Parallel load pinu posuvného registru (1)
  18. int clockEnablePin  = 9;  // Připojení k Clock Enable pinu posuvného registru (15)
  19. int dataPin         = 11; // Připojení k Q7 pinu posuvného registru (9)
  20. int clockPin        = 12; // Připojení k Clock pinu posuvného registru (2)
  21.  
  22. char posledniStisknutaKlavesa;
  23. int klavesaJeStisknuta;
  24. int pozmeneno[POCET_VSTUPU]= {};
  25. int tlacitkoOLD[POCET_VSTUPU] = {};
  26. int tlacitko[POCET_VSTUPU] = {};
  27.  
  28. 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  29.                         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
  30.  
  31. /* Knifovny a proměnné potřebné pro knihovnu zpoždění */
  32. #include <Arduino.h>                //Přibal knihovnu Arduina
  33. #include "avdweb_VirtualDelay.h"    //github.com/avandalen/VirtualDelay
  34. VirtualDelay singleDelay;           //Deklarace proměnné potřebné pro délku stisknutí tlačítka
  35. VirtualDelay twoDelay;
  36.  
  37. /* Proměnné pro otočný přepínač Poměrného tahu */
  38. char klavesaPT[] = {"_abcdefghijkl"};
  39. int pomernyTahVstupy[4];
  40. int aktualniStavPT;
  41. int staryStavPT = 1;
  42. int zapisovatelnyStavPT;
  43. int staryZapisovatelnyStavPT;
  44.  
  45. #include <Keyboard.h>
  46. char klavesa[]    = {"0123456789024abcdefghijklmnopqrstuwxyzabcdefghijklmnopqrstuwxyz"};                  
  47. int  Ctrl[]       = {0,1,1,1,1,1,1,1,1,1,1,1,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,
  48.                      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
  49. int  Shift[]      = {1,0,0,0,0,0,0,0,0,0,0,1,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,
  50.                      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
  51.                  
  52. //═════════════════════════════════════════════════════════════════════════════════════════//
  53. void cteniPosuvnychRegistru() {
  54.     int bitVal;                                   //Deklarace proměnné určující stav vstupu
  55.     digitalWrite(clockEnablePin, HIGH);           //
  56.     digitalWrite(ploadPin, LOW);                  //
  57.     delayMicroseconds(DELKA_PULSU_USEC);          //
  58.     digitalWrite(ploadPin, HIGH);                 //
  59.     digitalWrite(clockEnablePin, LOW);            //
  60.  
  61.     for(int i=0; i<POCET_VSTUPU; i++){            //Cyklus čtení stavu tlačítka a jeho převodu do pole "Tlačítko"    
  62.       bitVal = digitalRead(dataPin);              //BitValue je rovno stavu dataPinu
  63.       tlacitko[i] = bitVal;                       //Bit v polu je roven tomuto stavu
  64.       digitalWrite(clockPin, HIGH);               //
  65.       delayMicroseconds(DELKA_PULSU_USEC);        //
  66.       digitalWrite(clockPin, LOW);                //
  67.       }
  68. }
  69. //═════════════════════════════════════════════════════════════════════════════════════════//
  70. void kontrolaZmen() {
  71.   boolean dosloKeZmene = false;                                            //Deklarace proměnné došlo ke změně
  72.  
  73.   cteniPosuvnychRegistru();                                                //Spusť funkci ČteníPosuvnýchRegistrů
  74.   for(int i=0; i<POCET_VSTUPU; i++) {                                      //Zkoušej všechna tlačítka
  75.     if(tlacitko[i] != tlacitkoOLD[i]){ dosloKeZmene = true; }              //Pokud se nějteré z tlačítek nerovná jeho starému stavu, došloKeZmeně =1
  76.   }                                                                        //
  77.   if(dosloKeZmene == true){                                                //Pokud došlo na některém z tlačítek ke změně
  78.     for(int i=0; i<POCET_VSTUPU; i++) { Serial.print(tlacitko[i]); }       //Vytiskni stav všech tlačítek připojených k arduinu
  79.     Serial.print("\r\n");                                                  //Vytiskni na Serial nový řádek
  80.     dosloKeZmene = false;                                                  //Vracení promenné DošloKeZmeně do základního stavu
  81.   }                                                                        //
  82.                                                                            
  83.   for(int i=0; i<POCET_VSTUPU; i++){                                       //
  84.     if(tlacitko[i] >> tlacitkoOLD[i]){ pozmeneno[i] = 1; }                 //Pokud je tlačítko nově stisknuto, do pole prozměněno se zapíše 1
  85.     tlacitkoOLD[i] = tlacitko[i];                                          //Nahrazení starých hodnot novými
  86.     }                                                                                                                  
  87. }
  88. //═════════════════════════════════════════════════════════════════════════════════════════//
  89. void stiskKlaves() {
  90.   for(int j=4; j<CELKEM_VSTUPU; j++){
  91.     if(klavesaJeStisknuta == 0){                       //Pokud není stisknuta žádná klávesa
  92.       if(pozmeneno[j] == 1){                           //a pokud rovněž došlo ke změně na jednom z tlačítek
  93.        pozmeneno[j] = 0;                               //Je jisté že funkce proběhne, takže zakážeme její opakování
  94.        Serial.print("Stisknuta klavesa ");             //Vypiš po Serial že je stisknuta klávesa
  95.        Serial.print(j);
  96.        Serial.print(" - ");
  97.        Serial.println(klavesa[(j-4)]);      
  98.        if     (Ctrl[(j-4)] == 1 && Shift[(j-4)] == 0) {Keyboard.press(KEY_LEFT_CTRL);  }
  99.        else if(Ctrl[(j-4)] == 0 && Shift[(j-4)] == 1) {Keyboard.press(KEY_LEFT_SHIFT); }
  100.        else if(Ctrl[(j-4)] == 1 && Shift[(j-4)] == 1) {Keyboard.press(KEY_LEFT_CTRL);
  101.                                                        Keyboard.press(KEY_LEFT_SHIFT); }                      
  102.        Keyboard.press(klavesa[(j-4)]);
  103.  
  104.        klavesaJeStisknuta = 1;                         //Klávesa byla stisknuta, takže zamezíme zároveň stisku další klávesy
  105.        posledniStisknutaKlavesa = klavesa[(j-4)];
  106.        singleDelay.start(200);                         //Započni stisk s délkou "x" milisekund
  107.        tlacitkoOLD[j] = tlacitko[j];
  108.        delay(1);
  109.       } } }
  110.   if(singleDelay.elapsed()){                           //Pokud už prodleva mezi stiskem a uvolněním proběhla
  111.    if(klavesaJeStisknuta == 1){                        //A je stisknutá nějaká klávesa
  112.     Serial.println("Pusteno");                         //Napiš na Serial, že došlo k jejímu uvolnění
  113.     Keyboard.release(posledniStisknutaKlavesa);
  114.     Keyboard.releaseAll();  
  115.     klavesaJeStisknuta = 0;                             //Je možno stisknout další klávesu
  116.     delay(1);
  117.   } }
  118. }
  119. //═════════════════════════════════════════════════════════════════════════════════════════//
  120. void pomernyTah() {                                                                     //Funkce pro čtení ovladače poměrného tahu
  121.   for(int i=0; i<4; i++){ pomernyTahVstupy[i] = tlacitko[i]; }                          //PomernyTahVstupy je roven stavu napětí na pinu
  122.   for(int i=0; i<4; i++){ bitWrite(aktualniStavPT, i, pomernyTahVstupy[i]); }           //Jednotlivé bity jsou rovny poli hodnot PomernyTahVstupy
  123.   if(aktualniStavPT != staryStavPT){twoDelay.start(120);}                               //Pokud došlo ke změně napětí, začni počítat zpoždění
  124.   if(aktualniStavPT != staryStavPT && twoDelay.elapsed()){                              //Pokud došlo ke změně napětí a zároveň skončila doba zpoždění
  125.     staryStavPT = aktualniStavPT;                                                       //Nahraď starý stav novým
  126.     zapisovatelnyStavPT = aktualniStavPT; }                                             //ZapisovatelnyStavPT je roven aktuálnímu
  127.   for(int i=1; i<13; i++) {                                                             //Počítej od 1 do 13
  128.     if(zapisovatelnyStavPT == i && staryZapisovatelnyStavPT != zapisovatelnyStavPT && klavesaJeStisknuta == 0) {
  129.       Serial.print("Stisknuta klavesa PT ");                                            //Stiskni klávesu
  130.       Serial.println(klavesaPT[i]);
  131.       Keyboard.press(klavesaPT[i]);
  132.       posledniStisknutaKlavesa = klavesaPT[i];
  133.       klavesaJeStisknuta=1;
  134.       singleDelay.start(350);
  135.       staryZapisovatelnyStavPT = zapisovatelnyStavPT;                                   //Nahrazení StaréhoZapisovatelnéhoStavu novým
  136.    } }
  137.   if(singleDelay.elapsed()){                           //Pokud už prodleva mezi stiskem a uvolněním proběhla
  138.    if(klavesaJeStisknuta == 1){                        //A je stisknutá nějaká klávesa
  139.     Serial.println("Pusteno");                         //Napiš na Serial, že došlo k jejímu uvolnění
  140.     Keyboard.release(posledniStisknutaKlavesa);
  141.     Keyboard.releaseAll();
  142.     klavesaJeStisknuta =0;                             //Je možno stisknout další klávesu
  143.    } }
  144. }
  145. //═════════════════════════════════════════════════════════════════════════════════════════//
  146. void setup() {
  147.     Keyboard.begin();
  148.     Serial.begin(19200);                   //Začni sériovou komunikaci ve zvolené rychlosti
  149.  
  150.     pinMode(ploadPin, OUTPUT);             //Nahrávací (shiftregister 1 na 8 pin Arduina)
  151.     pinMode(clockEnablePin, OUTPUT);       //Sepnutí časovače (shiftregister 15 na 9 pin Arduina)
  152.     pinMode(clockPin, OUTPUT);             //Časovač (shiftregister 2 to na 12 pin Arduina)
  153.     pinMode(dataPin, INPUT);               //Data z 74HC165 (shiftregister 9 to 11 pin Arduina)
  154.    
  155.     digitalWrite(clockPin, LOW);           //Ujisti se, že clock pin je LOW
  156.     digitalWrite(ploadPin, HIGH);          //Nastav nahrávací pin na HIGH
  157.     delay(1000);
  158.     kontrolaZmen();
  159.     for(int i=4; i<CELKEM_VSTUPU; i++){
  160.       if(tlacitko[i] >> ZakladniVstupy[i]){ pozmeneno[i] = 1; }
  161.       tlacitkoOLD[i] = tlacitko[i];
  162.     }
  163.     delay(50);
  164.     pomernyTah();
  165.     delay(50);
  166.     stiskKlaves();
  167.     delay(50);
  168. }
  169. //═════════════════════════════════════════════════════════════════════════════════════════//
  170. void loop() {                                                  
  171.   kontrolaZmen();                          //Zkontroluj, zda na nějakém tlačítku nedošlo ke změně
  172.   pomernyTah();                            //A co ovladač poměrného tahu?
  173.   stiskKlaves();                           //Vyzkoušej možnost provést funkci stiskKlaves
  174.   delay(PRODLEVA_CTENI);                   //Doporučená prodleva
  175. }                                                            
  176. //═════════════════════════════════════════════════════════════════════════════════════════//
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement