// Programowanie mikrokontrolerow 2015/2016, Wydzial Fizyki UW // Graficzny wyswietlacz LCD // // Wymagane polaczenia w ukladzie ZL15AVR: // Linie danych podlaczone do portu D // D0 - PD0 // D1 - PD1 // D2 - PD2 // D3 - PD3 // D4 - PD4 // D5 - PD5 // D6 - PD6 // D7 - PD7 // Linie sterujace podlaczone do portu C // RS - PC0 // RW - PC1 // E - PC2 // CS1 - PC3 // CS2 - PC4 // // Autorzy: Pawel Klimczewski, Bartlomiej Zglinicki #include #include //--------------------------------------------------------------------------- void configure_pins() { DDRC |= 1 << PC0 | 1 << PC1 | 1 << PC2 | 1 << PC3 | 1 << PC4; DDRD = 0xff; } //--------------------------------------------------------------------------- // Funkcje obslugi wyswietlacza //--------------------------------------------------------------------------- void e() // Sygnal "wykonawczy" E { _delay_us(10); // Czekam... PORTC |= 1 << PC2; // Ustawiam na E stan 1 _delay_us(10); // Czekam... PORTC &= ~(1 << PC2); // Ustawiam na E stan 0 _delay_us(10); // Czekam... } // Zapis bajtu // Najmlodszy bit (w zapisie binarnym po prawej stronie) - gorny piksel // Najstarszy bit (w zapisie binarnym po lewej stronie) - dolny piksel void b(uint8_t a) { PORTD = a; PORTC |= 1 << PC0; // RS - 1 PORTC |= 1 << PC3; // CS1 - 1 PORTC |= 1 << PC4; // CS2 - 1 e(); } // Ustawienie wspolrzednej x (numeru wiersza) // a = 0..7; 0 - gorny wiersz, 7 - dolny wiersz void x(uint8_t a) { PORTD = 0b10111000 | a; PORTC |= 1 << PC3; // CS1 - 1 PORTC |= 1 << PC4; // CS2 - 1 PORTC &= ~( 1 << PC0 ); // RS - 0 e(); } // Ustawienie wspolrzednej y (adresu w wierszu) // a = 0..63; 0 - strona lewa, 63 - strona prawa void y(uint8_t a) { PORTD = 0b01000000 | a; PORTC |= 1 << PC3; // CS1 - 1 PORTC |= 1 << PC4; // CS2 - 1 PORTC &= ~( 1 << PC0 ); // RS - 0 e(); } // Inicjalizacja wyswietlacza void init() { PORTD = 0b00111111; // Wlaczam wyswietlacz PORTC |= 1 << PC3; // CS1 - 1 PORTC |= 1 << PC4; // CS2 - 1 PORTC &= ~( 1 << PC0 ); // RS - 0 e(); } //--------------------------------------------------------------------------- // Przykladowy program: zapalenie wszystkich pikseli wyswietlacza, // a nastepnie ich zgaszenie //--------------------------------------------------------------------------- int main() { configure_pins(); init(); // Wypelnienie wyswietlacza for(uint8_t i = 0; i < 8; ++i) { for(uint8_t j = 0; j < 64; ++j) { x(i); y(j); b(0xff); _delay_ms(10); } } // Wyczyszczenie wyswietlacza for(uint8_t i = 0; i < 8; ++i) { for(uint8_t j = 0; j < 64; ++j) { x(i); y(j); b(0); _delay_ms(10); } } return 0; } //---------------------------------------------------------------------------