Сделал свой конвертор русских букв внутри контроллера. Применяю дисплей для отладки, поэтому памяти не жалко.
Конвертор работает, все хорошо.
Вот такой код работает:
- Код: Выделить всё • Развернуть
#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("Пример"));
То все ок.
Я уже не знаю в чем проблема.
Саму функцию перекодировки можете не проверять, она может и не оптимальна, но она работает как часы.
Но только когда нет циклов, когда вывод происходит внутри цикла, получается какая то фигня.