Ich kann dir den Quellcode geben.
Die eigentliche Routine ist:
Ich habe 1:1 vom Buch "Basiskurs R8C/13" von Elektor genommen (nur Ports,... an den AVR angepasst).Code:#include "HD44780.h" void LCD_Ctrl (unsigned char data) { PORTB &= ~(1<<RS); //erstes Nibble PORTC = ((data & 0xF0)>>4); PORTB |= (1<<EN); asm volatile ("nop"); PORTB &= ~(1<<EN); //zweites Nibble PORTC = data & 0x0F; PORTB |= (1<<EN); asm volatile ("nop"); PORTB &= ~(1<<EN); _delay_us(100); } void LCD_Home (void) { //Display löschen und auf Homeposition setzen LCD_Ctrl (0x01); _delay_ms(1); LCD_Ctrl (0x02); _delay_ms(5); } void LCD_Data (unsigned char data) { _delay_us(100); //erstes Nibble PORTC = ((data & 0xF0)>>4); PORTB |= (1<<RS); PORTB |= (1<<EN); asm volatile ("nop"); PORTB &= ~(1<<EN); //zweites Nibble PORTC = data & 0x0F; PORTB |= (1<<RS); PORTB |= (1<<EN); asm volatile ("nop"); PORTB &= ~(1<<EN); PORTB &= ~(1<<RS); _delay_us(100); } void LCD_Init(void) { DDRC |= 0x0F; //PC0 - PC3 als Ausgang DDRB |= (1<<PB6) | (1<<PB7); //RS und EN als Ausgang _delay_ms(15); LCD_Ctrl (0x28); _delay_ms(5); LCD_Ctrl (0x28); _delay_ms(1); LCD_Ctrl (0x28); /* 0b00001DCB 0 1 D: Display aus ein C: Cursor aus ein B: Blinken aus ein 0x0F: Display ein, Cursor sichtbar, Blinken ein 0x0E: Display ein, Cursor sichtbar, Blinken aus 0x0C: Display ein, Cursor unsichtbar, Blinken aus */ _delay_ms(1); LCD_Ctrl (0x0C); _delay_ms(1); LCD_Ctrl (0x01); _delay_ms(1); LCD_Ctrl (0x02); _delay_ms(5); } void LCD_Pos (unsigned int zeile, unsigned int spalte) { LCD_Ctrl (0x80 + spalte - 1+ 0x40 * (zeile - 1)); _delay_us (100); } void LCD_String (char text [20]) { unsigned int i=0; while ((!(text[i] == 0)) & (i < 20)) { LCD_Data (text[i]); i++; } } void LCD_Integer (unsigned int data) { unsigned char a; a = (data % 10000)/1000; //Tausender LCD_Data (a + 48); a = (data % 1000)/100; //Hunderter LCD_Data (a + 48); a = (data % 100)/10; //Zehner LCD_Data (a + 48); a = data % 10; //Einer LCD_Data (a + 48); }
In der HD44780.h sind nur andere Headerdateien, die man benötigt (z.B. damit man "PORTX",... nutzen kann), und es ist noch RS bzw EN definiert.
Die einzelnen Funktionen sind:
LCD_Ctrl => wird verwendet um das LCD einzustellen (Kommandos senden), LCD wird gelöscht und Cursorposition wird auf Home gesetzt
LCD_Data => wird verwendet um Daten an das LCD zu senden, damit etwas angezeigt wird
LCD_Init => stellt die benötigten Pins auf Ausgang, stellt das LCD ein
LCD_Home => löscht das Display und setzt den Cursor auf die Grundposition (Zeile 1, Spalte 1)
LCD_Pos => springe zu Cursorposition
LCD_String => übergibt einen String an das LCD
LCD_Integer => übergibt eine Zahl von "0000" bis "9999" an das Display, inkl. auftrennen der einzelnen Stellen
Das Beispiel von dir würde dann in etwa so aussehen (die Headerdateien,... fehlen noch, die Main funktioniert aber so):
Code:......... int main (void) { LCD_Init; LCD_String ("16x4 LCD Display"); LCD_Pos (2, 1); LCD_String ("----------------"); }







Zitieren

Lesezeichen