Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * AVRGCC10.c
- *
- * Created: 06.12.2019 16:47:36
- * Author: Albert
- */
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #include <util/delay.h>
- #define F_CPU 1000000L
- #define LCD_DDR DDRB
- #define LCD_PORT PORTB
- #define LCD_RS 2
- #define LCD_EN 3
- #define LCD_DB4 4
- #define LCD_DB5 5
- #define LCD_DB6 6
- #define LCD_DB7 7
- #define SW_1(1<<PC1)
- ISR(INT2_vect)
- {
- OCR0=100;
- if(!(TIFR & (1<<OCF0)));
- TIFR|=(1<<OCF0);
- }
- void nowa_linia()
- {
- LCD_PORT &~(_BV(LCD_RS));
- wyswietl(0b10101000); //przejscie do nowej lini
- LCD_PORT |= _BV(LCD_RS);
- _delay_ms(2);
- }
- void wyswietl(int8_t znak)
- {
- LCD_PORT |= _BV(LCD_EN); // wlaczenie linii ENABLE
- LCD_PORT = (znak & 0xF0)|(LCD_PORT & 0x0F); //wysłanie 4 starszych bitów
- LCD_PORT &= ~(_BV(LCD_EN)); // potwierdzenie wysłana danych poprzez opadnięcie ENABLE
- asm volatile("nop"); // odczekanie jednego cyklu
- LCD_PORT |= _BV(LCD_EN); //wysłanie 4 młodszych bitów
- LCD_PORT = ((znak & 0x0F)<<4)|(LCD_PORT & 0x0F);
- LCD_PORT &= ~(_BV(LCD_EN));
- // odczekanie niezbędnej długości czasu na potwierdzenie wprowadzenia danych
- _delay_us(50);
- }
- void wyczysc()
- {
- LCD_PORT &= ~(_BV(LCD_RS));
- wyswietl(0x01);
- LCD_PORT |= _BV(LCD_RS);
- _delay_ms(1.64);
- }
- void wlacz()
- {
- LCD_DDR=0xFF;
- _delay_ms(15);
- LCD_PORT = 0;
- LCD_PORT &= ~(_BV(LCD_RS));
- wyswietl(0b00101000);
- LCD_PORT |= _BV(LCD_RS);
- LCD_PORT &= ~(_BV(LCD_RS));
- wyswietl(0b00000110);
- LCD_PORT |= _BV(LCD_RS);
- LCD_PORT &= ~(_BV(LCD_RS));
- wyswietl(0b00001100);
- LCD_PORT |= _BV(LCD_RS);
- wyczysc();
- }
- void napisz(char *text, int8_t dlug)
- {
- int8_t a=0;
- while(a<dlug)
- {
- if(a==16)
- {
- nowa_linia();
- }
- wyswietl(text[a]);
- a++;
- }
- }
- void wyswietl_znak(unsigned char pozycja, unsigned char *znak)
- {
- unsigned char j;
- if(pozycja<8)
- { LCD_PORT &~(_BV(LCD_RS));
- wyswietl(0x40 + (pozycja*8)); //okreslenie pozycji
- LCD_PORT |= _BV(LCD_RS);
- for(j=0;j<8;j++)
- wyswietl(znak[j]); //petla wyswietlajaca zdefiniowany element
- }
- }
- volatile int ile=0;// licznik wskazujący co zrobić
- ISR(INT0_vect){
- int k=0;
- char text[14]="Albert_Rachwal";
- unsigned char sword[] = {
- 0x04,
- 0x04,
- 0x04,
- 0x04,
- 0x15,
- 0x0E,
- 0x04,
- 0x04};
- unsigned char dinosaur[] = {
- 0x1C,
- 0x17,
- 0x1F,
- 0x18,
- 0x0F,
- 0x1C,
- 0x1E,
- 0x18};
- unsigned char tunel[] = {
- 0x1F,
- 0x11,
- 0x15,
- 0x15,
- 0x14,
- 0x17,
- 0x10,
- 0x1F};
- LCD_PORT &~(_BV(LCD_RS));
- wyswietl(0x80); //okreslenie pozycji poczatkowej
- LCD_PORT |= _BV(LCD_RS);
- if(!(PINC &(1<<PC1)))
- {
- ile++;
- if(ile%2==1) //nieparzyste wciśnięcie włączy animacje
- {
- napisz(text,14);
- for(k=0;k<3;k++) //animacja
- {
- if(k==0){wyswietl_znak(15,tunel);}
- if(k==1){wyswietl_znak(16,sword);}
- if(k==2){wyswietl_znak(15,dinosaur);}
- Czekaj();
- }
- }
- if(ile%2==0) //parzyste wcisniecie wyłaczy animacje
- {
- napisz(text,14);
- }
- Czekaj(); //funkcja wykorzystująca przerwanie do opóźnienia
- }
- if(ile==2){ile=0;}//zerowanie licznika;
- }
- volatile int timer=0;
- void Czekaj()
- {
- timer=0;
- while(timer<4); //100*4~~ 400ms
- }
- ISR(TIMER0_OVF_vect){
- timer++;
- TCNT0=155; //każdorazowe wykonanie 100 tików
- }
- int main(void)
- {
- cli();
- OCR0=255;
- TIMSK |=(1<<TOIE0); //flaga wywola przepelnienie gdy TCNT0 zrowna sie z OCR0
- TCCR0 |=(1<<CS02)|(1<<CS00); //preskaler 1024 1 tik ~ 1 ms
- TCNT0=155; // 100ms
- wlacz(); //funkcja inicjalizujaca wyswietlacz
- DDRC &~SW_1; //wejście dla przycisku
- PORTC |=SW_1; //wysoka impedancja dla przycisku
- GICR |= (1<<INT0);
- MCUCR |= (1<<ISC01)|(0<<ISC00); //wywolanie przerwania zboczem opadajacym
- sei();
- while(1)
- {
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement