Перейти к содержанию
    

AVRLib, графический LCD: как заюзать русский шрифт?

только начинаю юзать си и 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 - не помогает

спасибо..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насколько я помню, - там проще не придумаешь.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насколько я помню, - там проще не придумаешь.

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

смещение в массиве для символа должно быть правильным.

0x20

а печатные символы в таблице ASCII начинается с 0x20 (32)

Кириллица традиционно лежит выше 128 в кодировках

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может кодировка разная. Например в знакогенераторе DOS а в проге - виндовая. Это найболее вероятная причина.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну про 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);
}

 

В приложении - файл шрифта.

font_5x7_win1251.inc.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну про 5 байт на символ вроде понятно объяснили:-) Попробую поподробнее про кодировки.

В приложении - файл шрифта.

 

 

Большое спасибо, теперь всё понятно, и заработало наконец :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...