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
- /* Pokud je posuvných registrů více než 2, změň proměnnou na "unsigned long". Jinak "int". */
- #define BYTES_VAL_T unsigned long long
- //════════════════════════════════════════════════════════════════════════════════════════//
- 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 pozmeneno[POCET_VSTUPU]= {};
- unsigned long long tlacitkoOLD[POCET_VSTUPU] = {};
- long tlacitko[POCET_VSTUPU] = {};
- //int vystupy[] = {22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,
- // 37,38,39,40,41,42,43,44,45};
- BYTES_VAL_T pinValues;
- BYTES_VAL_T oldPinValues;
- //════════════════════════════════════════════════════════════════════════════════════════//
- /* Funkce pro přečtení stavů výstupů na shift regitrech a jejich zápis do integreru. */
- BYTES_VAL_T read_shift_regs()
- {
- unsigned long long bitVal; //Deklarace proměnné "bitVal" typu "long"
- BYTES_VAL_T bytesVal = 0; //Deklarace proměnné "bytesVal" typu "BYTES_VAL_T" o hodnotě "0"
- /* Trigger a parallel Load to latch the state of the data lines, */
- digitalWrite(clockEnablePin, HIGH);
- digitalWrite(ploadPin, LOW);
- delayMicroseconds(DELKA_PULSU_USEC);
- digitalWrite(ploadPin, HIGH);
- digitalWrite(clockEnablePin, LOW);
- /* Cyklus pro přečtení jednotlivých hodnot z shift registru.*/
- for(int i = 0; i < POCET_VSTUPU; i++)
- {
- bitVal = digitalRead(dataPin); //Hodnota každého bitu = napětí na data pinu
- bytesVal |= (bitVal << ((POCET_VSTUPU-1) - i)); //Přiřaď správný bit dle počtu vstupů na shiftreg a zapiš do bytesVal
- digitalWrite(clockPin, HIGH); //Pošli inpuls shift registru
- delayMicroseconds(DELKA_PULSU_USEC); //Čekej pár microsekund
- digitalWrite(clockPin, LOW); //Ukonči inpuls
- }
- return(bytesVal);
- }
- //════════════════════════════════════════════════════════════════════════════════════════//
- void display_pin_values() //Funkce pro zapsání hodnot z shiftregistru do proměnných
- {
- for(int j = 0; j < POCET_VSTUPU; j++) //Zapisuj dokud nedojdeš k poslednímu
- {
- tlacitko[j] = bitRead(pinValues,j); //Do proměnné "tlacitko" zapiš hodnotu bitu s indexem "j"
- Serial.print(tlacitko[j]); //Vypiš po Serial stav
- }
- Serial.print("\r\n");
- }
- //════════════════════════════════════════════════════════════════════════════════════════//
- void setup()
- {
- Serial.begin(300); //Začni sériovou komunikaci ve zvolené rychlosti
- // for(int i = 0; i < POCET_VSTUPU; i++) //Cyklus i=promenna vystupu
- // { pinMode(vystupy[i],OUTPUT); } //Změna na výstup
- 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
- pinValues = read_shift_regs(); //Hodnoty pinů = výstup z shiftregistru
- display_pin_values(); //Funkce zobrazení hodnot shiftregistru
- oldPinValues = pinValues; //Nahrazení starých hodnot novými
- for(int j = 0; j < POCET_VSTUPU; j++) //Zapisuj dokud nedojdeš k poslednímu
- {
- tlacitko[j] = bitRead(pinValues,j); //Do proměnné "tlacitko" zapiš hodnotu bitu s indexem "j"
- tlacitkoOLD[j] = tlacitko[j];
- }
- }
- //════════════════════════════════════════════════════════════════════════════════════════//
- /*void ZapisNaLED()
- {
- for(int l = 0; l < POCET_VSTUPU; l++) //Zapiš výstupy na LED diody
- {
- if(tlacitko[l]==1) //Pokud byla do proměnné zapsána 1
- { digitalWrite(vystupy[l],HIGH); } //Zapiš HIGH
- else //Jinak
- { digitalWrite(vystupy[l],LOW); } //Zapiš LOW
- }
- }*/
- //════════════════════════════════════════════════════════════════════════════════════════//
- void loop()
- {
- /* Read the state of all zones.*/
- pinValues = read_shift_regs(); //Hodnoty pinů = výstup z shiftregistru
- /* If there was a chage in state, display which ones changed.*/
- if(pinValues != oldPinValues) //Pokud se staré hodnoty nerovnají novým:
- {
- display_pin_values(); //Spusť funkci zobraz hodnoty
- for(int m = 0; m < POCET_VSTUPU; m++){ //Cyklus pro kontrolu, zda se změnil stav tlačítek
- if(tlacitko[m] >> tlacitkoOLD[m]){ //Pokud se stav některého z tlačítek změnil na HIGH:
- Serial.print("Zjištěna změna na tlačítku:"); //Vypiš "Zjištěna změna"
- Serial.print(m); //Napiš na kterém z nich
- Serial.print("\r\n"); //Začni nový řádek
- pozmeneno[m] = 1; //Změněné tlačítko = m
- }
- tlacitkoOLD[m] = tlacitko[m]; //Staré tlačítko = nové
- }
- oldPinValues = pinValues; //nahrazení starých hodnot novými
- }
- // ZapisNaLED(); //Spusť funkci Zapiš na LED
- delay(PRODLEVA_CTENI); //Před opakováním počkej pár microsekund
- }
- //════════════════════════════════════════════════════════════════════════════════════════//
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement