//DA4-DA7 PORTC 0-3 //RS PORTC 6 //E PORTC 7 void lcd_ini () { DDRC = 0xCF; // setze Portrichtung (1 = Ausgang): 0011 1111 PORTC=0x00; // alle Leitungen LOW delay(10000); // 10ms warten bis LCD wirklich bereit (max. Wert lt. Datenblatt) lcd_write(0x38,0); // B 0010 1000 => 8-Bit-Modus aktivieren, Ist wichtig, falls LCD schon im 4-Bit Modus war und dann // nach einem Programm-Reset vergeblich versucht würde, den 4-Bit Modus erneut zu aktivieren lcd_write(0x2,0); // B 0000 0010 => mit 8-Bit-Command in 4-Bit-Modus umschalten lcd_flash_e (); // Enable delay(1000); // sicherheitshalber warten // ab jetzt 4-Bit-Modus lcd_write(0x28,0); // B 0010 1000 => Function Set: 4Bit (kein 8-Bit Bus), zweizeiliges Display, 5x7 Dots/Zeichen (kein 5x10) lcd_write(0x0C,0); // B 0000 1100 => Display On/Off: Display ein, Cursor aus, Blinken aus lcd_write(0x06,0); // B 0000 0110 => Entry Mode Set: DD-RAM autom. inkr., Cursor bewegen lcd_cls(); // Display löschen } void lcd_write (uint8_t data, uint8_t rs) { uint8_t dataBits ; if (rs) // write data (RS=1, RW=0) dataBits=0x40; // RS liegt an Pin 6 = B 0100 0000 = 0x40 else // write instruction (RS=0, RW=0) dataBits=0; PORTC = dataBits |(data>>4); // output high nibble first, zzgl. Zustand für RS-Leitung lcd_flash_e (); PORTC = dataBits | (data&0x0F); // output low nibble, zzgl. RS-Leitung lcd_flash_e (); delay(2000); } void lcd_flash_e () { PORTC = PORTC | ( 1<