Сделал свой конвертор русских букв внутри контроллера. Применяю дисплей для отладки, поэтому памяти не жалко.
Конвертор работает, все хорошо.
Вот такой код работает:
- Код: Выделить всё • Развернуть
- #include <mega32.h>
 #asm
 .equ __lcd_port=0x15 ;PORTC
 #endasm
 #include <lcd.h>
 char *rus_encode(char *text)
 {
 char *alfavite = "ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁйцукенгшщзхъфывапролджэячсмитьбюё";
 char rus_lcd[]={0xA6, 0xE1, 0xA9, 0x4B, 0x45, 0x48, 0xA1, 0xAC, 0xE2, 0xA4, 0x58, 0xAD,
 0xAA, 0xAE, 0x42, 0x41, 0xA8, 0x50, 0x4F, 0xA7, 0xE0, 0xA3, 0xAF,
 0xB1, 0xAB, 0x43, 0x4D, 0xA5, 0x54, 0x62, 0xA0, 0xB0, 0xA2,
 
 0xB9, 0xE5, 0x79, 0xBA, 0x65, 0xBD, 0xB4, 0xC1, 0xE6, 0xB7, 0xD5, 0xC2,
 0xE4, 0xC3, 0xB3, 0x61, 0xBE, 0x70, 0x6F, 0xBB, 0xE3, 0xB6, 0xC5,
 0xC7, 0xC0, 0x63, 0xBC, 0xB8, 0xBF, 0xC4, 0xB2, 0xC6, 0xA2};
 unsigned char i,r;
 for(i=0; text[i]!=0; i++)
 {
 r=0;
 while(r<sizeof(rus_lcd) && text[i] != alfavite[r]) r++;
 if(r!=sizeof(rus_lcd)) text[i] = rus_lcd[r];
 }
 return(text);
 }
 void main(void)
 {
 PORTA=0x00; DDRA=0x00;
 PORTB=0x00; DDRB=0x08;
 PORTD=0x00; DDRD=0x80;
 lcd_init(16);
 lcd_clear();
 lcd_gotoxy(0, 0);
 lcd_puts(rus_encode("Пример"));
 }
Теперь если немного изменить последние строчки:
- Код: Выделить всё • Развернуть
- while(1)
 {
 lcd_gotoxy(0, 0);
 lcd_puts(rus_encode("Пример"));
 }
То при первом проходе цикла все нормально, а начиная со второго часть букв заменяется на "ё"
Т.е. выводится : ёрёвет
при этом если написать таК:
- Код: Выделить всё • Развернуть
- lcd_gotoxy(0, 0);
 lcd_puts(rus_encode("Пример"));
 lcd_gotoxy(0, 0);
 lcd_puts(rus_encode("Пример"));
То все ок.
Я уже не знаю в чем проблема.
Саму функцию перекодировки можете не проверять, она может и не оптимальна, но она работает как часы.
Но только когда нет циклов, когда вывод происходит внутри цикла, получается какая то фигня.



 
 

 Вот я тормоз.
 Вот я тормоз.