Ich kann dir den Quellcode geben.
Die eigentliche Routine ist:
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);
}
Ich habe 1:1 vom Buch "Basiskurs R8C/13" von Elektor genommen (nur Ports,... an den AVR angepasst).
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 ("----------------");
}
Lesezeichen