I am using the 8 bit mode of an Atmel ATtiny2313 to drive the display, because the 8 bit mode seemed to be the simpelst.
I am not exactly proud of the following code, but it used to work and it is very close to the instructions from the data sheet:
#include <avr/io.h>
#include <util/delay_basic.h>
typedef enum
{
FUNCTION_SET = 0b00111000,
DISPLAY_CONTROL = 0b00001111,
DISPLAY_CLEAR = 0b00000001,
DISPLAY_HOME = 0b00000010,
ENTRY_MODE_SET = 0b00000110
} INSTRUCTIONS;
void execute()
{
PORTD |= 0b01000000;
_delay_loop_2(1024);
PORTD &= 0b10111111;
}
int main()
{
DDRB = 0xFF;
DDRD = 0xFF;
PORTB = FUNCTION_SET;
execute();
PORTB = DISPLAY_CONTROL;
execute();
PORTB = DISPLAY_CLEAR;
execute();
PORTB = ENTRY_MODE_SET;
execute();
char* c = "Max ";
while(1)
{
int i;
for(i=0; c[i]!='\0'; i++)
{
PORTB = c[i];
execute();
}
_delay_loop_2(32768);
}
return 0;
}