Добрый день.
Может быть проблема связана с выбором страницы знакогенератора.
У меня в индикаторе Мэлт 2 страницы, которые имеют разный набор отображаемых символов.
Поэтому часто было такое, что индикатор отображал то буквы,то иероглифы

После подключения нужной страницы знакогенератора все проблемы с отображением пропали.
Проверьте процедуру инициализации индикатора. Ниже привожу свои процедуры записи кода/данных а также инициалии дисплея и записи в него строковых констант при которой всё работает нормально:
// П/П записи в дисплей комманд или данных
void WriteCode(char CODE)
{
//Процедура выдачи байта в индикатор как команды (+ задержка 40 мкс)
LCD_CTRL_PORT &= (~(1<<A0_LCD)); //Установить A0=0 - выдача команд в индикатор
//записываем старший полубайт
LCD_DATA_PORT=CODE;
//строб защёлкивания старшего полубайта
LCD_CTRL_PORT |=(1<<E_LCD); //Установить E=1 (строб записи в индикатор)
LCD_CTRL_PORT &=(~(1<<E_LCD)); //Установить E=0 (строб записи в индикатор)
//записываем младший полубайт
LCD_DATA_PORT=(CODE<<4);
//строб защёлкивания младшего полубайта
LCD_CTRL_PORT |= (1<<E_LCD); //Установить E=1 (строб записи в индикатор)
LCD_CTRL_PORT &= (~(1<<E_LCD)); //Установить E=0 (строб записи в индикатор)
//задержка на выполнение команды
delay_us(40);
//Только здесь можно снова изменять состояние сигналов R/W и A0 индикатора!
LCD_CTRL_PORT &= (~(1<<A0_LCD)); //Установить A0=0 - выдача команд в индикатор
}
void WriteData(char DATA)
{
//Процедура выдачи байта в индикатор как данные (+ задержка 40 мкс)
LCD_CTRL_PORT = LCD_CTRL_PORT|((1<<A0_LCD)); //Установить A0=0 - выдача команд в индикатор
//записываем старший полубайт
LCD_DATA_PORT=DATA;
//строб защёлкивания старшего полубайта
LCD_CTRL_PORT = LCD_CTRL_PORT|(1<<E_LCD); //Установить E=1 (строб записи в индикатор)
LCD_CTRL_PORT = LCD_CTRL_PORT&(~(1<<E_LCD)); //Установить E=0 (строб записи в индикатор)
//записываем младший полубайт
LCD_DATA_PORT=(DATA<<4);
//строб защёлкивания младшего полубайта
LCD_CTRL_PORT = LCD_CTRL_PORT|(1<<E_LCD); //Установить E=1 (строб записи в индикатор)
LCD_CTRL_PORT = LCD_CTRL_PORT&(~(1<<E_LCD)); //Установить E=0 (строб записи в индикатор)
//задержка на выполнение команды
delay_us(40);
//Только здесь можно снова изменять состояние сигналов R/W и A0 индикатора!
LCD_CTRL_PORT = LCD_CTRL_PORT&(~(1<<A0_LCD)); //Установить A0=0 - выдача команд в индикатор
}
//константы для инициализации дисплея
//очистка индикатора 0b00000001
//delay 1.5 mS
#define DISPLEY_CLEAR 0b00000001
//перемещение курсора в левую позицию 0b00000010
//delay 40 mkS
#define CURSOR_HOME 0b00000010
//установака направления сдвига и разрешение сдвига дисплея 0b000001 I/D SH
//I/D direction
//SH shift enable
//delay 40 mkS
#define DISPLEY_SHIFT_INI 0b00000110
//установка параметров индикатора 0b00001DCB
//D=1 displey on
//C=1 cursor on
//B cursor_type 0-lyne, 1-block
//delay 40 mkS
#define DISPLEY_ON 0b00001111
#define DISPLEY_OFF 0b00001000
//сдвиг дисплея или курсора 0b0001 S/C R/L 00
//S/C displey or cursor
//R/L right left
//delay 40 mkS
#define SHIFT_DISPLEY_L 0b00011000
#define SHIFT_DISPLEY_R 0b00011001
#define SHIFT_CURSOR_L 0b00010000
#define SHIFT_CURSOR_R 0b00010001
//установка разрядности интерфейса и страницы знакогенератора 0b001 DL 10 P 0
//DL 0-4 bits, 1-8 bits
//P page 0 or 1
//delay 40 mkS
#define DATA_LINE4_PAGE0 0b00101000
#define DATA_LINE4_PAGE1 0b00101010
//установка нулевого адреса области DDRAM 0b10000000
//delay 40 mkS
#define START_DDRAM_ADDR 0b10000000
void Displey_ini(void)
{
wdr();
// запрет всех прерываний
cli();
static char temp_LCD_DATA_PORT;
//сохраняет текущее значение порта данных индикатора
temp_LCD_DATA_PORT=LCD_DATA_PORT;
// устанавливаем А0 и Е в 0
LCD_CTRL_PORT = LCD_CTRL_PORT&(~(1<<A0_LCD));
LCD_CTRL_PORT = LCD_CTRL_PORT&(~(1<<E_LCD));
//задержка на 30 ms
delay_ms(30);
//в следующих 4-х командах необходимо защёлкнуть в индикатор только старший полубайт
//записываем старший полубайт
LCD_DATA_PORT=0x30;
//строб защёлкивания старшего полубайта
LCD_CTRL_PORT |= (1<<E_LCD); //Установить E=1 (строб записи в индикатор)
LCD_CTRL_PORT &= (~(1<<E_LCD)); //Установить E=0 (строб записи в индикатор)
//Задержка на 40 mkS
delay_us(40);
//строб защёлкивания старшего полубайта
LCD_CTRL_PORT |= (1<<E_LCD); //Установить E=1 (строб записи в индикатор)
LCD_CTRL_PORT &= (~(1<<E_LCD)); //Установить E=0 (строб записи в индикатор)
//Задержка на 40 mkS
delay_us(40);
//строб защёлкивания старшего полубайта
LCD_CTRL_PORT |= (1<<E_LCD); //Установить E=1 (строб записи в индикатор)
LCD_CTRL_PORT &= (~(1<<E_LCD)); //Установить E=0 (строб записи в индикатор)
//Задержка на 40 mkS
delay_us(40);
LCD_DATA_PORT=0x20;
//строб защёлкивания младшего полубайта
LCD_CTRL_PORT |= (1<<E_LCD); //Установить E=1 (строб записи в индикатор)
LCD_CTRL_PORT &= (~(1<<E_LCD)); //Установить E=0 (строб записи в индикатор)
//Задержка на 40 mkS
delay_us(40);
//в этих командах защёлкиваются оба полубайта
WriteCode(0x08); //Установка параметров индикатора
//Задержка на 40 mkS
delay_us(40);
WriteCode(DISPLEY_CLEAR); //Очистка индикатора
//задержка на 1,5 ms
delay_us(1500);
WriteCode(DISPLEY_SHIFT_INI); //Установка режима ввода данных в область DDRAM
//Задержка на 40 mkS
delay_us(40);
WriteCode(DISPLEY_ON); //Включение дисплея
//Задержка на 40 mkS
delay_us(40);
WriteCode(START_DDRAM_ADDR); //Установка адреса записи (и курсора) в нулевую позицию
//Задержка на 40 mkS
delay_us(40);
WriteCode(DATA_LINE4_PAGE1); // установка разрядности и страницы знакогенератораа
//Задержка на 40 mkS
delay_us(40);
WriteCode(CURSOR_HOME); // Установка курсора в нулевую позицию
//Задержка на 40 mkS
delay_us(40);
//возвращаем начальное значение порта данных индикатора
LCD_DATA_PORT=temp_LCD_DATA_PORT;
}
volatile char DispleyBuffer[32];
//процедура переноса данных из буфера дисплея в память данных дисплея
void WriteDispley(void)
{
wdr();
// запрет всех прерываний
cli();
static char temp_LCD_DATA_PORT;
//сохраняет текущее значение порта данных индикатора
temp_LCD_DATA_PORT=LCD_DATA_PORT;
//производим очистку дисплея
WriteCode(DISPLEY_CLEAR);
//Задержка на 1500 mkS
delay_us(1500);
//устанавливаем начальный адрес записи
WriteCode(START_DDRAM_ADDR);
//Задержка на 40 mkS
delay_us(40);
static char i;
for(i=0;i<32;i++)
{
if(i==16)
{
WriteCode(START_DDRAM_ADDR + 0x40);
//Задержка на 40 mkS
delay_us(40);
};
WriteData(DispleyBuffer[i]);
//Задержка на 40 mkS
delay_us(40);
};
// Установка курсора в нулевую позицию
WriteCode(CURSOR_HOME);
//Задержка на 40 mkS
delay_us(40);
//возвращаем начальное значение порта данных индикатора
LCD_DATA_PORT=temp_LCD_DATA_PORT;
}
//процедура записи курсора в любую позицию
void WriteCursorAnyPosition(char Position)
{
wdr();
// запрет всех прерываний
cli();
static char temp_LCD_DATA_PORT;
//сохраняет текущее значение порта данных индикатора
temp_LCD_DATA_PORT=LCD_DATA_PORT;
if(Position<16)
{
WriteCode(0x80+Position);
}
else
{
WriteCode(0x80+0x30+Position);
};
//возвращаем начальное значение порта данных индикатора
LCD_DATA_PORT=temp_LCD_DATA_PORT;
}
//процедура очистки DispleyBuffer[]
void ClearDispleyBuffer(void)
{
wdr();
// запрет всех прерываний
cli();
static char i;
for(i=0;i<32;i++)
{
DispleyBuffer[i]=' ';
};
}
//процедура записи строковых констант в DispleyBuffer[]
void WriteStringToBuffer(char flash *StringAddress)
{
wdr();
// запрет всех прерываний
cli();
static char i;
static flash char *string;
string=StringAddress;
for(i=0;i<32;i++)
{
DispleyBuffer[i]=*string;
string++;
};
}