Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #define F_CPU 16000000
- #include <util/delay.h>
- #include <string.h>
- #include <stdio.h>
- void Inicjalizacja(void); //deklaracja funkcji inicjalizacji LCD
- void Wyswietlanie(char*, uint8_t len);
- void Wyswietlanie_nizej(char*, uint8_t len);
- void Przesuwanie(int8_t);
- void Zapis(int8_t); //deklaracja funkcji zapisu na wyswietlaczu LCD
- void Znak(const char*, int8_t);
- void Clear() {
- PORTA &= ~(1<<PA4); //slowa sterujace
- PORTA &= ~(1<<PA6); //E <- 0
- _delay_ms(40);
- PORTA |= (1<<PA6); //E<-1
- PORTB = 0b00110000; //1-sza sekwencja 0011****
- PORTA &= ~(1<<PA6); //E <-0
- _delay_ms(4.1);
- PORTA |= (1<<PA6); //E<- 1
- //2 sekwencja 0011****
- PORTA &= ~(1<<PA6); //E<-0
- _delay_ms(100);
- PORTA |= (1<<PA6); // E<-1
- //3 sekwencja 0011****
- PORTA &= ~(1<<PA6); // E<-0
- _delay_ms(100);
- PORTA |= (1<<PA6);
- PORTB &= ~(1<<PB4);
- PORTA &= ~(1<<PA6);
- Zapis(0b00101000); //dla 4bitowego
- //Zapis(0b00111100); //wywolanie funkcji zapis do LCD
- //8 bitowe slowo, 2 wiersze, matryca 5x10
- Zapis(0b00001100); //wlaczanie wyswietlacza, kursor aktywny i miga
- Zapis(1); //czyszczenie wyswietlacza
- _delay_ms(1.64);
- Zapis(0b00000110);
- }
- volatile uint8_t STOP = 0; //KEY STATE STOP
- volatile uint8_t STOPPED = 0;
- volatile uint8_t K_R = 0; //KEY STATE RIGHT
- volatile uint8_t K_L = 0; //KEY STATE LEFT
- volatile uint16_t SEKUNDY = 0;
- volatile uint8_t W_L = 0;
- volatile uint8_t W_R = 0;
- volatile uint8_t BUZKA_L = 0;
- volatile uint8_t BUZKA_R = 0;
- char napis[4] = ""; // napis do wyswietlenia
- char napiss[5]= { 'S', 'u', 'p', 0, 0 };
- const char kod[8] = {
- 0b00000,
- 0b01010,
- 0b00000,
- 0b00100,
- 0b00100,
- 0b10001,
- 0b01110,
- 0b00000
- };
- int main(void)
- {
- // Timer
- TCCR0 |= (1 << WGM01) | (0 << WGM00);
- TCCR0 |= (1 << CS02) | (0 << CS01) | (1 << CS00);
- OCR0 = 50;
- TIMSK |=(1 << OCIE0);
- sei();
- /* WERJŚCIE PORT C: */
- DDRC = 0x00;
- PORTC = 0xFF;
- Inicjalizacja();
- Znak(kod, 0);
- //Wyswietlanie(napis, 4);
- //Wyswietlanie_nizej(napiss, 5);
- while(1) {
- if(STOP == 2)
- {
- STOPPED = (!STOPPED) & 0x01;
- STOP = 3;
- }
- if(K_L == 2)
- {
- W_L++;
- K_L = 3;
- BUZKA_L = 10;
- }
- if(K_R == 2)
- {
- W_R++;
- K_R = 3;
- BUZKA_R = 10;
- }
- }
- return 0;
- }
- void Inicjalizacja() //definicja funkcji inicjalizacji
- {
- DDRB=0xff; //wyjscie do lcd
- DDRA |= (1<<PA4)|(1<<PA6); //wyjscie do sterowania
- PORTB = (PORTB & 0x0F); //dla 4bitowego
- //PORTB = 0; //PB7..0 <-0
- PORTA &= ~(1<<PA4); //slowa sterujace
- PORTA &= ~(1<<PA6); //E <- 0
- _delay_ms(40);
- PORTA |= (1<<PA6); //E<-1
- PORTB = 0b00110000; //1-sza sekwencja 0011****
- PORTA &= ~(1<<PA6); //E <-0
- _delay_ms(4.1);
- PORTA |= (1<<PA6); //E<- 1
- //2 sekwencja 0011****
- PORTA &= ~(1<<PA6); //E<-0
- _delay_ms(100);
- PORTA |= (1<<PA6); // E<-1
- //3 sekwencja 0011****
- PORTA &= ~(1<<PA6); // E<-0
- _delay_ms(100);
- PORTA |= (1<<PA6);
- PORTB &= ~(1<<PB4);
- PORTA &= ~(1<<PA6);
- Zapis(0b00101000); //dla 4bitowego
- //Zapis(0b00111100); //wywolanie funkcji zapis do LCD
- //8 bitowe slowo, 2 wiersze, matryca 5x10
- Zapis(0b00001100); //wlaczanie wyswietlacza, kursor aktywny i miga
- Zapis(1); //czyszczenie wyswietlacza
- _delay_ms(1.64);
- Zapis(0b00000110); //adres inkrementowany, przesuwanie kursora
- }
- void Znak(const char* kod, int8_t AAA)
- {
- int8_t k;
- PORTA &= ~(1<<PA4); // RS <- 0
- Zapis((0x40)|(AAA<<3)); // Rozkaz wejscia do CGRAM
- PORTA |=(1<<PA4); // RS <- 1
- _delay_us(40);
- for(k=0;k<8;k++)
- {
- Zapis(kod[k]);
- }
- PORTA &= ~(1<<PA4); // RS <- 0 Teraz slowa sterujace
- Zapis(0x80); // Powrot do pamieci DDRAM
- PORTA |= (1<<PA4); // RS <- 1 Teraz znaki
- _delay_us(40);
- }
- void Wyswietlanie(char* co, uint8_t len)
- {
- uint8_t ile = len;
- int8_t k = 0;
- PORTA |= (1<<PA4); //RS <-1 teraz znaki
- while(k<ile)
- {
- Zapis(napis[k]); //wyslanie znakow "Fajnie?" na wyswietlacz
- k++;
- }
- }
- void Wyswietlanie_nizej(char* co, uint8_t len)
- {
- uint8_t ile = len;
- int8_t k = 0;
- PORTA &= ~(1<<PA4);
- Zapis(0b11000000);
- PORTA |= (1<<PA4);
- while(k<ile)
- {
- Zapis(napiss[k]);
- k++;
- }
- }
- void Przesuwanie(int8_t ile)
- {
- int8_t i = 0;
- int8_t k = 0;
- PORTA &= ~(1<<PA4);
- while(i<ile)
- {
- Zapis(0b00011100);
- _delay_ms(330);
- i++;
- }
- while(k<ile)
- {
- Zapis(0b00011000);
- _delay_ms(330);
- k++;
- }
- PORTA |= (1<<PA4);
- }
- void Zapis(int8_t bajt) //definicja funkcji zapisu
- {
- /*PORTA |=(1<<PA6); //E<-1
- PORTB = bajt;
- asm volatile("nop"); //male opoznienie
- PORTA &= ~_BV(PA6); //E<-0 zapis opadajacym zboczem
- _delay_us(40);*/
- //dla 4bitowego
- PORTA |=(1<<PA6);
- PORTB = (bajt & 0xF0)|(PORTB &0x0F);
- PORTA &= ~(1<<PA6);
- asm volatile("nop");
- PORTA |=(1<<PA6);
- PORTB = ((bajt & 0x0F)<<4)|(PORTB &0x0F);
- PORTA &= ~(1<<PA6);
- _delay_us(40);
- }
- volatile uint16_t licznik = 0;
- ISR(TIMER0_COMP_vect)
- {
- licznik++;
- switch(STOP)
- {
- case 0: if ((PINC & 0x01) == 0) STOP = 1;
- break;
- case 1: if ((PINC & 0x01) == 0) STOP = 2;
- else STOP = 0;
- break;
- case 2: break;
- case 3: if ((PINC & 0x01) != 0) STOP = 4;
- break;
- case 4: if ((PINC & 0x01) != 0) STOP = 0;
- else STOP = 3;
- break;
- default: STOP = 0;
- }
- switch(K_R)
- {
- // Jesli klikniety
- case 0: if ((PINC & 0x02) == 0) K_R = 1;
- break;
- // Jesli dalej klikniety
- case 1: if ((PINC & 0x02) == 0) K_R = 2;
- else K_R = 0;
- break;
- // Obsluga kolegi w main
- case 2: break;
- // Zostal klikniety RAZ
- case 3: if ((PINC & 0x02) != 0) K_R = 4;
- break;
- // Zostal odklikniety LUB nie to czeka
- case 4: if ((PINC & 0x02) != 0) K_R = 0;
- else K_R = 3;
- break;
- default: K_R = 0;
- }
- switch(K_L)
- {
- // Jesli klikniety
- case 0: if ((PINC & 0x04) == 0) K_L = 1;
- break;
- // Jesli dalej klikniety
- case 1: if ((PINC & 0x04) == 0) K_L = 2;
- else K_L = 0;
- break;
- // Obsluga kolegi w main
- case 2: break;
- // Zostal klikniety RAZ
- case 3: if ((PINC & 0x04) != 0) K_L = 4;
- break;
- // Zostal odklikniety LUB nie to czeka
- case 4: if ((PINC & 0x04) != 0) K_L = 0;
- else K_L = 3;
- break;
- default: K_L = 0;
- }
- if(STOPPED == 0 && licznik > 270)
- {
- SEKUNDY++;
- licznik = 0;
- }
- if(licznik % 270 == 0)
- {
- Clear();
- PORTA &= ~(1<<PA4);
- PORTA |= (1<<PA4);
- uint8_t ile = 5;
- uint8_t k = 0;
- char t[5] = {'0', '0', ':', '0', '0'};
- t[4] = (char)((SEKUNDY % 10) + 48);
- t[3] = (char)(((SEKUNDY % 60) / 10) + 48);
- t[1] = (char)(((SEKUNDY / 60) % 10) + 48);
- t[0] = (char)(((SEKUNDY / 600) % 10) + 48);
- while(k<ile)
- {
- Zapis(t[k]);
- k++;
- }
- PORTA &= ~(1<<PA4);
- Zapis(0b11000000);
- PORTA |= (1<<PA4);
- char w[5] = {'0', '0', ':', '0', '0'};
- w[1] = (W_R % 10) + 48;
- w[0] = ((W_R / 10) % 10) + 48;
- w[4] = (W_L % 10) + 48;
- w[3] = ((W_L / 10) % 10) + 48;
- Zapis(w[0]);
- Zapis(w[1]);
- if(BUZKA_R > 0) {
- if(BUZKA_R % 4 > 1)
- Zapis(0);
- else Zapis(' ');
- BUZKA_R--;
- }
- else {
- Zapis(' ');
- }
- for(uint8_t i = 0; i < 5; i++){
- Zapis(' ');
- }
- for(uint8_t i = 0; i < 5; i++){
- Zapis(' ');
- }
- if(BUZKA_L > 0) {
- if(BUZKA_L % 4 > 1)
- Zapis(0);
- else Zapis(' ');
- BUZKA_L--;
- }
- else {
- Zapis(' ');
- }
- Zapis(w[3]);
- Zapis(w[4]);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement