Advertisement
zdenekpetrzd

74HC165 + PT to keyboard

Dec 16th, 2017
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.72 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. /* Pokud je posuvných registrů více než 2, změň proměnnou na "unsigned long". Jinak "int". */
  14. #define BYTES_VAL_T unsigned long long
  15.  
  16. /* Celkový pošer tlačítek připojených k Arduino */
  17. #define CELKEM_VSTUPU 48
  18.  
  19. //══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════//
  20. int ploadPin        = 8;  // Připojení k Parallel load pinu posuvného registru (1)
  21. int clockEnablePin  = 9;  // Připojení k Clock Enable pinu posuvného registru (15)
  22. int dataPin         = 11; // Připojení k Q7 pinu posuvného registru (9)
  23. int clockPin        = 12; // Připojení k Clock pinu posuvného registru (2)
  24.  
  25. int klavesaJeStisknuta;
  26. int pozmeneno[POCET_VSTUPU]= {};
  27. int tlacitkoOLD[POCET_VSTUPU] = {};
  28. int tlacitko[POCET_VSTUPU] = {};
  29.  
  30. 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,
  31.                         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
  32.  
  33. /* Knifovny a proměnné potřebné pro knihovnu zpoždění */
  34. #include <Arduino.h>                //Přibal knihovnu Arduina
  35. #include "avdweb_VirtualDelay.h"    //github.com/avandalen/VirtualDelay
  36. VirtualDelay singleDelay;           //Deklarace proměnné potřebné pro délku stisknutí tlačítka
  37. VirtualDelay twoDelay;
  38.  
  39. /* Proměnné pro otočný přepínač Poměrného tahu */
  40. char klavesaPT[] = {"_abcdefghijkl"};
  41. int pomernyTahVstupy[4];
  42. int aktualniStavPT;
  43. int staryStavPT = 1;
  44. int zapisovatelnyStavPT;
  45. int staryZapisovatelnyStavPT;
  46.  
  47. //#include <Keyboard.h>
  48. char klavesa[]    = {"qwertyuiopasdfghjklzxcvbnm"};                  
  49. 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,
  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. 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,
  52.                      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
  53.                  
  54. BYTES_VAL_T pinValues;
  55. BYTES_VAL_T oldPinValues;
  56.  
  57. //══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════//
  58. /* Funkce pro přečtení stavů výstupů na shift regitrech a jejich zápis do integreru. */
  59. BYTES_VAL_T read_shift_regs() {
  60.     unsigned long long bitVal;   //Deklarace proměnné "bitVal" typu "long"
  61.     BYTES_VAL_T bytesVal = 0;    //Deklarace proměnné "bytesVal" typu "BYTES_VAL_T" o hodnotě "0"
  62.  
  63.     /* Trigger a parallel Load to latch the state of the data lines, */
  64.     digitalWrite(clockEnablePin, HIGH);
  65.     digitalWrite(ploadPin, LOW);
  66.     delayMicroseconds(DELKA_PULSU_USEC);
  67.     digitalWrite(ploadPin, HIGH);
  68.     digitalWrite(clockEnablePin, LOW);
  69.  
  70.     /* Cyklus pro přečtení jednotlivých hodnot z shift registru.*/
  71.     for(int i = 0; i < POCET_VSTUPU; i++){
  72.         bitVal = digitalRead(dataPin);                   //Hodnota každého bitu = napětí na data pinu
  73.         bytesVal |= (bitVal << ((POCET_VSTUPU-1) - i));  //Přiřaď správný bit a zapiš do bytesVal
  74.  
  75.         digitalWrite(clockPin, HIGH);                    //Pošli inpuls shift registru
  76.         delayMicroseconds(DELKA_PULSU_USEC);             //Čekej pár microsekund
  77.         digitalWrite(clockPin, LOW);                     //Ukonči inpuls
  78.     }
  79.     return(bytesVal);
  80. }
  81. //══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════//                                
  82. void display_pin_values() {                  //Funkce pro zapsání hodnot z shiftregistru do proměnných
  83.     for(int i = 0; i < POCET_VSTUPU; i++)   //Zapisuj dokud nedojdeš k poslednímu
  84.     {
  85.       tlacitko[i] = bitRead(pinValues,i);   //Do proměnné "tlacitko" zapiš hodnotu bitu s indexem "j"
  86.       Serial.print(tlacitko[i]);            //Vypiš po Serial stav
  87.     }
  88.     Serial.print("\r\n");
  89. }
  90. //══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════//
  91. void kontrolaZmen() {
  92.     pinValues = read_shift_regs();                              //Hodnoty pinů jsou výstup z funkce read_shift_regs
  93.   if(pinValues != oldPinValues) {
  94.     display_pin_values();       //Pokud došlo na nějakém tlačítku ke změně, zobraz hodnoty
  95.  
  96.     for(int i=4; i<CELKEM_VSTUPU; i++){                        
  97.       if(tlacitko[i] >> tlacitkoOLD[i]){ pozmeneno[i] = 1; }   //Pokud je tlačítko nově stisknuto, do pole prozměněno se zapíše 1
  98.       tlacitkoOLD[i] = tlacitko[i];                            //Nahrazení starých hodnot novými
  99.       }                                                        
  100.     oldPinValues = pinValues;                                  //Nahrazení starých hodnot novými
  101.    }                                                          
  102. }
  103. //══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════//
  104. void stiskKlaves() {
  105.   for(int j=4; j<CELKEM_VSTUPU; j++){
  106.     if(klavesaJeStisknuta == 0){                       //Pokud není stisknuta žádná klávesa
  107.       if(pozmeneno[j] == 1){                           //a pokud rovněž došlo ke změně na jednom z tlačítek
  108.        pozmeneno[j] = 0;                               //Je jisté že funkce proběhne, takže zakážeme její opakování
  109.        Serial.print("Stisknuta klavesa ");             //Vypiš po Serial že je stisknuta klávesa
  110.        Serial.println(j);                              //A k ní napiš její číslo
  111. //       Keyboard.press(klavesa[j]);
  112. //       if     (Ctrl[j] == 1 && Shift[j] == 0) {Keyboard.press(KEY_LEFT_CTRL);  }
  113. //       else if(Ctrl[j] == 0 && Shift[j] == 1) {Keyboard.press(KEY_LEFT_SHIFT); }
  114. //       else if(Ctrl[j] == 1 && Shift[j] == 1) {Keyboard.press(KEY_LEFT_CTRL);
  115. //                                               Keyboard.press(KEY_LEFT_SHIFT); }
  116.        klavesaJeStisknuta = 1;                         //Klávesa byla stisknuta, takže zamezíme zároveň stisku další klávesy
  117.        singleDelay.start(1000);                        //Započni stisk s délkou "x" milisekund
  118.       } } }
  119.   if(singleDelay.elapsed()){                           //Pokud už prodleva mezi stiskem a uvolněním proběhla
  120.    if(klavesaJeStisknuta == 1){                        //A je stisknutá nějaká klávesa
  121.     Serial.println("Pusteno");                         //Napiš na Serial, že došlo k jejímu uvolnění
  122. //    Keyboard.releaseAll();
  123.     klavesaJeStisknuta =0;                             //Je možno stisknout další klávesu
  124.   } }
  125. }
  126. //══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════//
  127. void pomernyTah() {                                                                     //Funkce pro čtení ovladače poměrného tahu
  128.   for(int i=0; i<4; i++){ pomernyTahVstupy[i] = tlacitko[i]; }                          //PomernyTahVstupy je roven stavu napětí na pinu
  129.   for(int i=0; i<4; i++){ bitWrite(aktualniStavPT, i, pomernyTahVstupy[i]); }           //Jednotlivé bity jsou rovny poli hodnot PomernyTahVstupy
  130.   if(aktualniStavPT != staryStavPT){twoDelay.start(150);}                               //Pokud došlo ke změně napětí, začni počítat zpoždění
  131.   if(aktualniStavPT != staryStavPT && twoDelay.elapsed()){                              //Pokud došlo ke změně napětí a zároveň skončila doba zpoždění
  132.     staryStavPT = aktualniStavPT;                                                       //Nahraď starý stav novým
  133.     zapisovatelnyStavPT = aktualniStavPT; }                                             //ZapisovatelnyStavPT je roven aktuálnímu
  134.   for(int i=1; i<13; i++) {                                                             //Počítej od 1 do 13
  135.     if(zapisovatelnyStavPT == i && staryZapisovatelnyStavPT != zapisovatelnyStavPT && klavesaJeStisknuta == 0) {
  136.       Serial.print("Stisknuta klavesa PT ");                                            //Stiskni klávesu
  137.       Serial.println(klavesaPT[i]);
  138.       klavesaJeStisknuta=1;
  139.       singleDelay.start(1000);
  140.       staryZapisovatelnyStavPT = zapisovatelnyStavPT;                                   //Nahrazení StaréhoZapisovatelnéhoStavu novým
  141.    } }
  142.   if(singleDelay.elapsed()){                           //Pokud už prodleva mezi stiskem a uvolněním proběhla
  143.    if(klavesaJeStisknuta == 1){                        //A je stisknutá nějaká klávesa
  144.     Serial.println("Pusteno");                         //Napiš na Serial, že došlo k jejímu uvolnění
  145. //    Keyboard.releaseAll();
  146.     klavesaJeStisknuta =0;                             //Je možno stisknout další klávesu
  147.    } }
  148. }
  149. //══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════//
  150. void setup() {
  151. //    Keyboard.begin();
  152.     Serial.begin(1000000);                 //Začni sériovou komunikaci ve zvolené rychlosti
  153.  
  154.     pinMode(ploadPin, OUTPUT);             //Nahrávací (shiftregister 1 na 8 pin Arduina)
  155.     pinMode(clockEnablePin, OUTPUT);       //Sepnutí časovače (shiftregister 15 na 9 pin Arduina)
  156.     pinMode(clockPin, OUTPUT);             //Časovač (shiftregister 2 to na 12 pin Arduina)
  157.     pinMode(dataPin, INPUT);               //Data z 74HC165 (shiftregister 9 to 11 pin Arduina)
  158.    
  159.     digitalWrite(clockPin, LOW);           //Ujisti se, že clock pin je LOW
  160.     digitalWrite(ploadPin, HIGH);          //Nastav nahrávací pin na HIGH
  161.    
  162.     pinValues = read_shift_regs();         //Hodnoty pinů = výstup z shiftregistru
  163.     display_pin_values();                  //Funkce zobrazení hodnot shiftregistru
  164.     oldPinValues = pinValues;              //Nahrazení starých hodnot novými
  165.     for(int i=4; i<CELKEM_VSTUPU; i++){
  166.       if(tlacitko[i] >> ZakladniVstupy[i]){ pozmeneno[i] = 1; }
  167.       tlacitkoOLD[i] = tlacitko[i];
  168.     }
  169.     stiskKlaves();
  170. }
  171. //══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════//
  172. void loop() {                                                  
  173.   kontrolaZmen();
  174.   pomernyTah();                          
  175.   stiskKlaves();                           //Vyzkoušej možnost provést funkci stiskKlaves
  176.   delay(PRODLEVA_CTENI);                   //Doporeučená prodleva
  177. }                                                            
  178. //══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════//
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement