Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*#define F_CPU 1000000L
- #include <avr/io.h>
- #include <util/delay.h>
- #include <avr/interrupt.h>
- #define LED7 (1<<PA7)
- volatile int counter = 0;
- void displayNormal()
- {
- TCCR0 |= (1<<WGM00) | (0<<WGM01) | (1<<CS02) | (1<<CS00);
- while(!(TIFR & (1<<TOV0)));
- TIFR |= (1<<TOV0);
- TCNT0 = 11;
- PORTA ^= LED7;
- }
- void displayCTC()
- {
- TCCR0 |= (1<<WGM01) | (1<<CS02) | (1<<CS00);
- OCR0 = 244;
- while(!(TIFR & (1<<OCF0)));
- TIFR |= (1<<OCF0);
- PORTA ^= LED7;
- }
- int main(void)
- {
- DDRA |= LED7;
- PORTA |= LED7;
- _delay_ms(20);
- while(1)
- {
- //displayNormal();
- displayCTC();
- }
- }
- */
- //Ponizszy program sluzy do obslugi klawiatury matrycowej 4x4, tak by kazdy przycisk wyswietlal odpowiedni symbol na wyswietlaczu siedmo-segmentowym,
- //jednoczesnie zapewniajac obsluge bledow. Jako blad rozumiemy wcisniecie wiecej niz jednego przycisku. Program zostal skontruowany tak,
- //aby uwzgledniac wcisniecie przysciskow w roznych kolumnach i wierszach, dzieki czemu rozpatrywane sa wszystkie przypadki, co pozwala na niezawodna prace.
- //Zostalo to zrobione poprzez dodanie zmiennej liczacej liczbe wcisnietych przyciskow. Na koncu petli sprawdzamy zmienna kontrolna i gdy jest ona rowna 1
- // wyswietlamy odpowiedni kod, ktory zostal przypisany do zmiennej pomocniczej "pressed". W przypadku gdy zmienna kontrolna jest zerem na wyswietlaczu
- // nie jest wyswietlany zadnen znak, a w pozostalych przypadkach wyswietlany jest kod bledu.
- #include <avr/io.h>
- #include <util/delay.h>
- int tab[] = {1, 4, 9, 16
- , 25, 36, 49
- , 0b11111000, 0b10000000, 0b10010000
- , 0b10001000, 0b10000011, 0b11000110
- , 0b10000110, 0b10001110, 0b10100001 }; //tablica znakow wysiwetlanych po nacisnieciu odpowiedniego przycisku
- int main(void)
- {
- DDRA= 0xFF; ////ustawiamy caly port A jako wyjscie ( robimy to ustawiajac 1 na wszystkich bitach rejestru) PORTA bedzie uzywany do wyswietlania
- // odpowiednich znakow na wyswietlaczu
- DDRB= 0xFF; ////ustawiamy caly port B(tranzystor zasilajacy) jako wyjscie ( robimy to ustawiajac 1 na wszystkich bitach rejestru)
- DDRD= 0x0F; // ustawiamy na PORTD (klawiatura matrycowa) 4 najmlodsze bity jako 1 i 4 najstarzsze bity jako 0
- int controller=0; // ustawiamy nasza zmienna kiontrolna (ilosc wcisnietych przyciskow) na 0
- while(1){
- char pressed = 0b11111111; // ustawiamy nasza zmienna pomocnicza tak by przy braku interakcji uzytkownika nie zmienial sie stan wcisnietych przyciskow
- controller=0; // ustawiamy nasza zmienna kiontrolna (ilosc wcisnietych przyciskow) na 0
- PORTD = 0b11111110; // ustawiamy nasz PORTD tak by odczytywac dane z pierwszego wiersza
- PORTA= tab[0]; //ustawiamy PORTA, tak aby na wyswietlacz nie wyswietlal zadnego znaku
- _delay_ms(10); // stosujemy opoznienie w celu zapewnienia czasu na wykonanie wszystkich instrukcji
- switch(PIND) //instrukcja sprawdzajaca czy w naszym wierszu zostal wcisniety jakis przycisk
- {
- case 0b11111110: //przypadek gdy nie zostal wcisniety zaden z przyciskow (zosatal on dodany, aby opcja default
- //byla wykonywana wylacznie w przypadku wcisniecia wiecej niz jednego przyisku
- break;
- case 0b11101110: //przypadek wcisniecia przycisku w pierwszej kolumnie w pierwszym wierszu
- pressed = tab[1]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
- controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
- break;
- case 0b11011110: //przypadek wcisniecia przycisku w drugiej kolumnie w pierwszym wierszu
- pressed = tab[2]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
- controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
- break;
- case 0b10111110: //przypadek wcisniecia przycisku w trzeciej kolumnie w pierwszym wierszu
- pressed = tab[3]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
- controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
- break;
- case 0b01111110: //przypadek wcisniecia przycisku w czwartej kolumnie w pierwszym wierszu
- pressed = tab[10]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
- controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
- break;
- default: //przypadek gdy stan bitow byl inny niz wyzej wymienione (zostalo wcisniete kilka przyciskow w pierwszym wierszu
- controller+=2; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow, tak aby wywolac kod bledu
- break;
- }
- PORTD = 0b11111101; // ustawiamy nasz PORTD tak by odczytywac dane z drugiego wiersza
- _delay_ms(10); // stosujemy opoznienie w celu zapewnienia czasu na wykonanie wszystkich instrukcji
- switch(PIND) //instrukcja sprawdzajaca czy w naszym wierszu zostal wcisniety jakis przycisk
- {
- case 0b11111101: //przypadek gdy nie zostal wcisniety zaden z przyciskow (zosatal on dodany, aby opcja default
- //byla wykonywana wylacznie w przypadku wcisniecia wiecej niz jednego przyisku
- break;
- case 0b11101101: //przypadek wcisniecia przycisku w pierwszej kolumnie w drugim wierszu
- pressed = tab[4]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
- controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
- break;
- case 0b11011101: //przypadek wcisniecia przycisku w drugiej kolumnie w drugim wierszu
- pressed = tab[5]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
- controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
- break;
- case 0b10111101: //przypadek wcisniecia przycisku w trzeciej kolumnie w drugim wierszu
- pressed = tab[6]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
- controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
- break;
- case 0b01111101: //przypadek wcisniecia przycisku w czwartej kolumnie w drugim wierszu
- pressed = tab[11]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
- controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
- break;
- default: //przypadek gdy stan bitow byl inny niz wyzej wymienione (zostalo wcisniete kilka przyciskow w drugim wierszu
- controller+=2; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow, tak aby wywolac kod bledu
- break;
- }
- PORTD = 0b11111011; // ustawiamy nasz PORTD tak by odczytywac dane z trzeciego wiersza
- _delay_ms(10); // stosujemy opoznienie w celu zapewnienia czasu na wykonanie wszystkich instrukcji
- switch(PIND) //instrukcja sprawdzajaca czy w naszym wierszu zostal wcisniety jakis przycisk
- {
- case 0b11111011: //przypadek gdy nie zostal wcisniety zaden z przyciskow (zosatal on dodany, aby opcja default
- //byla wykonywana wylacznie w przypadku wcisniecia wiecej niz jednego przyisku
- break;
- case 0b11101011: //przypadek wcisniecia przycisku w pierwszej kolumnie w trzecim wierszu
- pressed = tab[7]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
- controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
- break;
- case 0b11011011: //przypadek wcisniecia przycisku w drugiej kolumnie w trzecim wierszu
- pressed = tab[8]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
- controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
- break;
- case 0b10111011: //przypadek wcisniecia przycisku w trzeciej kolumnie w trzecim wierszu
- pressed = tab[9]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
- controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
- break;
- case 0b01111011: //przypadek wcisniecia przycisku w czwartej kolumnie w trzecim wierszu
- pressed = tab[12]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
- controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
- break;
- default: //przypadek gdy stan bitow byl inny niz wyzej wymienione (zostalo wcisniete kilka przyciskow w trzecim wierszu
- controller+=2; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow, tak aby wywolac kod bledu
- break;
- }
- PORTD = 0b11110111; // ustawiamy nasz PORTD tak by odczytywac dane z czwartego wiersza
- _delay_ms(10); // stosujemy opoznienie w celu zapewnienia czasu na wykonanie wszystkich instrukcji
- switch(PIND) //instrukcja sprawdzajaca czy w naszym wierszu zostal wcisniety jakis przycisk
- {
- case 0b11110111: //przypadek gdy nie zostal wcisniety zaden z przyciskow (zosatal on dodany, aby opcja default
- //byla wykonywana wylacznie w przypadku wcisniecia wiecej niz jednego przyisku
- break;
- case 0b11100111: //przypadek wcisniecia przycisku w pierwszej kolumnie w czwartym wierszu
- pressed = tab[13]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
- controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
- break;
- case 0b11010111: //przypadek wcisniecia przycisku w drugiej kolumnie w czwartym wierszu
- pressed = 0b11000000; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
- controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
- break;
- case 0b10110111: //przypadek wcisniecia przycisku w trzeciej kolumnie w czwartym wierszu
- pressed = tab[14]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
- controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
- break;
- case 0b01110111: //przypadek wcisniecia przycisku w czwartej kolumnie w czwartym wierszu
- pressed = tab[15]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
- controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
- break;
- default: //przypadek gdy stan bitow byl inny niz wyzej wymienione (zostalo wcisniete kilka przyciskow w czwartym wierszu
- controller+=2; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow, tak aby wywolac kod bledu
- break;
- }
- if(controller == 1) // sprawdzenie czy zostal wcisniety tylko jeden przycisk
- {
- PORTA = pressed; // wyswietlenie odpowiedniego kodu dla wcisnietego przycisku
- _delay_ms(300); // zastowsowanie opoznienia w celu wyswietlenia kodu na wyswietlaczu przez czas umozliwiajacy poprawny odczyt
- }
- else if(controller == 0) // sprawdzenie czy nie zostal wcisniety zaden przycisk
- {
- PORTA = 0b11111111; // dla pewnosci ustawiamy PORTA, tak aby na wyswietlaczu nie byl wyswietlany zaden znak
- }
- else // sprawdzenie czy zostal wcisniety wiecej niz jeden przycik
- {
- PORTA = 0b10111111; //wyswietlenie kodu bledu
- _delay_ms(300); // zastowsowanie opoznienia w celu wyswietlenia kodu na wyswietlaczu przez czas umozliwiajacy poprawny odczyt
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement