реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> AVRLib, графический LCD: как заюзать русский шрифт?
firetrap
сообщение Mar 19 2008, 19:47
Сообщение #1





Группа: Новичок
Сообщений: 8
Регистрация: 5-03-08
Пользователь №: 35 650



только начинаю юзать си и 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 - не помогает
спасибо..
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 19 2008, 21:43
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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

Возмите бумагу в клеточку и побитово прорисуйте любую английскую букву или цифру. Чтобы понять как она отображается. После чего займитесь русским алфавитом. Для этого прог - уйма.
Go to the top of the page
 
+Quote Post
firetrap
сообщение Mar 20 2008, 14:20
Сообщение #3





Группа: Новичок
Сообщений: 8
Регистрация: 5-03-08
Пользователь №: 35 650



Цитата(SasaVitebsk @ Mar 20 2008, 00:43) *
Насколько я помню, - там проще не придумаешь.

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


видимо вы не так поняли, коды (по пять байт - шрифт 5x7) русских символов все есть, дело в том что выводится мусор вместо них
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Mar 20 2008, 16:14
Сообщение #4


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



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

смещение в массиве для символа должно быть правильным.
Код
0x20
а печатные символы в таблице ASCII начинается с 0x20 (32)
Кириллица традиционно лежит выше 128 в кодировках


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 20 2008, 17:52
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Может кодировка разная. Например в знакогенераторе DOS а в проге - виндовая. Это найболее вероятная причина.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 20 2008, 20:51
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Ну про 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.73 килобайт ) Кол-во скачиваний: 387
 


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
firetrap
сообщение Mar 21 2008, 07:48
Сообщение #7





Группа: Новичок
Сообщений: 8
Регистрация: 5-03-08
Пользователь №: 35 650



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



Большое спасибо, теперь всё понятно, и заработало наконец biggrin.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 14th July 2025 - 12:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01393 секунд с 7
ELECTRONIX ©2004-2016