|
ЖКИ на основе SED1520, как рисовать правильно? |
|
|
|
Apr 24 2009, 07:49
|
Группа: Участник
Сообщений: 11
Регистрация: 9-02-09
Пользователь №: 44 597

|
Никак не соображу как лучше рисовать символы. Сейчас работаю следующим образом: 1. Есть массив, в котором лежат все символы в виде {0x00, 0xFF, 0xFF, 0xAA, 0x84, 0xFF и т.д.}. Символ размером 8x6(высота, ширина). То есть для 10 символов получается массив из 60 байт. 2. Есть массив структур. В структуре лежит сам символ и индекс, с которого этот символ начинается в массиве описанном выше. При вызове функции вывода символа на экран (например printf('A')), ищу в массиве структур нужный мне символ, беру из этой структуры индекс, с которого начинается символ в массиве и последовательно вывожу 6 байт символа. Может кто-нибудь знает способ проще и быстрее?
|
|
|
|
|
 |
Ответов
|
Apr 24 2009, 10:58
|
Группа: Участник
Сообщений: 11
Регистрация: 9-02-09
Пользователь №: 44 597

|
Цитата(Сергей Борщ @ Apr 24 2009, 14:07)  Раз размер символов фиксирован - достаточно умножить код символа на размер и прибавить к адресу начала массива. "код символа" - имеется ввиду ascii-код? Если да, то для массива в котором хранятся цифры 0-9 и буквы А-Я(в порядке возрастания кодов) нужно будет сделать одну промежуточную операцию: если рисуем цифру, то из кода символа нужно вычесть код '0', а если букву, то вычесть код 'А'. Затем уже умножаем получившееся число на размер символа - это и есть индекс начала символа в массиве. Или я не прав?
|
|
|
|
|
Apr 24 2009, 11:17
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(HasuMan @ Apr 24 2009, 13:58)  "код символа" - имеется ввиду ascii-код? Если да, то для массива в котором хранятся цифры 0-9 и буквы А-Я(в порядке возрастания кодов) нужно будет сделать одну промежуточную операцию: если рисуем цифру, то из кода символа нужно вычесть код '0', а если букву, то вычесть код 'А'. Затем уже умножаем получившееся число на размер символа - это и есть индекс начала символа в массиве. Или я не прав? Заполните всю кодовую таблицу для 256 символов, цифры и буквы уравняются в правах  Тогда не нужно ничего анализировать. Чуть больше места в памяти, но будет быстрее работать. А если сделать матрицу 8*8 (все равно нужны промежутки между символами), расположить таблицу по адресу с 11 младшими нулевыми разрядами и заменить перемножение на сдвиг и логическое сложение, все будет просто летать, как на Пентиуме
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Apr 24 2009, 11:41
|
Группа: Участник
Сообщений: 11
Регистрация: 9-02-09
Пользователь №: 44 597

|
Цитата(Dog Pawlowa @ Apr 24 2009, 15:17)  А если сделать матрицу 8*8 (все равно нужны промежутки между символами), расположить таблицу по адресу с 11 младшими нулевыми разрядами и заменить перемножение на сдвиг и логическое сложение, все будет просто летать, как на Пентиуме  Сам хотел сделать 8*8, но экрана не хватит для всей информации  Размер экрана 120*32, разница в 5 символов получается. А что значит "расположить таблицу по адресу с 11 младшими нулевыми разрядами"? То есть положить в память, например по адресу 0x800? PS. пишу на Си под msp430
|
|
|
|
|
Apr 24 2009, 12:59
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(HasuMan @ Apr 24 2009, 14:41)  А что значит "расположить таблицу по адресу с 11 младшими нулевыми разрядами"? То есть положить в память, например по адресу 0x800? PS. пишу на Си под msp430 Если 8 байтов не получается, то тогда нет смысла, остается умножение: Код unsigned char * a = table_pointer+ ((unsigned int) my_char)*6; SendToLcd(*a); a++; SendToLcd(*a); a++; SendToLcd(*a); a++; SendToLcd(*a); a++; SendToLcd(*a); a++; SendToLcd(*a); a++; Сделайте SendToLcd() pragma inline forced, и будет максимальное быстродействие.
--------------------
Уходя, оставьте свет...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|