Advertisement
Guest User

Untitled

a guest
Dec 6th, 2019
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.80 KB | None | 0 0
  1. /*
  2. * AVRGCC10.c
  3. *
  4. * Created: 06.12.2019 16:47:36
  5. * Author: Albert
  6. */
  7.  
  8. #include <avr/io.h>
  9. #include <avr/interrupt.h>
  10. #include <util/delay.h>
  11. #define F_CPU 1000000L
  12.  
  13. #define LCD_DDR DDRB
  14. #define LCD_PORT PORTB
  15. #define LCD_RS 2
  16. #define LCD_EN 3
  17. #define LCD_DB4 4
  18. #define LCD_DB5 5
  19. #define LCD_DB6 6
  20. #define LCD_DB7 7
  21. #define SW_1(1<<PC1)
  22.  
  23.  
  24.  
  25.  
  26. ISR(INT2_vect)
  27. {
  28. OCR0=100;
  29. if(!(TIFR & (1<<OCF0)));
  30. TIFR|=(1<<OCF0);
  31.  
  32. }
  33. void nowa_linia()
  34. {
  35. LCD_PORT &~(_BV(LCD_RS));
  36. wyswietl(0b10101000); //przejscie do nowej lini
  37. LCD_PORT |= _BV(LCD_RS);
  38. _delay_ms(2);
  39. }
  40. void wyswietl(int8_t znak)
  41. {
  42.  
  43. LCD_PORT |= _BV(LCD_EN); // wlaczenie linii ENABLE
  44.  
  45. LCD_PORT = (znak & 0xF0)|(LCD_PORT & 0x0F); //wysłanie 4 starszych bitów
  46.  
  47. LCD_PORT &= ~(_BV(LCD_EN)); // potwierdzenie wysłana danych poprzez opadnięcie ENABLE
  48.  
  49. asm volatile("nop"); // odczekanie jednego cyklu
  50.  
  51. LCD_PORT |= _BV(LCD_EN); //wysłanie 4 młodszych bitów
  52. LCD_PORT = ((znak & 0x0F)<<4)|(LCD_PORT & 0x0F);
  53. LCD_PORT &= ~(_BV(LCD_EN));
  54.  
  55. // odczekanie niezbędnej długości czasu na potwierdzenie wprowadzenia danych
  56. _delay_us(50);
  57. }
  58. void wyczysc()
  59. {
  60. LCD_PORT &= ~(_BV(LCD_RS));
  61. wyswietl(0x01);
  62. LCD_PORT |= _BV(LCD_RS);
  63.  
  64. _delay_ms(1.64);
  65. }
  66.  
  67. void wlacz()
  68. {
  69. LCD_DDR=0xFF;
  70. _delay_ms(15);
  71. LCD_PORT = 0;
  72.  
  73.  
  74. LCD_PORT &= ~(_BV(LCD_RS));
  75. wyswietl(0b00101000);
  76. LCD_PORT |= _BV(LCD_RS);
  77.  
  78. LCD_PORT &= ~(_BV(LCD_RS));
  79. wyswietl(0b00000110);
  80. LCD_PORT |= _BV(LCD_RS);
  81.  
  82. LCD_PORT &= ~(_BV(LCD_RS));
  83. wyswietl(0b00001100);
  84. LCD_PORT |= _BV(LCD_RS);
  85.  
  86. wyczysc();
  87. }
  88. void napisz(char *text, int8_t dlug)
  89. {
  90. int8_t a=0;
  91. while(a<dlug)
  92. {
  93. if(a==16)
  94. {
  95.  
  96. nowa_linia();
  97. }
  98.  
  99. wyswietl(text[a]);
  100. a++;
  101. }
  102.  
  103.  
  104.  
  105. }
  106. void wyswietl_znak(unsigned char pozycja, unsigned char *znak)
  107. {
  108.  
  109. unsigned char j;
  110. if(pozycja<8)
  111. { LCD_PORT &~(_BV(LCD_RS));
  112. wyswietl(0x40 + (pozycja*8)); //okreslenie pozycji
  113. LCD_PORT |= _BV(LCD_RS);
  114. for(j=0;j<8;j++)
  115. wyswietl(znak[j]); //petla wyswietlajaca zdefiniowany element
  116. }
  117. }
  118.  
  119. volatile int ile=0;// licznik wskazujący co zrobić
  120. ISR(INT0_vect){
  121. int k=0;
  122. char text[14]="Albert_Rachwal";
  123. unsigned char sword[] = {
  124. 0x04,
  125. 0x04,
  126. 0x04,
  127. 0x04,
  128. 0x15,
  129. 0x0E,
  130. 0x04,
  131. 0x04};
  132.  
  133. unsigned char dinosaur[] = {
  134. 0x1C,
  135. 0x17,
  136. 0x1F,
  137. 0x18,
  138. 0x0F,
  139. 0x1C,
  140. 0x1E,
  141. 0x18};
  142.  
  143. unsigned char tunel[] = {
  144. 0x1F,
  145. 0x11,
  146. 0x15,
  147. 0x15,
  148. 0x14,
  149. 0x17,
  150. 0x10,
  151. 0x1F};
  152. LCD_PORT &~(_BV(LCD_RS));
  153. wyswietl(0x80); //okreslenie pozycji poczatkowej
  154. LCD_PORT |= _BV(LCD_RS);
  155. if(!(PINC &(1<<PC1)))
  156. {
  157. ile++;
  158. if(ile%2==1) //nieparzyste wciśnięcie włączy animacje
  159. {
  160. napisz(text,14);
  161. for(k=0;k<3;k++) //animacja
  162. {
  163. if(k==0){wyswietl_znak(15,tunel);}
  164. if(k==1){wyswietl_znak(16,sword);}
  165. if(k==2){wyswietl_znak(15,dinosaur);}
  166. Czekaj();
  167. }
  168.  
  169. }
  170. if(ile%2==0) //parzyste wcisniecie wyłaczy animacje
  171. {
  172. napisz(text,14);
  173. }
  174. Czekaj(); //funkcja wykorzystująca przerwanie do opóźnienia
  175. }
  176. if(ile==2){ile=0;}//zerowanie licznika;
  177. }
  178.  
  179. volatile int timer=0;
  180. void Czekaj()
  181. {
  182. timer=0;
  183. while(timer<4); //100*4~~ 400ms
  184. }
  185. ISR(TIMER0_OVF_vect){
  186. timer++;
  187. TCNT0=155; //każdorazowe wykonanie 100 tików
  188. }
  189.  
  190. int main(void)
  191. {
  192. cli();
  193. OCR0=255;
  194. TIMSK |=(1<<TOIE0); //flaga wywola przepelnienie gdy TCNT0 zrowna sie z OCR0
  195. TCCR0 |=(1<<CS02)|(1<<CS00); //preskaler 1024 1 tik ~ 1 ms
  196. TCNT0=155; // 100ms
  197. wlacz(); //funkcja inicjalizujaca wyswietlacz
  198.  
  199.  
  200. DDRC &~SW_1; //wejście dla przycisku
  201. PORTC |=SW_1; //wysoka impedancja dla przycisku
  202. GICR |= (1<<INT0);
  203. MCUCR |= (1<<ISC01)|(0<<ISC00); //wywolanie przerwania zboczem opadajacym
  204. sei();
  205. while(1)
  206. {
  207.  
  208. }
  209.  
  210. return 0;
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement