Рабочий код, исправно инициализирует самые разные контроллеры.
Макросы поправьте под свою схему.
Код
#define SET_RS (PORTB |= BIT(4))
#define CLR_RS (PORTB &= ~BIT(4))
#define SET_E (PORTB |= BIT(5))
#define CLR_E (PORTB &= ~BIT(5))
#define WRITE_LOW_NIBBLE(x) ( PORTD = (PORTD & 0x0F) | ((x) << 4) )
#define WRITE_HIGH_NIBBLE(x) ( PORTD = (PORTD & 0x0F) | ((x) & 0xF0) )
...
#define MKS_BYTE 40 /* время на передачу байта на дисплей */
...
void WriteToDisplay(byte value) {
SET_E;
WRITE_HIGH_NIBBLE(value);
CLR_E;
SET_E;
WRITE_LOW_NIBBLE(value);
CLR_E;
}
void WriteDelayed(byte value) {
WriteToDisplay(value);
delay_us(MKS_BYTE);
}
void UpdateDisplay() {
//memset(screen,' ',N_SYM_IN_DISP);
CLR_RS;
WriteDelayed(0x01);
delay_us(1800);
}
void InitDisplay(void) { //4.88 мс
CLR_RS;
WriteDelayed(0x33);
WriteDelayed(0x32);
WriteDelayed(0x28); //4-битный интерфейс, 2 строки, шрифт-5х7 точек
WriteDelayed(0x0c); //включить дисплей, выключить курсор
WriteDelayed(0x06); //Курсор сдвигается вправо при записи, дисплей стоит на месте
UpdateDisplay(); //очистить дисплей
}