Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVRLib, графический LCD: как заюзать русский шрифт?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
firetrap
только начинаю юзать си и atmel
в AVRLib есть библиотека для работы с графическим дисплеем,
но в файле font5x7.h только английский шрифт, пробовал дописать туда коды для русских символов - выводит мусор..

описание функции которая выводит символ странное какое-то

Код
void glcdWriteChar(unsigned char c)
{
    u08 i = 0;
    
    for(i=0; i<5; i++)
    {
        glcdDataWrite(pgm_read_byte(&Font5x7[((c - 0x20) * 5) + i]));
    }

    // write a spacer line
    glcdDataWrite(0x00);
    glcdStartLine(0);
}


зачем там умножается на 5?

ЗЫ. пробовал при с >= 0x90 вычитать 0x60 вместо 0x20 - не помогает
спасибо..
SasaVitebsk
Насколько я помню, - там проще не придумаешь.

Возмите бумагу в клеточку и побитово прорисуйте любую английскую букву или цифру. Чтобы понять как она отображается. После чего займитесь русским алфавитом. Для этого прог - уйма.
firetrap
Цитата(SasaVitebsk @ Mar 20 2008, 00:43) *
Насколько я помню, - там проще не придумаешь.

Возмите бумагу в клеточку и побитово прорисуйте любую английскую букву или цифру. Чтобы понять как она отображается. После чего займитесь русским алфавитом. Для этого прог - уйма.


видимо вы не так поняли, коды (по пять байт - шрифт 5x7) русских символов все есть, дело в том что выводится мусор вместо них
mdmitry
Код
зачем там умножается на 5?

смещение в массиве для символа должно быть правильным.
Код
0x20
а печатные символы в таблице ASCII начинается с 0x20 (32)
Кириллица традиционно лежит выше 128 в кодировках
SasaVitebsk
Может кодировка разная. Например в знакогенераторе DOS а в проге - виндовая. Это найболее вероятная причина.
AHTOXA
Ну про 5 байт на символ вроде понятно объяснили:-) Попробую поподробнее про кодировки.
Вот кодировка Windows-1251:
Код
╔══════ ACSII chart (ext) ═══════╗
║           CP: Windows-1251     ║
╟────────────────────────────────╢
║ ☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼║
║ !"#$%&'()*+,-./0123456789:;<=>?║
║@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_║
║`abcdefghijklmnopqrstuvwxyz{|}~⌂║
║__'_":┼╪_%_<_____''""•--_T_>____║
║ Ўў_¤_│§ЁcЄ<┐-RЇ°+___ч¶·ё№є>___ї║
║АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ║
║абвгдежзийклмнопрстуфхцчшщъыьэюя║
╟────────────────────────────────╢


Первая строчка (символы с кодами 0 - 0x1F) - непечатные символы, их выкинули. Поэтому теперь код символа на 0x20 меньше. Это касательно английских буковок. Теперь русские. Пятую и шестую строчки тоже выкинем, там ничего полезного кроме буквы Ё. Но Ё мы прилепим в конце. Итак, русские буквы будут начинаться с кода 0x60, там будет располагаться буква 'А' (0xC0). То есть, при отображении русских букв надо отнимать уже не 0x20, а (0xC0-0x60) = 0x60.
Ё будет иметь код 0xA0, а ё - 0xA1.
Таким образом, процедура вывода символа на дисплей будет выглядеть так:
Код
void glcdWriteChar(unsigned char ch)
{
    int pos;

    if (ch == 'Ё')
        ch = 0xA0;
    else if (ch == 'ё')
        ch = 0xA1;
    else if (ch >= 'A')  // это русская 'А'
        ch -= 0x60;
    else
        ch -= 0x20;
    pos = ch * 5;

    for (ch = 5; ch; ch--)
        glcdDataWrite(pgm_read_byte(&Font5x7[pos++]));

    glcdDataWrite(0);
}


В приложении - файл шрифта.
firetrap
Цитата(AHTOXA @ Mar 20 2008, 23:51) *
Ну про 5 байт на символ вроде понятно объяснили:-) Попробую поподробнее про кодировки.
В приложении - файл шрифта.



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