#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 karakterunsigned char RS)
{
    unsigned char cnt;

    for (cnt = 0cnt < 8cnt++) {
        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
}