Четверг, 28.11.2024, 03:59
Вы вошли как Гость | Группа "Гости"Приветствую Вас Гость | RSS
Главная | STM32: Библиотека подключения дисплеев Nokia 3310, 5110 - Форум | Мой профиль | Регистрация | Выход | Вход
Обитель RC-инженера
Форма входа
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ВитГо  
STM32: Библиотека подключения дисплеев Nokia 3310, 5110
ВитГоДата: Понедельник, 11.02.2013, 05:13 | Сообщение # 1
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: 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
Репутация: 20
Статус: Offline
по просьбе одного из посетителей сайта была написана библиотека подключения дисплея для STM32F10x

работа библиотеки проверена на STM32 VL Discovery

STM32F10x: Подключение PCD8544 (NOKIA 3310, 5110)


Виталий (аka ВитГо)
 
v1ct0rДата: Вторник, 03.09.2013, 08:18 | Сообщение # 3
Рядовой
Группа: Проверенные
Сообщений: 6
Репутация: 0
Статус: Offline
Виталий, добрый день!
Спасибо за библиотеку, после небольшого допила работает в Keil.
Не могли бы Вы мне помочь прикрутить большой шрифт? Что (и где :)) нужно поменять?
Шрифт, в данный момент, 12х16. Ковыряю функцию lcd8544_putchar().
footpointer и ch - понятно.
lcd_YP=7- (py & 0x07); // Cмысла, увы не понимаю sad
lcd_YC=(py & 0xF8)>>3; // Эту строку тоже не понимаю.. sad
temp&=0x7F; - тоже не понятно...
Также не понимаю строки печати верхней и нижней частей символа..

Заранее спасибо!


Сообщение отредактировал v1ct0r - Вторник, 03.09.2013, 11:57
 
ВитГоДата: Вторник, 03.09.2013, 17:22 | Сообщение # 4
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
ну начать нужно с вашего знакогенератора !

как в нем представлены символы ?
уже есть файл знакогенератора для экспериментов ?


Виталий (аka ВитГо)
 
v1ct0rДата: Вторник, 03.09.2013, 18:23 | Сообщение # 5
Рядовой
Группа: Проверенные
Сообщений: 6
Репутация: 0
Статус: Offline
В смысле файл со шрифтами? Я руками написал, не нашел генератор, который бы 16х12 делал.
По подобию приложенного к библиотеке сделал. В общем уже дописал две функции, работают, только координаты по Y кратно 8 пикселам задавать получается. Не разобрался с теми строчками, где маски накладываются..
 
ВитГоДата: Вторник, 03.09.2013, 20:28 | Сообщение # 6
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: 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
Репутация: 0
Статус: Offline
Цитата
КоординатаYCимвольная=YПиксельнаяДляВывода >> 3
КоординатаYPixельная=7-(YПиксельнаяДляВывода & 0x07)

С этим теперь предельно понятно, спасибо!
Разбираюсь с выводом smile

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;
  }


Еще раз спасибо! smile


Сообщение отредактировал v1ct0r - Среда, 04.09.2013, 09:15
 
ВитГоДата: Среда, 04.09.2013, 21:23 | Сообщение # 8
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
выкладывай новый текст библиотеки и знакогенератор (если не жалко конечно) !
заодно может быть что с оптимизируем еще внутри...


Виталий (аka ВитГо)
 
v1ct0rДата: Четверг, 05.09.2013, 07:37 | Сообщение # 9
Рядовой
Группа: Проверенные
Сообщений: 6
Репутация: 0
Статус: Offline
Вообще не жалко smile
Добавил 3 функции:
lcd8544_clear()
lcd8544_putdchar()
lcd8544_ddec()

font.h - цифры 16х12

Keil - не понимает запись вида 0bxxxx, перевел в десятичный, и требует объявления функций и переменных до первого мат. действия.
Вроде все..
Прикрепления: n3310.rar (4.4 Kb)
 
ВитГоДата: Пятница, 06.09.2013, 05:35 | Сообщение # 10
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
в выходные гляну !

Виталий (аka ВитГо)
 
v1ct0rДата: Пятница, 06.09.2013, 07:22 | Сообщение # 11
Рядовой
Группа: Проверенные
Сообщений: 6
Репутация: 0
Статус: Offline
Хочу еще переписать, чтоб stm32f10x_gpio не использовать.

Сообщение отредактировал v1ct0r - Пятница, 06.09.2013, 07:25
 
ВитГоДата: Суббота, 07.09.2013, 05:38 | Сообщение # 12
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
а смысл ?
можно и на ассемблер перейти..

но в итоге в большом проекте все равно начинаешь использовать стандартную библиотеку...

я тоже вначале стремился к максимальной эффективности кода, и даже на асме писал - но более менее крупный проект становиться практически не читаемым :-(


Виталий (аka ВитГо)
 
v1ct0rДата: Вторник, 10.09.2013, 14:55 | Сообщение # 13
Рядовой
Группа: Проверенные
Сообщений: 6
Репутация: 0
Статус: Offline
Да, вероятно ты прав...Оставлю как есть.
 
  • Страница 1 из 1
  • 1
Поиск:


Copyright MyCorp © 2024
Сделать бесплатный сайт с uCoz