Hallo,
ich mache gerade meine erste Erfahrungen im Programmieren von Atmel µCs.
Zum üben hab ich jetzt ein Schieberegister aufgebaut um ein HD44780-LCD
anzusteuern. Vom Controller brauche ich daher nur 3 Ports: DATA, CLK und
ENABLE. Das ganze funktioniert bereits auch tadellos :-).
LCD <-> Register
----------------
D7 <-> DATA
RW <-> QA
RS <-> QB
D6 <-> QC
D5 <-> QD
D4 <-> QE
Mit dieser Routine schiebe ich die entsprechenden Bits ins Register:
void lcd_send(uint8_t data)
{
uint8_t i, dout = 0x0;
//data: D7, D6, D5, D4, --, --, RW, RS
//dout: --, --, D7, RW, RS, D6, D5, D4
dout |= ((data & 0b11110000)>>4)
|((data & 0b00000011)<<3)
|((data & 0b10000000)>>2);
// Bits ins Register schreiben
for(i=0;i<=4;i++)
{
LCD_PORT &= ~(1<<LCD_CLK); // CLK auf 0 setzen
if(dout & (1<<i))
LCD_PORT |= (1<<LCD_DATA); // DATA auf 1 setzen
else
LCD_PORT &= ~(1<<LCD_DATA); // DATA auf 0 setzen
LCD_PORT |= (1<<LCD_CLK); // CLK auf 1 setzen
}
// D7 ist gleich DATA
if(dout & (1<<5))
LCD_PORT |= (1<<LCD_DATA); // DATA auf 1 setzen
else
LCD_PORT &= ~(1<<LCD_DATA); // DATA auf 0 setzen
lcd_enable();
}
Da ich keine Erfahrung hab würde mich interessieren was ich an meinen
Code verbessern könnte? Komme ich auch eventuell ohne if-Abfrage aus?
danke!