STM32: Библиотека подключения дисплеев Nokia 3310, 5110
|
|
ВитГо | Дата: Понедельник, 11.02.2013, 05:13 | Сообщение # 1 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Некоторое время назад написал библиотеку подключения дисплеев Nokia 3310\5110 для микроконтроллеров STM32F4
писал на Cи в среде Coocox
В архиве два варианта библиотеки: 1. soft-SPI 2. hard-SPI
второй вариант, использующий аппаратный SPI, можно попробовать настроить на работу через DMA
STM32F4: Библиотека подключения LCD с контроллером PCD8544 (Nokia 3310, 5110)
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Понедельник, 01.04.2013, 08:56 | Сообщение # 2 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| по просьбе одного из посетителей сайта была написана библиотека подключения дисплея для STM32F10x
работа библиотеки проверена на STM32 VL Discovery
STM32F10x: Подключение PCD8544 (NOKIA 3310, 5110)
Виталий (аka ВитГо)
|
|
| |
v1ct0r | Дата: Вторник, 03.09.2013, 08:18 | Сообщение # 3 |
Рядовой
Группа: Проверенные
Сообщений: 6
Статус: Offline
| Виталий, добрый день! Спасибо за библиотеку, после небольшого допила работает в Keil. Не могли бы Вы мне помочь прикрутить большой шрифт? Что (и где :)) нужно поменять? Шрифт, в данный момент, 12х16. Ковыряю функцию lcd8544_putchar(). footpointer и ch - понятно. lcd_YP=7- (py & 0x07); // Cмысла, увы не понимаю lcd_YC=(py & 0xF8)>>3; // Эту строку тоже не понимаю.. temp&=0x7F; - тоже не понятно... Также не понимаю строки печати верхней и нижней частей символа..
Заранее спасибо!
Сообщение отредактировал v1ct0r - Вторник, 03.09.2013, 11:57 |
|
| |
ВитГо | Дата: Вторник, 03.09.2013, 17:22 | Сообщение # 4 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| ну начать нужно с вашего знакогенератора !
как в нем представлены символы ? уже есть файл знакогенератора для экспериментов ?
Виталий (аka ВитГо)
|
|
| |
v1ct0r | Дата: Вторник, 03.09.2013, 18:23 | Сообщение # 5 |
Рядовой
Группа: Проверенные
Сообщений: 6
Статус: Offline
| В смысле файл со шрифтами? Я руками написал, не нашел генератор, который бы 16х12 делал. По подобию приложенного к библиотеке сделал. В общем уже дописал две функции, работают, только координаты по Y кратно 8 пикселам задавать получается. Не разобрался с теми строчками, где маски накладываются..
|
|
| |
ВитГо | Дата: Вторник, 03.09.2013, 20:28 | Сообщение # 6 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| ок, с попиксельным выводом все достаточно просто..
представь что у тебя строки идут по байтно сверху вниз (2 байта) в порядке бит (в принципе если ты знаешь как символ рисуется на ЖКИ то это как раз один столбец ЖКИ экрана.. ну даже не один столбец а первые 16 строк первого столбца :-) 7 + 6 | 5 | 4 | 3 +--- это как раз первый байт, пиксельные строки с 0 по 7 2 | 1 | 0 + 7 + 6 | 5 | 4 | 3 +--- это второй байт, пиксельные строки с 8 по 15 2 | 1 | 0 +
это понятно? обычно ты определяешь адрес первого байта и выводишь в него символ по байтно (если символ имеет не более 8 пикселов в высоту) - надеюсь как найти столбец для вывода ты понимаешь..
а теперь посмотри что нужно сделать если нужно выводить попиксельно (первый столбец это бит байта, второй столбец это бит символа для вывода) 7 + 6 | 5 | 4 7 | + 3 6 +----- это первые восемь строк экрана 2 5 | | 1 4 | | 0 3 + +----- а это наш символ с третьей строки 7 2 | 6 1 | 5 0 + 4 3 2 1 0
получается что верхний (7) бит первого байта экрана - это нулевой пиксель по вертикали, шестой бит - первый пиксель и так далее, следовательно символ мы выводим с 3ей пиксельной строки соответственно байт для вывода символа нужно сдвинуть вправо на 3 позиции (чтобы 7ой бит символа оказался в 4ом бите строки) - этот полученный байт накатываем на строку текущую.. а в следующей строке мы наоборот наш символ сдвинем влево на те же 5 (8-3) позиций чтобы второй бит оказался на месте 7го бита второго байта экрана вот в принципе и весь алгоритм вывода..
плюсы его в том что символ рисуется как бы побайтно а не попиксельно как делает большинство - прирост в скорости огромный.. да и код вроде не такой уж и сложный получился
теперь к твоем случаю: получается что тебе сдвигать придется не 1 а 2 байта (16 точек по вертикали !) ниже я вывожу символ со второй пиксельной строки экрана 7 6 5 7 4 6 3 5 2 4 1 3 0 2 7 1 6 0 5 7 4 6 3 5 2 4 1 3 0 2 7 1 6 0 5 4 3 2 1 0
несмотря на кажущуюся сложность - порядок тот же !! просто как бы рисуем два символа одновременно !! просто один в координатах x, y, а другой в координатах x, y+8 у тебя одна задача: сделать свой знакогенератор, и написать код который будет доставать части символа для первого вывода (в координатах x,y) и второй части для координат x, y+8
теперь про код
сдвиг на 3 позиции вправо - это и есть деление на 8 это нужно для того чтобы из пиксельной позиции по вертикали вычислить байтовую строку например тебе нужно вывести строки в координате по вертикали с 33 строки в двоичном виде это 10 0001 теперь двигаем это значение на 3 позиции вправо: получаем 100 или 4 в десятичном виде.. то есть ты должен выводить символ в 4ой байтовой строке по вертикали (это как раз 32ая пиксельная строка)
теперь нужно посчитать с какого пиксела нужно начать вывод в нашей 4ой байтовой строке для этого мы из 7 (число бит в байте - 1) вычитаем 001 (это как раз то что сдвинули за пределы байта)... и получаем 6 - это как раз бит с которого нужно сделать вывод !!! вот тебе и две операции:
КоординатаYCимвольная=YПиксельнаяДляВывода >> 3 КоординатаYPixельная=7-(YПиксельнаяДляВывода & 0x07)
я в коде эксперементировал, и не уточнял команда СИ >> циклически сдвигает или нет, поэтому перед сдвигом на всякий случай обнулял 3 младших бита и получил конструкцию: КоординатаYCимвольная = (YПиксельнаяДляВывода & 0xF8) >> 3
вот и вся кухня в подготовке к выводу символа...
|
|
| |
v1ct0r | Дата: Среда, 04.09.2013, 07:06 | Сообщение # 7 |
Рядовой
Группа: Проверенные
Сообщений: 6
Статус: Offline
| Цитата КоординатаYCимвольная=YПиксельнаяДляВывода >> 3 КоординатаYPixельная=7-(YПиксельнаяДляВывода & 0x07) С этим теперь предельно понятно, спасибо! Разбираюсь с выводом
UPD Получилось так, вроде работает! Код for (x=0; x<12; x++) { temp=*(fontpointer+ch*24+x); lcd8544_buff[lcd_YC*84+px]=temp<<(7-lcd_YP); lcd8544_buff[(lcd_YC+1)*84+px]=temp>>(lcd_YP+1); temp=*(fontpointer+ch*24+x+12); lcd8544_buff[(lcd_YC+1)*84+px]=lcd8544_buff[(lcd_YC+1)*84+px] | (temp<<(7-lcd_YP)); if (lcd_YP<7) lcd8544_buff[(lcd_YC+2)*84+px]=temp>>(lcd_YP+1); px++; if (px>83) return; }
Еще раз спасибо!
Сообщение отредактировал v1ct0r - Среда, 04.09.2013, 09:15 |
|
| |
ВитГо | Дата: Среда, 04.09.2013, 21:23 | Сообщение # 8 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| выкладывай новый текст библиотеки и знакогенератор (если не жалко конечно) ! заодно может быть что с оптимизируем еще внутри...
Виталий (аka ВитГо)
|
|
| |
v1ct0r | Дата: Четверг, 05.09.2013, 07:37 | Сообщение # 9 |
Рядовой
Группа: Проверенные
Сообщений: 6
Статус: Offline
| Вообще не жалко Добавил 3 функции: lcd8544_clear() lcd8544_putdchar() lcd8544_ddec()
font.h - цифры 16х12
Keil - не понимает запись вида 0bxxxx, перевел в десятичный, и требует объявления функций и переменных до первого мат. действия. Вроде все..
|
|
| |
ВитГо | Дата: Пятница, 06.09.2013, 05:35 | Сообщение # 10 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| в выходные гляну !
Виталий (аka ВитГо)
|
|
| |
v1ct0r | Дата: Пятница, 06.09.2013, 07:22 | Сообщение # 11 |
Рядовой
Группа: Проверенные
Сообщений: 6
Статус: Offline
| Хочу еще переписать, чтоб stm32f10x_gpio не использовать.
Сообщение отредактировал v1ct0r - Пятница, 06.09.2013, 07:25 |
|
| |
ВитГо | Дата: Суббота, 07.09.2013, 05:38 | Сообщение # 12 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| а смысл ? можно и на ассемблер перейти..
но в итоге в большом проекте все равно начинаешь использовать стандартную библиотеку...
я тоже вначале стремился к максимальной эффективности кода, и даже на асме писал - но более менее крупный проект становиться практически не читаемым :-(
Виталий (аka ВитГо)
|
|
| |
v1ct0r | Дата: Вторник, 10.09.2013, 14:55 | Сообщение # 13 |
Рядовой
Группа: Проверенные
Сообщений: 6
Статус: Offline
| Да, вероятно ты прав...Оставлю как есть.
|
|
| |