antoxa1
Feb 11 2007, 17:05
Доброго времени суток!
В сети я нашел кучу примеров для работы с графическими ЖК индикаторами, посмотрев их, выяснил, что разработчики хранят шрифты в массивах(к примеру):
/* Таблица фонта 8x8 */
const uint8_t font_08x08_table[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00 */
0x7E,0x81,0xA5,0x81,0xBD,0x99,0x81,0x7E, /* 01 */
0x7E,0xFF,0xDB,0xFF,0xC3,0xE7,0xFF,0x7E, /* 02 */
0x6C,0xFE,0xFE,0xFE,0x7C,0x38,0x10,0x00, /* 03 */
0x10,0x38,0x7C,0xFE,............
У меня в программе есть один шрифт размером 6х8, включающий буквы двух алфавитов(RUS и EN) и цифры. В начале этого хватало, но в связи с модернизацией программы всплыла необходимость использовать ещё и некоторые символы размером 12х16 (для улучшения читаемости выводимой информации). На описание ранее приведенным способом всего набора необходимых символов потребуется увеличение объема памяти программ(которой для свободного использования осталось немного). Вопрос мой состоит в следующем: можно-ли используя описание необходимых символов из шрифта 6х8 путем масштабирования получить те же символы но размером 12х16? Какие алгоритмы для этого используются? Где можно посмотреть еще информацию по вопросу? Пользовался ли кто-нибудь такими методами и каково их быстродействие?
P.S. устройство собрано и аппаратной модернизации не подлежит, так что варианты увеличения памяти путем прикручивания дополнительных микросхем не подходят.
zorromen
Feb 11 2007, 18:40
Вывод больших символов вызовет проблемы ... куда большие чем просто шрифт 6х8 ... есть вопрос как еще выводить символы ... в начале каждой страницы или в любом месте ... если только в начале ,то не требуется ничего сдвигать ... то теряется универсальность, что можно рисовать в любом месте ... а так как мало памяти программ то придется написать или универсальную функцию или пересмотреть подход к выводу изображения как таковой ...
Опишите какими ресурсами вы распологаете ... сколько свободного ОЗУ и Флеш-программ...
rx3apf
Feb 11 2007, 18:43
Цитата(antoxa1 @ Feb 11 2007, 17:05)

состоит в следующем: можно-ли используя описание необходимых символов из шрифта 6х8 путем масштабирования получить те же символы но размером 12х16? Какие алгоритмы для этого используются? Где можно посмотреть еще информацию по вопросу? Пользовался ли кто-нибудь такими методами и каково их быстродействие?
Что можно - сомнений нет. Вот только буквы будут очень "квадратные" - точки-то станут вдвое больше по ширине/высоте, и смотреться это будет так себе. Сделать какой-то "умный" конвертор - геморройно, отожрет еще памяти и будет тормозить. А просто тупо увеличить - тривиально, каждый байт превращаем в два (циклом или выборкой по таблице для каждого ниббла - табличка в 16 байтов), и результат выводим дважды (конкретнее - зависит от способа вывода в индикатор).
antoxa1
Feb 11 2007, 19:02
Про железо: ATMega8515(8К flash, 512RAM и немного EEPROMa), на нем висит 4 кнопки +ks0108.
Вывод планируется с любой позиции(причем с набором символов 6х8 он и реализован).
Тебе лучше хранить 12х16 (если хватит памяти), а 6х8 получать масштабированием. Иначе крупный шрифт будет некрасивый.
2antoxa1
вот Вам пример программы.....
http://www.microsyl.com/nokialcd/nokialcd.htmlвыглядят x2 фонты очень даже нормально...
antoxa1
Feb 11 2007, 21:13
А ссылки на примеры реализации или "теорию" кто-нибудь видел? Если да, то поделитесь пожалуйста.
rx3apf
Feb 11 2007, 22:00
Цитата(slog @ Feb 11 2007, 21:00)

Тебе лучше хранить 12х16 (если хватит памяти), а 6х8 получать масштабированием. Иначе крупный шрифт будет некрасивый.
Что совой об пенек, что пеньком об сову... Помимо того, что масштабирование из большого в маленький заведомо более ресурсоемко (это в придачу к вчетверо большему объему фонта), так и у тщательно и любовно прорисованного"большого" фонта при уменьшении запросто "слипнутся" точки или появятся иные искажения. Нет уж, если с программной памятью так плохо, что большой фонт не влезает (а тут пахнет минимумом половиной программной памяти 8515) - тогда просто удваивать по ширине и высоте, и координаты знакомест при выводе удваивать. Это лучше чем ничего. А для мелких индикаторов - насущная необходимость...
Лучше хранить 2 знакогенератора, примеры шрифтов можно посмотреть в UCOS->GUI->FONT.
Для уменьшения объема знакогенератора я делал так: в знакогенераторе прописал все латинские буквы, затем только те русские, которые начертанием отличаются от латинских, при обращении к знакогенератору добавлена перекодировочная таблица КОД ASCII -> позиция символа в знакогенераторе. Если количество надписей ограничено, можно в знакогенераторе оставить только используемые символы - экономия памяти.
antoxa1
Feb 13 2007, 15:01
2el34
Спасибо за ссылку! Помогло!