#define COM 0
#define LCD_PORT PORTD
#define LCD_DDR DDRD
#define LCD_DATA_PIN PD4
#define LCD_CLK_PIN PD6
#define LCD_E_PIN PD5
#define TXT 1
// Dit is de bediening v/d 3-draads seriele interface.
// LCD_DATA_PIN wordt verbonden met de Data-ingang van een 74HC595 en met RS v/d LCD-module.
// LCD_CLK_PIN wordt verbonden met de schuifregisterklok v/d 74HC595
// LCD_E_PIN wordt verbonden met de Latch-ingang v/d 74HC595 en met de E-pin v/d LCD-module.
// Werking:
// LCD_E_PIN laag
// LCD_CLK_PIN laag
// Bit 7 klaarzetten
// LCD_CLK_PIN hoog en terug laag
// Bit 6 klaarzetten
// LCD_CLK_PIN hoog en terug laag
// ...
// ...
// Bit 0 klaarzetten
// LCD_CLK_PIN hoog en terug laag
// RS klaarzetten
// LCD_E_PIN hoog en terug laag
#define lcd_delay(x) _delay_loop_1(x)
#define lcd_command(x) char2LCD3(x, COM)
#define lcd_putchar(x) char2LCD3(x, TXT)
void char2LCD3(unsigned char karakter, unsigned char RS)
{
unsigned char cnt;
for (cnt = 0; cnt < 8; cnt++) {
if ((karakter & 0x80) == 0x80) { // een '1'
LCD_PORT |= (1 << LCD_DATA_PIN); // LCD_DATA_PIN hoog
} else { // een '0'
LCD_PORT &= ~(1 << LCD_DATA_PIN); // LCD_DATA_PIN laag
}
lcd_delay(5);
LCD_PORT |= (1 << LCD_CLK_PIN); // Seriele klok hoog
lcd_delay(5);
LCD_PORT &= ~(1 << LCD_CLK_PIN); // Seriele klok terug laag
karakter = karakter << 1; // Bits een plaatsje naar rechts schuiven
}
if (RS == TXT) {
LCD_PORT |= (1 << LCD_DATA_PIN); // Tekst, RS moet hoog
} else {
LCD_PORT &= ~(1 << LCD_DATA_PIN); // Instructie, RS moet laag
}
lcd_delay(5);
LCD_PORT |= (1 << LCD_E_PIN); // schuifregister -> par. uitgang
lcd_delay(20);
LCD_PORT &= ~(1 << LCD_E_PIN); // par. uitgang -> LCD-module
}