Pasta: 9aadf5f526f52e912ff9ab286a4f5990172be7f5 (2018-02-10)

Język: C/C++
Adres: p43.pl/p,9aadf5f526f52e912ff9ab286a4f5990172be7f5
Ilość linii: 279
Rozmiar: 10.18 kB
Wyświetleń: 284
Ostatnio użyto: 2019-04-19 07:00:00
#include <avr/io.h> //dołącznie głownej biblioteki avr #include <util/delay.h> // dołączenie biblioteki opóźnień #include <stdlib.h> #include <string.h> #include <stdio.h> #include "HD44780.h" //dołączenie biblioteki obsługi LCD #define LCD_LED (1 << PA4) // Podświetlenie LCD pod pinem PA4 #define P1 (1 << PA0) // Przekaźnik P1 podłączony do pinu PA0 #define P2 (1 << PA1) // Przekaźnik P2 podłączony do pinu PA1 #define P3 (1 << PA2) // Przekaźnik P3 podłączony do pinu PA2 #define P4 (1 << PA3) // Przekaźnik P4 podłączony do pinu PA3 #define LED1 (1 << PC4) // LED1 podłączony do pinu PC4 #define LED2 (1 << PC5) // LED2 podłączony do pinu PC5 #define LED3 (1 << PC6) // LED3 podłączony do pinu PC6 #define LED4 (1 << PC7) // LED4 podłączony do pinu PC7 #define SW1 (1 << PC0) // Przycisk SW1 podłączony do pinu PC0 #define SW2 (1 << PC1) // Przycisk SW2 podłączony do pinu PC1 #define SW3 (1 << PC2) // Przycisk SW3 podłączony do pinu PC2 #define SW4 (1 << PC3) // Przycisk SW4 podłączony do pinu PC3 #define BUZZER (1 << PA5) // Buzzer podłączonydo pinu PA5 uint8_t klawisz() { uint8_t w, k; // zmienne do obsługi wierszy i kolumn klawiatury PORTD |= 0X0F; // stan wysoki na wiersze for (k = 0; k < 3; k++) { // zmiana kolumny DDRD &= ~(0X7F); // piny od 0 do 6 jako wejście DDRD |= (0X10 << k); // kolumna jako wejście przesunięta bitowo w lewo k bitów for (w = 0; w < 4; w++) { //zmiana wiersza if (!(PIND & (0X01 << w))) { // sprawdzanie stanu kalwisza z przesunięciem w lewo o w bitów PORTA &= ~BUZZER; // Włacz buzzer _delay_ms(100); // Czekaj 100ms PORTA |= BUZZER; // Wyłącz buzzer _delay_ms(300); // Czekaj 300ms - przyciśnięcie i puszczenie klawisza if ((w * 3 + k + 1) != 11) // jeżeli klawisz nie jest cyfrą zero return (w * 3 + k + 1); // zwróć wartość klawisza else return 0; // zwróć wartość 0 } } } return 255; // jeżeli nie naciśnięty żaden klawisz zwróć wartość 255 } int main(void) { char c[2]; //zmienna do przechowywania tymczasowej wartości klawisza w postaci char int cmp; // zmienna do przechowywania wartości porównania int klaw = 12; //zmienna do przechowywania tymczasowej wartości klawisza w postaci int int i = 0; // licznik int LCD_UPDATE = 1; // zmienna do aktualizacji napisu na LCD char kod[] = " "; // zmienna do przechowywania kodu int dalej = 1; // zmienna pomocnicza DDRA |= LCD_LED; // LCD_LED jako wyjście PORTA |= LCD_LED; // Włącznie podświetlnia DDRA |= P1; // P1 jako wyjście DDRA |= P2; // P2 jako wyjście DDRA |= P3; // P3 jako wyjście DDRA |= P4; // P4 jako wyjście DDRC |= LED1; // LED1 jako wyjście DDRC |= LED2; // LED2 jako wyjście DDRC |= LED3; // LED3 jako wyjście DDRC |= LED4; // LED4 jako wyjście PORTC |= SW1; // Podciągnięcie klawisza SW1 do VCC PORTC |= SW2; // Podciągnięcie klawisza SW2 do VCC PORTC |= SW3; // Podciągnięcie klawisza SW3 do VCC PORTC |= SW4; // Podciągnięcie klawisza SW4 do VCC DDRA |= BUZZER; // Buzzer jako wyjście PORTA |= BUZZER; // Stan wysoki na buzzer - buzzer działa przy stanie niskim LCD_Initalize(); // Inicjalizacja LCD while (1) { if (LCD_UPDATE == 1) { // Jeżeli flaga LCD_UPDATE ma wartość 1 to aktualizuejmy LCD LCD_Clear(); // Wyczyść ekran LCD_WriteText("Wybierz zamek"); // Wyświetlanie tekstu LCD_UPDATE = 0; // Wyłączenie aktualizacji LCD } dalej = 1; if (!(PINC & SW1)) { // Jeżeli wciśnięty klawisz PORTA &= ~BUZZER; // Włącz buzzer _delay_ms(100); // Czekaj 100ms PORTA |= BUZZER; // Wyłącz buzzer LCD_Clear(); // Wyczyść LCD LCD_WriteText("Podaj kod:"); // Wyświetlanie tekstu PORTC |= LED1; // Włącz LED1 i = 0; kod[0] = ' '; // czyszczenie tablicy z kodem kod[1] = ' '; // czyszczenie tablicy z kodem kod[2] = ' '; // czyszczenie tablicy z kodem kod[3] = ' '; // czyszczenie tablicy z kodem while (dalej == 1) { // pobieranie znaków dopółki nie naciśniemy hasha klaw = klawisz(); // pobierz wartość z klawiatury itoa(klaw, c, 10); // zamiana wartości klawisza z int na char if ((klaw != 12) && (klaw != 255) && (i <= 3)) { // jeżeli wartośc klawisza nie jest hashem , 255 , pobrano mniej niż 4 cyfry kod[i] = c[0]; // przypisz wartość klawisza do kodu i++; // inkrementacja } if (klaw == 12) // jeżeli naciśnięto hash dalej = 0; // wyjdz z petli } cmp = strcmp(kod, "1231"); // porównaj odczytany kod z pinem zamka if (cmp == 0) { // jeżeli się zgadza LCD_Clear(); // czyść ekran LCD_WriteText("Otwarte"); // wyświetl tekst PORTA |= P1; // włącz przekaźnik PORTA &= ~BUZZER; // włącz buzzer _delay_ms(500); // czekaj 500ms - tyle działa buzzer PORTA |= BUZZER; // wyłącz buzzer _delay_ms(1500); // czekaj 1500ms PORTA &= ~P1; // wyłącz przekaźnik } if (cmp != 0) { // jeżeli zły kod LCD_Clear(); // czyść ekran LCD_WriteText("Zly kod "); // wyświetl tekst PORTA &= ~BUZZER; // włącz buzzer _delay_ms(500); // czekaj 500ms - tyle działa buzzer PORTA |= BUZZER; // wyłącz buzzer _delay_ms(1500); // czekaj 1500ms LCD_Clear(); // czyść ekran } PORTC &= ~LED1; // wyłącz LED1 LCD_UPDATE = 1; // Aktualizuj LCD } if (!(PINC & SW2)) { PORTA &= ~BUZZER; _delay_ms(100); PORTA |= BUZZER; LCD_Clear(); LCD_WriteText("Podaj kod:"); PORTC |= LED2; i = 0; kod[0] = ' '; kod[1] = ' '; kod[2] = ' '; kod[3] = ' '; while (dalej == 1) { klaw = klawisz(); itoa(klaw, c, 10); if ((klaw != 12) && (klaw != 255) && (i <= 3)) { kod[i] = c[0]; i++; } if (klaw == 12) dalej = 0; } cmp = strcmp(kod, "1232"); if (cmp == 0) { LCD_Clear(); LCD_WriteText("Otwarte"); PORTA |= P2; PORTA &= ~BUZZER; _delay_ms(500); PORTA |= BUZZER; _delay_ms(1500); PORTA &= ~P2; } if (cmp != 0) { LCD_Clear(); LCD_WriteText("Zly kod "); PORTA &= ~BUZZER; _delay_ms(500); PORTA |= BUZZER; _delay_ms(1500); LCD_Clear(); } PORTC &= ~LED2; LCD_UPDATE = 1; } if (!(PINC & SW3)) { PORTA &= ~BUZZER; _delay_ms(100); PORTA |= BUZZER; LCD_Clear(); LCD_WriteText("Podaj kod:"); PORTC |= LED3; i = 0; kod[0] = ' '; kod[1] = ' '; kod[2] = ' '; kod[3] = ' '; while (dalej == 1) { klaw = klawisz(); itoa(klaw, c, 10); if ((klaw != 12) && (klaw != 255) && (i <= 3)) { kod[i] = c[0]; i++; } if (klaw == 12) dalej = 0; } cmp = strcmp(kod, "1233"); if (cmp == 0) { LCD_Clear(); LCD_WriteText("Otwarte"); PORTA |= P3; PORTA &= ~BUZZER; _delay_ms(500); PORTA |= BUZZER; _delay_ms(1500); PORTA &= ~P3; } if (cmp != 0) { LCD_Clear(); LCD_WriteText("Zly kod "); PORTA &= ~BUZZER; _delay_ms(500); PORTA |= BUZZER; _delay_ms(1500); LCD_Clear(); } PORTC &= ~LED3; LCD_UPDATE = 1; } if (!(PINC & SW4)) { PORTA &= ~BUZZER; _delay_ms(100); PORTA |= BUZZER; LCD_Clear(); LCD_WriteText("Podaj kod:"); PORTC |= LED4; i = 0; kod[0] = ' '; kod[1] = ' '; kod[2] = ' '; kod[3] = ' '; while (dalej == 1) { klaw = klawisz(); itoa(klaw, c, 10); if ((klaw != 12) && (klaw != 255) && (i <= 3)) { kod[i] = c[0]; i++; } if (klaw == 12) dalej = 0; } cmp = strcmp(kod, "1234"); if (cmp == 0) { LCD_Clear(); LCD_WriteText("Otwarte"); PORTA |= P4; PORTA &= ~BUZZER; _delay_ms(500); PORTA |= BUZZER; _delay_ms(1500); PORTA &= ~P4; } if (cmp != 0) { LCD_Clear(); LCD_WriteText("Zly kod "); PORTA &= ~BUZZER; _delay_ms(500); PORTA |= BUZZER; _delay_ms(1500); LCD_Clear(); } PORTC &= ~LED4; LCD_UPDATE = 1; } } }