Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2020, 08:57

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: LCD на SSD1306 и высокие шрифты
СообщениеДобавлено: 21 янв 2020, 11:03 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 1554
Привет!

Вопрос касается дисплеев на SSD1306 и SSD1780
В настоящий момент времени - это самые массово продаваемые OLED на китайских барахолках.

Суть вопроса:
Дисплей имеет страничную, строчную или вертикальную адресацию.
Если высота символа составляет 8 точек - никаких вопросов не возникает, передаем шрифт в режиме строчной адресации, автоинкремент делает свое дело и все нормально.
Вложение:
Adress.png
Adress.png [ 38.12 Кб | Просмотров: 820 ]

Когда надо писать высоким шрифтом к примеру 16x12 начинаются заморочки:
1) Надо считывать текущее положение курсора дисплея или самому передавать координаты вывода информации, либо пользоваться функцией страничной адресации
Вложение:
page.png
page.png [ 91.32 Кб | Просмотров: 820 ]

2) передавать координат вывода каждый раз при выводе 2х страничного шрифта: (LCD_Gotoxy ( x, y )) в теле самой функции, чтобы можно было иметь координаты начала вывода для второй строки.

Ну и самый большой геморрой это вывод динамических данных когда пишется какая то строчка, потом выводится цифра и опять продолжается строка, в этом режиме получается что нельзя выводить вторую строку без координат ибо они будут налезать друг на друга. В общем чешу репу как сделать красиво, либо на выходе функции печати на экран надо передавать параметры курсора либо читать данные из дисплея (а это медленно)
Кто как решает данный вопрос ?

P\S Наползание не могу сейчас сфоткать дисплей дома остался, есть решение конечно организовать отдельный буфер памяти в 1 кБ - но как бы у меня банально не хватает на это RAM.
Выкрутился пока отступами, но надо вопрос решать кардинально

Show Пример реализации 2х страничного вывода с передачей позиции курсора


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: LCD на SSD1306 и высокие шрифты
СообщениеДобавлено: 21 янв 2020, 12:33 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Лично я решаю вопрос предельно просто: выделяю в ОЗУ массив gram[128*64/8] (1024 байт), заполняю его любым способом, хоть точками через ф-цию SetDot(x, y, color) и после сливаю в дисплей целиком весь массив непрерывно. Самый простой способ. Никакой мороки с междустрочным расположением символов шрифта или с вертикальным его размером.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: LCD на SSD1306 и высокие шрифты
СообщениеДобавлено: 21 янв 2020, 15:39 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 1554
Пришел к такому же выводу, просто до этого мне не приходилось использовать шрифты выше 8 пикселей (за исключением счетчиков но там не было текста после цифр)
Тут приходится выкручиваться так как у STM8S003 всего 1 Кб оперативки, а у меня свободного ОЗУ остается 600 байт, если бы изначально поставил STM32F042 то проблемы бы такой не было.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: LCD на SSD1306 и высокие шрифты
СообщениеДобавлено: 21 янв 2020, 15:46 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
А, не хватает памяти? Окей. Хреново, но можно выкрутиться. Выводим сначала верхнюю половину символа, потом переключаем страницу ниже и координаты на начало позиции вывода и выводим нижнуюю половину символа. Для этого желательно иметь шрифт с байтами, идущими по горизонтали. Слева-направо, сверху-вниз.

600 байт свободны? О, да это же половина дисплея! Прекрасно, разбейте дисплей пополам - верхняя и нижняя половина. Заполняйте буфер в расчете на половину дисплея. Заполнили - передали. Потом следующую половину. Ну а че, это всяко лучше, чем переключать координаты, да еще и по медленному и неудобному интерфейсу I2C


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: LCD на SSD1306 и высокие шрифты
СообщениеДобавлено: 21 янв 2020, 15:59 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6946
Ой, напридумывали.
Строка должна выводиться дважды. Один раз в строке I, потом в строке I+1. При выводе, естественно, из знакогена надо брать или нижнюю, или верхнюю часть. Либо 2 таблицы знакогена.
Если высоких символов не много, то - вообще не нужен "высокий шрифт". Думаю, понятно почему. ))

Хотя, лично у меня выводится через буфер.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: LCD на SSD1306 и высокие шрифты
СообщениеДобавлено: 21 янв 2020, 16:05 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 1554
u37 писал(а):
Ой, напридумывали.
Строка должна выводиться дважды. Один раз в строке I, потом в строке I+1. При выводе, естественно, из знакогена надо брать или нижнюю, или верхнюю часть. Либо 2 таблицы знакогена.
Если высоких символов не много, то - вообще не нужен "высокий шрифт". Думаю, понятно почему. ))


В примере под спойлером (первое сообщение темы) так и делается :) и этот рабочий вариант был сразу же реализован... Просто до этого мне не было надобности гасить символы, а когда у тебя сначала отображается скажем "1080" а потом выводишь в то же место "12" и наблюдаешь непонятную хрень в результате "1280" начинаешь понимать, что вот последние 2 символа надо было как то погасить, а для этого нужно после вывода результата вывести 2 пробела вот в чем загвоздка.
P\S пока вопрос решил стиранием строки перед выводом информации...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: LCD на SSD1306 и высокие шрифты
СообщениеДобавлено: 21 янв 2020, 17:26 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
u37 писал(а):
Ой, напридумывали.
Строка должна выводиться дважды..

Ой, напридумываете... дважды. А что делать, если символ занимает более 2 страниц дисплея, да еще и находится со смещением относительно границ страницы?
Лучший способ - это видеобуфер размером в полный кадр. Остальное - костыли. Компромисс между чем-то и чем-то. Делай хоть так, хоть сяк - всё равно придется совершать много лишних движений. Не в одном, так в другом месте.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: LCD на SSD1306 и высокие шрифты
СообщениеДобавлено: 26 янв 2020, 14:03 
Заглядывает иногда

Зарегистрирован: 03 дек 2015, 21:23
Сообщения: 184
самое простое как тут уже сказали это выводить часть в одной строке, потом переходить на следующию и дорисововать, но тут проблемма в том, что нужно постоянно отрисовывать. если использовать буфер, то можно отслеживать изменения буфера и рисовать только в том случае, если он изменился.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: LCD на SSD1306 и высокие шрифты
СообщениеДобавлено: 26 янв 2020, 14:54 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6946
" если использовать буфер, то можно отслеживать изменения буфера и рисовать только в том случае, если он изменился."
Т.е. выкинуть память не под 1 буфер, а под 2 буфера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: LCD на SSD1306 и высокие шрифты
СообщениеДобавлено: 26 янв 2020, 15:09 
Заглядывает иногда

Зарегистрирован: 03 дек 2015, 21:23
Сообщения: 184
u37 писал(а):
" если использовать буфер, то можно отслеживать изменения буфера и рисовать только в том случае, если он изменился."
Т.е. выкинуть память не под 1 буфер, а под 2 буфера.

да) но мне кажется так удобнее. скажем 2x128x64/8 = 2 кб. не такая большая трагедия. Да и мне всегда не хватала быстродействия, чем памяти.
p.s. но это так к слову, тут у парня проблема как раз в нехватки в памяти, так что для него оптимально выводить по кускам


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: LCD на SSD1306 и высокие шрифты
СообщениеДобавлено: 26 янв 2020, 23:47 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 1554
Парни все уже решено :) всего в дисплее 8 строк, отрисовываются у меня теперь только строки в которых, что то поменялось без всяких промежуточных буферов, сделано это на программном уровне.
Рескан дисплея так же меняется в зависимости от того, что выводится и в каком меню в текущем случае мы находимся. Понятно, что нет смысла делать рескан каждые 50 мС если в текущий момент мы показываем температуру в печи которая обновляется каждую секунду. Ну а если мы в менющке копошимся и нужен отклик на кнопки и фильтр кнопки установлен на 50 mS вот тут то как раз и надо увеличить скорость вывода информации.
В общем просто пришлось немного больше повозится с логикой но зато с задачей справился

P\S Все баста карапузики хрен я теперь буду ставить STM8 там где надо общирной периферией пользоваться опять вколачивал код в 8 кб памяти,
использовал из перифирии:
1) USART
2) i2C (LCD OLED 128x64 2 шрифта 8x5 (полный с русским языком и спец символами) и 16x12 (вывод только цифр и служебных)
3) 2 таймера: системный (TIM4), PWM (tim3)
4) ADC - 1 канал с фильтром (на прерываниях)
5) AWU - задержки вместо DELAY для бипера.
6) EXTI - кнопочки


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB