Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.48 KB | None | 0 0
  1. /*#define F_CPU 1000000L
  2.  
  3. #include <avr/io.h>
  4. #include <util/delay.h>
  5. #include <avr/interrupt.h>
  6.  
  7. #define LED7 (1<<PA7)
  8.  
  9. volatile int counter = 0;
  10.  
  11. void displayNormal()
  12. {
  13. TCCR0 |= (1<<WGM00) | (0<<WGM01) | (1<<CS02) | (1<<CS00);
  14.  
  15. while(!(TIFR & (1<<TOV0)));
  16. TIFR |= (1<<TOV0);
  17. TCNT0 = 11;
  18. PORTA ^= LED7;
  19. }
  20.  
  21. void displayCTC()
  22. {
  23. TCCR0 |= (1<<WGM01) | (1<<CS02) | (1<<CS00);
  24. OCR0 = 244;
  25.  
  26. while(!(TIFR & (1<<OCF0)));
  27. TIFR |= (1<<OCF0);
  28. PORTA ^= LED7;
  29.  
  30. }
  31.  
  32. int main(void)
  33. {
  34. DDRA |= LED7;
  35. PORTA |= LED7;
  36.  
  37. _delay_ms(20);
  38.  
  39. while(1)
  40. {
  41. //displayNormal();
  42. displayCTC();
  43.  
  44. }
  45. }
  46. */
  47.  
  48.  
  49. //Ponizszy program sluzy do obslugi klawiatury matrycowej 4x4, tak by kazdy przycisk wyswietlal odpowiedni symbol na wyswietlaczu siedmo-segmentowym,
  50. //jednoczesnie zapewniajac obsluge bledow. Jako blad rozumiemy wcisniecie wiecej niz jednego przycisku. Program zostal skontruowany tak,
  51. //aby uwzgledniac wcisniecie przysciskow w roznych kolumnach i wierszach, dzieki czemu rozpatrywane sa wszystkie przypadki, co pozwala na niezawodna prace.
  52. //Zostalo to zrobione poprzez dodanie zmiennej liczacej liczbe wcisnietych przyciskow. Na koncu petli sprawdzamy zmienna kontrolna i gdy jest ona rowna 1
  53. // wyswietlamy odpowiedni kod, ktory zostal przypisany do zmiennej pomocniczej "pressed". W przypadku gdy zmienna kontrolna jest zerem na wyswietlaczu
  54. // nie jest wyswietlany zadnen znak, a w pozostalych przypadkach wyswietlany jest kod bledu.
  55.  
  56. #include <avr/io.h>
  57. #include <util/delay.h>
  58.  
  59. int tab[] = {1, 4, 9, 16
  60. , 25, 36, 49
  61. , 0b11111000, 0b10000000, 0b10010000
  62. , 0b10001000, 0b10000011, 0b11000110
  63. , 0b10000110, 0b10001110, 0b10100001 }; //tablica znakow wysiwetlanych po nacisnieciu odpowiedniego przycisku
  64.  
  65.  
  66. int main(void)
  67. {
  68. DDRA= 0xFF; ////ustawiamy caly port A jako wyjscie ( robimy to ustawiajac 1 na wszystkich bitach rejestru) PORTA bedzie uzywany do wyswietlania
  69. // odpowiednich znakow na wyswietlaczu
  70. DDRB= 0xFF; ////ustawiamy caly port B(tranzystor zasilajacy) jako wyjscie ( robimy to ustawiajac 1 na wszystkich bitach rejestru)
  71. DDRD= 0x0F; // ustawiamy na PORTD (klawiatura matrycowa) 4 najmlodsze bity jako 1 i 4 najstarzsze bity jako 0
  72. int controller=0; // ustawiamy nasza zmienna kiontrolna (ilosc wcisnietych przyciskow) na 0
  73. while(1){
  74. char pressed = 0b11111111; // ustawiamy nasza zmienna pomocnicza tak by przy braku interakcji uzytkownika nie zmienial sie stan wcisnietych przyciskow
  75. controller=0; // ustawiamy nasza zmienna kiontrolna (ilosc wcisnietych przyciskow) na 0
  76. PORTD = 0b11111110; // ustawiamy nasz PORTD tak by odczytywac dane z pierwszego wiersza
  77. PORTA= tab[0]; //ustawiamy PORTA, tak aby na wyswietlacz nie wyswietlal zadnego znaku
  78. _delay_ms(10); // stosujemy opoznienie w celu zapewnienia czasu na wykonanie wszystkich instrukcji
  79. switch(PIND) //instrukcja sprawdzajaca czy w naszym wierszu zostal wcisniety jakis przycisk
  80. {
  81.  
  82. case 0b11111110: //przypadek gdy nie zostal wcisniety zaden z przyciskow (zosatal on dodany, aby opcja default
  83. //byla wykonywana wylacznie w przypadku wcisniecia wiecej niz jednego przyisku
  84. break;
  85. case 0b11101110: //przypadek wcisniecia przycisku w pierwszej kolumnie w pierwszym wierszu
  86. pressed = tab[1]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
  87. controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
  88. break;
  89.  
  90. case 0b11011110: //przypadek wcisniecia przycisku w drugiej kolumnie w pierwszym wierszu
  91. pressed = tab[2]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
  92. controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
  93. break;
  94.  
  95. case 0b10111110: //przypadek wcisniecia przycisku w trzeciej kolumnie w pierwszym wierszu
  96. pressed = tab[3]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
  97. controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
  98. break;
  99.  
  100. case 0b01111110: //przypadek wcisniecia przycisku w czwartej kolumnie w pierwszym wierszu
  101. pressed = tab[10]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
  102. controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
  103. break;
  104.  
  105. default: //przypadek gdy stan bitow byl inny niz wyzej wymienione (zostalo wcisniete kilka przyciskow w pierwszym wierszu
  106. controller+=2; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow, tak aby wywolac kod bledu
  107. break;
  108. }
  109.  
  110. PORTD = 0b11111101; // ustawiamy nasz PORTD tak by odczytywac dane z drugiego wiersza
  111. _delay_ms(10); // stosujemy opoznienie w celu zapewnienia czasu na wykonanie wszystkich instrukcji
  112. switch(PIND) //instrukcja sprawdzajaca czy w naszym wierszu zostal wcisniety jakis przycisk
  113. {
  114. case 0b11111101: //przypadek gdy nie zostal wcisniety zaden z przyciskow (zosatal on dodany, aby opcja default
  115. //byla wykonywana wylacznie w przypadku wcisniecia wiecej niz jednego przyisku
  116. break;
  117. case 0b11101101: //przypadek wcisniecia przycisku w pierwszej kolumnie w drugim wierszu
  118. pressed = tab[4]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
  119. controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
  120. break;
  121.  
  122. case 0b11011101: //przypadek wcisniecia przycisku w drugiej kolumnie w drugim wierszu
  123. pressed = tab[5]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
  124. controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
  125. break;
  126.  
  127. case 0b10111101: //przypadek wcisniecia przycisku w trzeciej kolumnie w drugim wierszu
  128. pressed = tab[6]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
  129. controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
  130. break;
  131.  
  132. case 0b01111101: //przypadek wcisniecia przycisku w czwartej kolumnie w drugim wierszu
  133. pressed = tab[11]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
  134. controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
  135. break;
  136.  
  137. default: //przypadek gdy stan bitow byl inny niz wyzej wymienione (zostalo wcisniete kilka przyciskow w drugim wierszu
  138. controller+=2; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow, tak aby wywolac kod bledu
  139. break;
  140. }
  141.  
  142.  
  143. PORTD = 0b11111011; // ustawiamy nasz PORTD tak by odczytywac dane z trzeciego wiersza
  144. _delay_ms(10); // stosujemy opoznienie w celu zapewnienia czasu na wykonanie wszystkich instrukcji
  145. switch(PIND) //instrukcja sprawdzajaca czy w naszym wierszu zostal wcisniety jakis przycisk
  146. {
  147. case 0b11111011: //przypadek gdy nie zostal wcisniety zaden z przyciskow (zosatal on dodany, aby opcja default
  148. //byla wykonywana wylacznie w przypadku wcisniecia wiecej niz jednego przyisku
  149. break;
  150. case 0b11101011: //przypadek wcisniecia przycisku w pierwszej kolumnie w trzecim wierszu
  151. pressed = tab[7]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
  152. controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
  153. break;
  154.  
  155. case 0b11011011: //przypadek wcisniecia przycisku w drugiej kolumnie w trzecim wierszu
  156. pressed = tab[8]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
  157. controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
  158. break;
  159.  
  160. case 0b10111011: //przypadek wcisniecia przycisku w trzeciej kolumnie w trzecim wierszu
  161. pressed = tab[9]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
  162. controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
  163. break;
  164.  
  165. case 0b01111011: //przypadek wcisniecia przycisku w czwartej kolumnie w trzecim wierszu
  166. pressed = tab[12]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
  167. controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
  168. break;
  169.  
  170. default: //przypadek gdy stan bitow byl inny niz wyzej wymienione (zostalo wcisniete kilka przyciskow w trzecim wierszu
  171. controller+=2; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow, tak aby wywolac kod bledu
  172. break;
  173. }
  174.  
  175. PORTD = 0b11110111; // ustawiamy nasz PORTD tak by odczytywac dane z czwartego wiersza
  176. _delay_ms(10); // stosujemy opoznienie w celu zapewnienia czasu na wykonanie wszystkich instrukcji
  177. switch(PIND) //instrukcja sprawdzajaca czy w naszym wierszu zostal wcisniety jakis przycisk
  178. {
  179. case 0b11110111: //przypadek gdy nie zostal wcisniety zaden z przyciskow (zosatal on dodany, aby opcja default
  180. //byla wykonywana wylacznie w przypadku wcisniecia wiecej niz jednego przyisku
  181. break;
  182. case 0b11100111: //przypadek wcisniecia przycisku w pierwszej kolumnie w czwartym wierszu
  183. pressed = tab[13]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
  184. controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
  185. break;
  186.  
  187. case 0b11010111: //przypadek wcisniecia przycisku w drugiej kolumnie w czwartym wierszu
  188. pressed = 0b11000000; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
  189. controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
  190. break;
  191.  
  192. case 0b10110111: //przypadek wcisniecia przycisku w trzeciej kolumnie w czwartym wierszu
  193. pressed = tab[14]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
  194. controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
  195. break;
  196.  
  197. case 0b01110111: //przypadek wcisniecia przycisku w czwartej kolumnie w czwartym wierszu
  198. pressed = tab[15]; //ustawienie naszej zmiennej przechowujacej kod dla ostatnio wcisnietego przycisku
  199. controller++; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow
  200. break;
  201.  
  202. default: //przypadek gdy stan bitow byl inny niz wyzej wymienione (zostalo wcisniete kilka przyciskow w czwartym wierszu
  203. controller+=2; //zwiekszenie zmiennej kontrolej przechowujacej liczbe wcisnietych przyciskow, tak aby wywolac kod bledu
  204. break;
  205. }
  206.  
  207. if(controller == 1) // sprawdzenie czy zostal wcisniety tylko jeden przycisk
  208. {
  209. PORTA = pressed; // wyswietlenie odpowiedniego kodu dla wcisnietego przycisku
  210. _delay_ms(300); // zastowsowanie opoznienia w celu wyswietlenia kodu na wyswietlaczu przez czas umozliwiajacy poprawny odczyt
  211.  
  212. }
  213. else if(controller == 0) // sprawdzenie czy nie zostal wcisniety zaden przycisk
  214. {
  215. PORTA = 0b11111111; // dla pewnosci ustawiamy PORTA, tak aby na wyswietlaczu nie byl wyswietlany zaden znak
  216. }
  217. else // sprawdzenie czy zostal wcisniety wiecej niz jeden przycik
  218. {
  219. PORTA = 0b10111111; //wyswietlenie kodu bledu
  220. _delay_ms(300); // zastowsowanie opoznienia w celu wyswietlenia kodu na wyswietlaczu przez czas umozliwiajacy poprawny odczyt
  221. }
  222.  
  223. }
  224.  
  225. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement