Advertisement
zdenekpetrzd

74HC165 v poli + PT to keyboard

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