Модель дисплея в Протеусе может без проблем выводить "наши" буквы так же как и "ненаши". Откройте документацию на дисплей и посмотрите таблицу символов, вот они:

а таблица перекодировки из ANSI вот такая:
Код: Выделить всё
const uint8_t ruscode[] = {0x41, 0xA0, 0x42, 0xA1, 0xE0, 0x45, 0xA3, 0xA4,
0xA5, 0xA6, 0x4B, 0xA7, 0x4D, 0x48, 0x4F, 0xA8,
0x50, 0x43, 0x54, 0xA9, 0xAA, 0x58, 0xE1, 0xAB,
0xAC, 0xE2, 0xAD, 0xAE, 0x62, 0xAF, 0xB0, 0xB1,
0x61, 0xB2, 0xB3, 0xB4, 0xE3, 0x65, 0xB6, 0xB7,
0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0x6F, 0xBE,
0x70, 0x63, 0xBF, 0x79, 0xE4, 0x78, 0xE5, 0xC0,
0xC1, 0xE6, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7};
Соответственно ф-ция вывода на дисплей такова:
Код: Выделить всё
/** -------------------------------------------------------
* @brief Вывод символов на дисплей в строку.
* @param line - номер строки (0, 1, 2 , 3)
* @param pos - номер позиции (0 - 20)
* @param *buf - буфер данных
* @param size - число выводимых символов
* @param transcode - запрос перекодировки
*/
void HD44780_Print(uint8_t line, uint8_t pos,
char *buf, uint8_t size, uint8_t transcode)
{
uint8_t addr;
uint8_t ch;
switch(line){
case 0: addr = (DDRAM_ADDR | 0) + pos; break;
case 1: addr = (DDRAM_ADDR | 0x40) + pos; break;
case 2: addr = (DDRAM_ADDR | 0x10) + pos; break;
case 3: addr = (DDRAM_ADDR | 0x50) + pos; break;
}
/* установка начального адреса */
WAIT();
HD44780_IO_Write(addr, HD44780_CMDMODE);
/* вывод символов */
while(size--)
{
/* перекодировка по запросу */
if(transcode)
{
switch(*buf){
case 'А'...'Я': ch = ruscode[*buf - 'А'];
break;
case 'а'...'я': ch = ruscode[*buf - 'а' + 32];
break;
case 'Ё': ch = 0xA2;
break;
case 'ё': ch = 0xB5;
break;
default: ch = *buf;
break;
}
}else
ch = *buf;
WAIT();
HD44780_IO_Write(ch, HD44780_DATAMODE);
buf++;
}
}