zdenekpetrzd

74HC165 to Keyboard

Dec 12th, 2017
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.40 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. unsigned long long tlacitkoOLD[POCET_VSTUPU] = {};
  28. long tlacitko[POCET_VSTUPU] = {};
  29. //int vystupy[] = {22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,
  30. //                 37,38,39,40,41,42,43,44,45};
  31.  
  32. int ZakladniVstupy[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  33.                         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
  34.                        
  35. #include <Arduino.h>                //Přibal knihovnu Arduina
  36. #include "avdweb_VirtualDelay.h"    //github.com/avandalen/VirtualDelay
  37. VirtualDelay singleDelay;           //Deklarace proměnné potřebné pro délku stisknutí tlačítka
  38.  
  39. //#include <Keyboard.h>
  40. char klavesa[]    = {"qwertyuiopasdfghjklzxcvbnm"};                  
  41. 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,
  42.                      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
  43. 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,
  44.                      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
  45.                  
  46. BYTES_VAL_T pinValues;
  47. BYTES_VAL_T oldPinValues;
  48.  
  49. //════════════════════════════════════════════════════════════════════════════════════════//
  50. /* Funkce pro přečtení stavů výstupů na shift regitrech a jejich zápis do integreru. */
  51. BYTES_VAL_T read_shift_regs()
  52. {
  53.     unsigned long long bitVal;   //Deklarace proměnné "bitVal" typu "long"
  54.     BYTES_VAL_T bytesVal = 0;    //Deklarace proměnné "bytesVal" typu "BYTES_VAL_T" o hodnotě "0"
  55.  
  56.     /* Trigger a parallel Load to latch the state of the data lines, */
  57.     digitalWrite(clockEnablePin, HIGH);
  58.     digitalWrite(ploadPin, LOW);
  59.     delayMicroseconds(DELKA_PULSU_USEC);
  60.     digitalWrite(ploadPin, HIGH);
  61.     digitalWrite(clockEnablePin, LOW);
  62.  
  63.     /* Cyklus pro přečtení jednotlivých hodnot z shift registru.*/
  64.     for(int i = 0; i < POCET_VSTUPU; i++){
  65.         bitVal = digitalRead(dataPin);                   //Hodnota každého bitu = napětí na data pinu
  66.         bytesVal |= (bitVal << ((POCET_VSTUPU-1) - i));  //Přiřaď správný bit a zapiš do bytesVal
  67.  
  68.         digitalWrite(clockPin, HIGH);                    //Pošli inpuls shift registru
  69.         delayMicroseconds(DELKA_PULSU_USEC);             //Čekej pár microsekund
  70.         digitalWrite(clockPin, LOW);                     //Ukonči inpuls
  71.     }
  72.     return(bytesVal);
  73. }
  74. //════════════════════════════════════════════════════════════════════════════════════════//                                
  75. void display_pin_values()                   //Funkce pro zapsání hodnot z shiftregistru do proměnných
  76. {
  77.     for(int i = 0; i < POCET_VSTUPU; i++)   //Zapisuj dokud nedojdeš k poslednímu
  78.     {
  79.       tlacitko[i] = bitRead(pinValues,i);   //Do proměnné "tlacitko" zapiš hodnotu bitu s indexem "j"
  80.       Serial.print(tlacitko[i]);            //Vypiš po Serial stav
  81.     }
  82.     Serial.print("\r\n");
  83. }
  84. //════════════════════════════════════════════════════════════════════════════════════════//
  85. void stiskKlaves(){
  86.   for(int j=0; j<CELKEM_VSTUPU; j++){
  87.     if(klavesaJeStisknuta == 0){                       //Pokud není stisknuta žádná klávesa
  88.       if(pozmeneno[j] == 1){                           //a pokud rovněž došlo ke změně na jednom z tlačítek
  89.        pozmeneno[j] = 0;                               //Je jisté že funkce proběhne, takže zakážeme její opakování
  90.        Serial.print("Stisknuta klavesa ");             //Vypiš po Serial že je stisknuta klávesa
  91.        Serial.println(j);                              //A k ní napiš její číslo
  92. //       Keyboard.press(klavesa[j]);
  93. //       if     (Ctrl[j] == 1 && Shift[j] == 0) {Keyboard.press(KEY_LEFT_CTRL);  }
  94. //       else if(Ctrl[j] == 0 && Shift[j] == 1) {Keyboard.press(KEY_LEFT_SHIFT); }
  95. //       else if(Ctrl[j] == 1 && Shift[j] == 1) {Keyboard.press(KEY_LEFT_CTRL);
  96. //                                               Keyboard.press(KEY_LEFT_SHIFT); }
  97.        klavesaJeStisknuta = 1;                         //Klávesa byla stisknuta, takže zamezíme zároveň stisku další klávesy
  98.        singleDelay.start(1000);                        //Započni stisk s délkou "x" milisekund
  99.       } } }
  100.   if(singleDelay.elapsed()){                           //Pokud už prodleva mezi stiskem a uvolněním proběhla
  101.    if(klavesaJeStisknuta == 1){                        //A je stisknutá nějaká klávesa
  102.     Serial.println("Pusteno");                         //Napiš na Serial, že došlo k jejímu uvolnění
  103. //    Keyboard.releaseAll();
  104.     klavesaJeStisknuta =0;                             //Je možno stisknout další klávesu
  105.   } }
  106. }
  107. //════════════════════════════════════════════════════════════════════════════════════════//
  108. void setup()
  109. {
  110. //    Keyboard.begin();
  111.     Serial.begin(19200);                   //Začni sériovou komunikaci ve zvolené rychlosti
  112.  
  113.     pinMode(ploadPin, OUTPUT);             //Nahrávací (shiftregister 1 na 8 pin Arduina)
  114.     pinMode(clockEnablePin, OUTPUT);       //Sepnutí časovače (shiftregister 15 na 9 pin Arduina)
  115.     pinMode(clockPin, OUTPUT);             //Časovač (shiftregister 2 to na 12 pin Arduina)
  116.     pinMode(dataPin, INPUT);               //Data z 74HC165 (shiftregister 9 to 11 pin Arduina)
  117.    
  118.     digitalWrite(clockPin, LOW);           //Ujisti se, že clock pin je LOW
  119.     digitalWrite(ploadPin, HIGH);          //Nastav nahrávací pin na HIGH
  120.    
  121.     pinValues = read_shift_regs();         //Hodnoty pinů = výstup z shiftregistru
  122.     display_pin_values();                  //Funkce zobrazení hodnot shiftregistru
  123.     oldPinValues = pinValues;              //Nahrazení starých hodnot novými
  124. }
  125. //════════════════════════════════════════════════════════════════════════════════════════//
  126. void loop(){                                                  
  127.   pinValues = read_shift_regs();                              //Hodnoty pinů jsou výstup z funkce read_shift_regs
  128.   if(pinValues != oldPinValues) { display_pin_values();       //Pokud došlo na nějakém tlačítku ke změně, zobraz hodnoty
  129.    for(int i=0; i<CELKEM_VSTUPU; i++){                        
  130.      if(tlacitko[i] >> tlacitkoOLD[i]){ pozmeneno[i] = 1; }   //Pokud je tlačítko nově stisknuto, do pole prozměněno se zapíše 1
  131.      tlacitkoOLD[i] = tlacitko[i];                            //Nahrazení starých hodnot novými
  132.      }                                                        
  133.    oldPinValues = pinValues;                                  //Nahrazení starých hodnot novými
  134.    }                                                          
  135.   stiskKlaves();                                              //Vyzkoušej možnost provést funkci stiskKlaves
  136.   delay(PRODLEVA_CTENI);                                      //Dopoeučená prodleva
  137. }                                                            
  138. //════════════════════════════════════════════════════════════════════════════════════════//
Advertisement
Add Comment
Please, Sign In to add comment