firetrap 0 19 марта, 2008 Опубликовано 19 марта, 2008 · Жалоба только начинаю юзать си и 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 - не помогает спасибо.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 19 марта, 2008 Опубликовано 19 марта, 2008 · Жалоба Насколько я помню, - там проще не придумаешь. Возмите бумагу в клеточку и побитово прорисуйте любую английскую букву или цифру. Чтобы понять как она отображается. После чего займитесь русским алфавитом. Для этого прог - уйма. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firetrap 0 20 марта, 2008 Опубликовано 20 марта, 2008 · Жалоба Насколько я помню, - там проще не придумаешь. Возмите бумагу в клеточку и побитово прорисуйте любую английскую букву или цифру. Чтобы понять как она отображается. После чего займитесь русским алфавитом. Для этого прог - уйма. видимо вы не так поняли, коды (по пять байт - шрифт 5x7) русских символов все есть, дело в том что выводится мусор вместо них Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 20 марта, 2008 Опубликовано 20 марта, 2008 · Жалоба зачем там умножается на 5? смещение в массиве для символа должно быть правильным. 0x20 а печатные символы в таблице ASCII начинается с 0x20 (32) Кириллица традиционно лежит выше 128 в кодировках Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 20 марта, 2008 Опубликовано 20 марта, 2008 · Жалоба Может кодировка разная. Например в знакогенераторе DOS а в проге - виндовая. Это найболее вероятная причина. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 20 марта, 2008 Опубликовано 20 марта, 2008 · Жалоба Ну про 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firetrap 0 21 марта, 2008 Опубликовано 21 марта, 2008 · Жалоба Ну про 5 байт на символ вроде понятно объяснили:-) Попробую поподробнее про кодировки. В приложении - файл шрифта. Большое спасибо, теперь всё понятно, и заработало наконец Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться