Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Русские буквы в Hi-tech
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Mad_max
Доброго времени суток.

Озадачился вывести русские буквы на LCD (HD...).
CODE
const unsigned char ruTable [] =
{
'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И',
'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т',
'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ь', 'Ы', 'Ъ',
'Э', 'Ю', 'Я',
'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и',
'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т',
'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ь', 'ы', 'ъ',
'э', 'ю', 'я',
};

const unsigned char LCDSM [] =
{
0x41, 0xA0, 0x42, 0xA1, 0xE0, 0x45, 0xA2, 0xA3, 0xA4, 0xA5,
0xA6, 0x4B, 0xA7, 0x4D, 0x48, 0x4F, 0xA8, 0x50, 0x43, 0x54,
0xA9, 0xAA, 0x58, 0xE1, 0xAB, 0xAC, 0xE2, 0x62, 0xAE, 0xAD,
0xAF, 0xB0, 0xB1,
0x61, 0xB2, 0xB3, 0xB4, 0xE3, 0x65, 0xB5, 0xB6, 0xB7, 0xB8,
0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0x6F, 0xBE, 0x70, 0x63, 0xBF,
0x79, 0xE4, 0x78, 0xE5, 0xC0, 0xC1, 0xE6, 0xC4, 0xC3, 0xC2,
0xC5, 0xC6, 0xC7,
};

unsigned char RuToLCD ( unsigned char sim )
{
unsigned char i;
for ( i = 0; i < sizeof ( ruTable ); i++ )
{
if ( sim == ruTable [ i ] )
return ( LCDSM[ i ] );
}
return ( sim );
}


Сам механизи работает нормально, компилил gcc, все работает.
Hi-tech тоже компилит без ошибок, но вот работать отказывается,
выводит абракадабру.
Не ужто Hi-tech(9.60 std) не понимает русские буквы?
evc
Цитата(Mad_max @ May 13 2009, 20:02) *
...Не ужто Hi-tech(9.60 std) не понимает русские буквы?

Не понимает из-за различий в ASCII таблицах. (кстати буквы эти не "русские", а кириллические) А зачем перебирать каждый раз всю таблицу? Можно сделать и так:
CODE
const unsigned char TEXT[51][5] ={0x00, 0x00, 0x00, 0x00, 0x00, // SPACE
0x00, 0x00, 0x4F, 0x00, 0x00, // !
0x00, 0x03, 0x00, 0x03, 0x00, // "
0x14, 0x3E, 0x14, 0x3E, 0x14, // #
0x3C, 0x42, 0x42, 0x42, 0x24, // $
0x26, 0x16, 0x08, 0x34, 0x32, // %
0x36, 0x49, 0x55, 0x22, 0x50, // &
0x7F, 0x48, 0x48, 0x48, 0x30, // '
0x00, 0x1C, 0x22, 0x41, 0x00, // (
0x00, 0x41, 0x22, 0x1C, 0x00, // )
0x14, 0x08, 0x3E, 0x08, 0x14, // *
0x08, 0x08, 0x3E, 0x08, 0x08, // +
0x00, 0x50, 0x30, 0x00, 0x00, // ,
0x08, 0x08, 0x08, 0x08, 0x08, // -
0x00, 0x60, 0x60, 0x00, 0x00, // .
0x20, 0x10, 0x08, 0x04, 0x02, // /
0x3E, 0x51, 0x49, 0x45, 0x3E, // 0
0x04, 0x02, 0x7F, 0x00, 0x00, // 1
0x42, 0x61, 0x51, 0x49, 0x46, // 2
0x22, 0x41, 0x49, 0x49, 0x36, // 3
0x18, 0x14, 0x12, 0x12, 0x7F, // 4
0x4F, 0x49, 0x49, 0x49, 0x31, // 5
0x3E, 0x49, 0x49, 0x49, 0x32, // 6
0x01, 0x01, 0x71, 0x09, 0x07, // 7
0x36, 0x49, 0x49, 0x49, 0x36, // 8
0x26, 0x49, 0x49, 0x49, 0x3E, // 9
0x00, 0x36, 0x36, 0x00, 0x00, // :
0x00, 0x56, 0x36, 0x00, 0x00, //;
0x08, 0x14, 0x22, 0x41, 0x00, // <
0x14, 0x14, 0x14, 0x14, 0x14, // =
0x7F, 0x08, 0x3E, 0x41, 0x3E, // Ю >
0x02, 0x01, 0x51, 0x09, 0x06, // ?
0x3E, 0x41, 0x59, 0x55, 0x5E, // @
0x7E, 0x09, 0x09, 0x09, 0x7E, // A
0x7F, 0x49, 0x49, 0x49, 0x31, // B
0x3F, 0x20, 0x20, 0x3F, 0x60, // C
0x7E, 0x21, 0x21, 0x3E, 0x60, // D
0x7F, 0x49, 0x49, 0x49, 0x41, // E
0x7F, 0x09, 0x09, 0x09, 0x01, // F
0x7F, 0x01, 0x01, 0x01, 0x01, // G
0x7F, 0x08, 0x08, 0x08, 0x7F, // H
0x7F, 0x20, 0x10, 0x08, 0x7F, // I
0x77, 0x08, 0x7F, 0x08, 0x77, // J
0x7F, 0x08, 0x14, 0x22, 0x41, // K
0x70, 0x08, 0x04, 0x02, 0x7F, // L
0x7F, 0x02, 0x0C, 0x02, 0x7F, // M
0x7F, 0x08, 0x08, 0x08, 0x7F, // N
0x3E, 0x41, 0x41, 0x41, 0x3E, // O
0x7F, 0x01, 0x01, 0x01, 0x7F, // P
0x76, 0x09, 0x09, 0x09, 0x7F}; // Q


const unsigned char TEXT2[46][5]={0x7F, 0x09, 0x09, 0x09, 0x06,// R
0x3E, 0x41, 0x41, 0x41, 0x22, // S
0x01, 0x01, 0x7F, 0x01, 0x01, // T
0x27, 0x48, 0x48, 0x48, 0x3F, // U
0x7F, 0x49, 0x49, 0x49, 0x36, // V
0x7F, 0x20, 0x11, 0x08, 0x7F, // Й
0x41, 0x22, 0x1C, 0x22, 0x41, // X
0x07, 0x08, 0x70, 0x08, 0x07, // Y
0x61, 0x51, 0x49, 0x45, 0x43, // Z
0x7F, 0x48, 0x70, 0x00, 0x7F, // Ы [
0x0F, 0x10, 0x10, 0x10, 0x7F, // обр. черта
0x22, 0x49, 0x49, 0x49, 0x3E, // Э ]
0x04, 0x02, 0x01, 0x02, 0x04, // ^
0x0F, 0x10, 0x10, 0x10, 0x7F, // Ч _
0x00, 0x0C, 0x12, 0x12, 0x0C, // `
0x20, 0x54, 0x54, 0x54, 0x78, // a
0x7F, 0x44, 0x44, 0x44, 0x38, // b
0x38, 0x44, 0x44, 0x44, 0x44, // c
0x38, 0x44, 0x44, 0x44, 0x7F, // d
0x38, 0x54, 0x54, 0x54, 0x18, // e
0x04, 0x04, 0x7E, 0x05, 0x05, // f
0x08, 0x54, 0x54, 0x54, 0x3C, // g
0x7F, 0x08, 0x04, 0x04, 0x78, // h
0x00, 0x44, 0x7D, 0x40, 0x00, // i
0x20, 0x40, 0x44, 0x3D, 0x00, // j
0x7F, 0x10, 0x28, 0x44, 0x00, // k
0x00, 0x41, 0x7F, 0x40, 0x00, // l
0x7C, 0x04, 0x78, 0x04, 0x78, // m
0x7C, 0x08, 0x04, 0x04, 0x78, // n
0x38, 0x44, 0x44, 0x44, 0x38, // o
0x7C, 0x14, 0x14, 0x14, 0x08, // p
0x08, 0x14, 0x14, 0x14, 0x7C, // q
0x00, 0x7C, 0x08, 0x04, 0x04, // r
0x48, 0x54, 0x54, 0x54, 0x20, // s
0x04, 0x04, 0x3F, 0x44, 0x44, // t
0x3C, 0x40, 0x40, 0x20, 0x7C, // u
0x1C, 0x20, 0x40, 0x20, 0x1C, // v
0x3C, 0x40, 0x30, 0x40, 0x3C, // w
0x44, 0x28, 0x10, 0x28, 0x44, // x
0x0C, 0x50, 0x50, 0x50, 0x3C, // y
0x44, 0x64, 0x54, 0x4C, 0x44, // z
0x00, 0x08, 0x36, 0x41, 0x41, // {
0x00, 0x00, 0x7F, 0x00, 0x00, // |
0x41, 0x41, 0x36, 0x08, 0x00, // }
0x02, 0x01, 0x02, 0x04, 0x02,// ~
0x3E, 0x5D, 0x55, 0x55, 0x3E};//CW

void lcd_text57(unsigned char x, unsigned char y, const unsigned char * textptr, unsigned char color){
static unsigned char j;
j = 0;
while (*textptr != 0){
lcd_symb(x + j, y, *textptr, color);
j += 5;
lcd_byte(0, x + j, y, color);
textptr += 1;
j += 1;
}
}
void lcd_symb(unsigned char x, unsigned char y, unsigned char s, unsigned char color){
static unsigned char l, t;
for (l = 0; l < 5; l++){
if (s < 'R'){
t = s - ' ';
lcd_byte(TEXT[t][l], x + l, y, color);
}
else if (s <= '~'){
t = s - 'R';
lcd_byte(TEXT2[t][l], x + l, y, color);
}
else lcd_byte(TEXT[0][l], x + l, y, color);
}
}


подменив (там, где нужно) латинские буквы кириллическими.
Andrey_M
А зачем выводить буквы отдельно? Я обычно поступаю так:

const char privet [ ] = {"Привет"};
unsigned char buff [16];
sprintf (buff, privet);

остается организовать вывод потока на индикатор.
XVR
Вы в курсе, что у LCD кодировка русских букв НЕ СОВПАДАЕТ ни с одной кодировкой этих букв из мира PC? Да и буквы там далеко не все. Так что если просто записать в индикатор нечто русское, то получится нечто неопределенное.
SysRq
Цитата(XVR @ May 15 2009, 13:06) *
у LCD кодировка русских букв НЕ СОВПАДАЕТ ни с одной кодировкой этих букв из мира PC

Ну! Не стоит так категорично. Вполне распространены 866 (OEM), KOI-8. Даже ANSI-1251 попадаются...
XVR
Цитата(SysRq @ May 15 2009, 14:44) *
Ну! Не стоит так категорично. Вполне распространены 866 (OEM), KOI-8. Даже ANSI-1251 попадаются...
Хорошо, перефразирую - у случайно взятого LCD индикатора кодировка русских букв будет случайной (или ее вообще не будет) laughing.gif
SysRq
Цитата(XVR @ May 15 2009, 16:15) *
у случайно взятого LCD индикатора кодировка русских букв будет случайной (или ее вообще не будет)

lol.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.