Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » OLED 128x64 (UG-2864HSWEG01) на SSD1306


OLED 128x64 (UG-2864HSWEG01) на SSD1306

Сообщений 1 страница 30 из 87

1

Всем здравия и креатива!

Питаю слабость к всяким маленьким штукам (особенно дисплеям). В очередной раз приобрел новый экран, дабы веду поиски в стабильности комплектующих китайского производства. Иными словами, пытаюсь найти универсальный экран, который носит массовое производство и его хар-ки (физические и программные) не меняются. В общем немного информации об изысканиях есть тут (ещё некий подобный вариант отпостил на англофоруме баскома).
Разновидностей экранов на SSD1306 (и ему подобных) на просторах инета - очень много. Все они так или иначе отличаются по командам управления и адресации. Плюс/минус данных не много (видимо так просто всё) и в частности на сайте "bascomavr.3bb.ru" инфы нет вообще (решил пополнить базу).

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

Тема кому-то вообще интересна или типа "пусть будет"?

0

2

ИМХО

RDW написал(а):

найти универсальный экран, который носит массовое производство и его хар-ки (физические и программные) не меняются

Не реально. сначала 3310, потом 1100 и т.д потом цветные, а потом вообще что в тумбочке валяется из сотовых всё ву дело. К сожалению или точнее к счастью, прогресс не стоит.
Я вот  накупил 1100 по 40р. в одном магазине, так одни контрастность не регулируют, другие инверсные, перевёрнутые ну и т.д.

RDW написал(а):

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

Проще сделать минитерминал, и через UART отлаживать
Потом, в домашнем конструировании каждый проект оригинален, и как правило делаешь из того что есть дома, в магазине или ищё где.

0

3

RDW написал(а):

Тема кому-то вообще интересна или типа "пусть будет"?


Тема в высшей степени интересна, но и цена пока-что заоблачная.

0

4

kip написал(а):

Проще сделать минитерминал, и через UART отлаживать
Потом, в домашнем конструировании каждый проект оригинален, и как правило делаешь из того что есть дома, в магазине или ищё где.

Я так раньше думал. Увы, не все вещи можно выводить через уарт (скорости не хватит, да и вечная проблема с синхронностью (особенно на высоких скоростях).
Ещё мне нужна была портативность, независимость, некое маленькое устройство (карманное), что-то вроде терминала (экран+клава), чтобы пришел куда-то, подключил и работаешь. Да я сейчас в таких случаях просто ставлю БТ (да и проводов нет), но нужно тащить с собой нетбук или через мобилу. С мобилой как-то не удобно (кнопки сенсорные маленькие и толковый терминал есть не на всех ОС)... Некоторые вещи при отладки выводишь под компьютерный терминал, но уже (скажем) на телефоне - не удобно (ещё и по этой причине). Надо как-то всё возможно стандартизировать, придумать систему сбора данных в реальном времени и выводить её по странично.. Так же не всем устройствам вообще нужен экран и он вещь временная, пока отладишь всё..

0

5

Хех, пока писал подпрограмму вывода текста, понял, что лениво рисовать руками свои шрифты. Да они выходят куда более качественно, но ещё ведь в теле программы текста жрут много (в DATA). Не долго думая стал искать в инете конвертора шрифтов +/- одно и тоже, что-то всё не то...
В итоге накидал свою прожку на VB6, которая вытягивает все шрифты в ОСи (винде), а потом их выбирая и манипулируя опциями (смещения, фильтр размера, размером) можно просматривать, подбирать нужные хар-ки, а потом, когда всё устраивает, одной кнопкой это всё конвертит в BIN (которой в баскоме можно подключать через "$inc").  :crazy: В итога так зарылся в выборе шрифтов... :D

0

6

Вот еще бы в .font конвертировала - цены бы ей не было. :)

0

7

max написал(а):

.font

Это что, обратно чтоли в виндовые шрифты?  o.O Пример формата где глянуть? Для понятия..

Отредактировано RDW (2014-03-25 18:36:31)

0

8

RDW написал(а):

Пример формата где глянуть? Для понятия..

Код:
'Color
color16x16:
$asm
.db 2,16,32,0
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;  
.db 0,0,192,0,192,0,192,0,224,1,224,1,224,1,224,1,192,0,0,0,192,0,224,1,192,0,0,0,0,0,0,0 ; !
.db 0,0,96,6,96,6,96,6,96,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; "
.db 0,0,0,0,48,12,48,12,252,63,252,63,48,12,48,12,48,12,252,63,252,63,48,12,48,12,0,0,0,0,0,0 ; #
.db 0,0,192,0,248,7,220,14,204,24,204,0,248,0,240,1,192,7,192,14,192,24,196,24,220,30,248,15,192,0,0,0 ; $
.db 0,0,0,0,56,12,108,12,68,6,108,6,56,3,128,1,192,28,96,54,48,34,24,54,24,28,0,0,0,0,0,0 ; %
.db 0,0,240,0,152,1,152,1,240,1,240,0,240,49,184,59,28,31,12,14,12,31,188,59,240,49,0,0,0,0,0,0 ; &
.db 0,0,192,1,192,1,192,1,192,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; '
.db 0,0,0,15,192,3,224,0,96,0,48,0,48,0,48,0,48,0,96,0,224,0,192,3,0,15,0,0,0,0,0,0
.db 0,0,240,0,192,3,0,7,0,6,0,12,0,12,0,12,0,12,0,6,0,7,192,3,240,0,0,0,0,0,0,0
.db 0,0,0,0,0,0,0,0,48,6,112,7,224,3,248,15,248,15,224,3,112,7,48,6,0,0,0,0,0,0,0,0 ; *
.db 0,0,0,0,0,0,128,1,128,1,128,1,128,1,248,31,248,31,128,1,128,1,128,1,128,1,0,0,0,0,0,0 ; +
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,15,0,15,0,6,0,3,0,0,0,0,0,0 ; ,
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,63,252,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; -
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,0,224,0,224,0,224,0,0,0,0,0,0,0 ; .
.db 0,0,0,0,0,12,0,12,0,6,0,3,0,3,128,1,192,0,96,0,96,0,48,0,24,0,24,0,0,0,0,0 ; /
.db 0,0,128,1,224,7,112,14,24,24,24,24,24,24,24,24,24,24,24,24,112,14,224,7,128,1,0,0,0,0,0,0 ; 0
.db 0,0,128,1,192,1,240,1,176,1,128,1,128,1,128,1,128,1,128,1,128,1,240,15,240,15,0,0,0,0,0,0 ; 1
.db 0,0,192,1,224,7,56,6,24,6,0,6,0,3,192,1,96,0,48,0,24,0,248,15,248,15,0,0,0,0,0,0 ; 2
.db 0,0,224,3,248,7,24,6,0,12,224,15,224,7,0,6,0,12,24,24,24,28,240,15,240,7,0,0,0,0,0,0 ; 3
.db 0,0,0,3,128,3,192,3,96,3,48,3,24,3,252,15,252,15,0,3,0,3,0,3,0,3,0,0,0,0,0,0 ; 4
.db 0,0,248,15,248,15,24,0,24,0,248,7,248,15,0,12,0,12,0,12,24,12,240,15,240,7,0,0,0,0,0,0 ; 5
.db 0,0,192,7,224,31,48,24,24,0,24,0,216,7,248,15,56,28,24,24,56,28,240,15,224,7,0,0,0,0,0,0 ; 6
.db 0,0,248,15,248,15,8,12,0,6,0,3,0,3,128,1,192,0,96,0,96,0,48,0,24,0,0,0,0,0,0,0 ; 7
.db 0,0,224,7,240,15,48,12,48,12,224,7,224,7,48,12,24,24,24,24,56,28,240,15,224,7,0,0,0,0,0,0 ; 8
.db 0,0,224,7,240,15,24,14,24,12,56,14,240,15,224,13,0,12,8,12,24,6,240,3,192,1,0,0,0,0,0,0 ; 9
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,1,192,1,0,0,0,0,192,1,192,1,0,0,0,0,0,0 ; :
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,1,192,1,0,0,0,0,192,1,128,1,192,0,64,0,0,0 ; ;
.db 0,0,0,12,0,6,0,3,128,1,192,0,96,0,96,0,192,0,128,1,0,3,0,6,0,12,0,0,0,0,0,0 ; <
.db 0,0,0,0,0,0,0,0,0,0,252,63,252,63,0,0,0,0,252,63,252,63,0,0,0,0,0,0,0,0,0,0 ; =
.db 0,0,48,0,96,0,192,0,128,1,0,3,0,6,0,6,0,3,128,1,192,0,96,0,48,0,0,0,0,0,0,0 ; >
.db 0,0,192,7,224,15,48,24,48,24,48,12,0,6,0,3,0,3,0,3,0,0,0,3,128,3,0,3,0,0,0,0 ; ?
.db 0,0,128,7,224,31,48,56,24,51,140,55,204,54,204,55,140,31,24,0,48,48,224,31,128,7,0,0,0,0,0,0 ; @
.db 0,0,128,1,128,1,192,3,96,6,96,6,48,12,240,15,248,31,24,24,24,24,12,48,12,48,0,0,0,0,0,0 ; A
.db 0,0,240,3,240,7,48,12,48,12,48,12,240,7,240,15,48,24,48,24,48,24,240,15,240,7,0,0,0,0,0,0 ; B
.db 0,0,192,3,240,15,56,12,24,0,12,0,12,0,12,0,12,0,24,0,56,12,240,15,192,3,0,0,0,0,0,0 ; C
.db 0,0,240,1,240,15,48,24,48,24,48,48,48,48,48,48,48,48,48,24,48,24,240,15,240,3,0,0,0,0,0,0 ; D
.db 0,0,240,31,240,31,48,0,48,0,48,0,240,3,240,3,48,0,48,0,48,0,240,31,240,31,0,0,0,0,0,0 ; E
.db 0,0,240,31,240,31,48,0,48,0,48,0,240,3,240,3,48,0,48,0,48,0,48,0,48,0,0,0,0,0,0,0 ; F
.db 0,0,192,7,240,31,56,28,24,0,12,0,12,0,12,31,12,31,24,24,56,24,240,31,192,31,0,0,0,0,0,0 ; G
.db 0,0,24,24,24,24,24,24,24,24,24,24,248,31,248,31,24,24,24,24,24,24,24,24,24,24,0,0,0,0,0,0 ; H
.db 0,0,224,7,224,7,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,224,7,224,7,0,0,0,0,0,0 ; I
.db 0,0,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,24,24,56,28,240,15,224,3,0,0,0,0,0,0 ; J
.db 0,0,24,24,24,28,24,6,24,3,216,1,248,0,248,0,216,1,24,3,24,6,24,28,24,24,0,0,0,0,0,0 ; K
.db 0,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,248,31,248,31,0,0,0,0,0,0 ; L
.db 0,0,12,48,12,48,28,56,28,56,60,60,60,60,108,54,108,54,204,51,204,51,140,49,140,49,0,0,0,0,0,0 ; M
.db 0,0,24,24,56,24,56,24,120,24,216,24,152,25,152,25,24,27,24,30,24,28,24,28,24,24,0,0,0,0,0,0 ; N
.db 0,0,224,7,240,15,24,24,12,48,12,48,12,48,12,48,12,48,12,48,24,24,240,15,224,7,0,0,0,0,0,0 ; O
.db 0,0,240,15,240,31,48,48,48,48,48,24,240,15,240,7,48,0,48,0,48,0,48,0,48,0,0,0,0,0,0,0 ; P
.db 0,0,224,7,240,15,24,24,12,48,12,48,12,48,12,48,12,51,12,54,24,28,240,31,224,55,0,0,0,0,0,0 ; Q
.db 0,0,240,15,240,31,48,48,48,48,48,24,240,15,240,7,48,12,48,12,48,24,48,24,48,48,0,0,0,0,0,0 ; R
.db 0,0,240,3,248,7,28,14,12,12,28,0,248,1,192,7,0,12,0,24,12,28,252,15,248,7,0,0,0,0,0,0 ; S
.db 0,0,248,31,248,31,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,0,0,0,0,0,0 ; T
.db 0,0,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,56,28,240,15,192,3,0,0,0,0,0,0 ; U
.db 0,0,24,24,24,24,24,24,48,12,48,12,48,12,96,6,96,6,192,3,192,3,128,1,128,1,0,0,0,0,0,0 ; V
.db 0,0,140,49,140,49,140,49,140,49,216,27,216,27,216,27,120,30,112,14,112,14,48,12,48,12,0,0,0,0,0,0 ; W
.db 0,0,24,24,24,24,48,12,96,6,192,3,128,1,128,1,192,3,96,6,48,12,24,24,24,24,0,0,0,0,0,0 ; X
.db 0,0,24,24,24,24,48,12,48,12,96,6,192,3,192,3,128,1,128,1,128,1,128,1,128,1,0,0,0,0,0,0 ; Y
.db 0,0,248,31,248,31,0,24,0,12,0,6,0,3,128,1,192,0,96,0,48,0,248,31,248,31,0,0,0,0,0,0 ; Z
.db 0,0,240,15,240,15,48,0,48,0,48,0,48,0,48,0,48,0,48,0,48,0,240,15,240,15,0,0,0,0,0,0 ; [
.db 0,0,0,0,24,0,24,0,48,0,96,0,96,0,192,0,128,1,0,3,0,3,0,6,0,12,0,12,0,0,0,0 ; \
.db 0,0,240,15,240,15,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0,12,240,15,240,15,0,0,0,0,0,0 ; ]
.db 0,0,128,1,192,3,96,6,48,12,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; ^
.db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0
.db 0,0,120,0,120,0,224,0,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; `
.db 0,0,0,0,0,0,0,0,0,0,192,13,224,15,112,12,48,12,48,12,48,12,224,15,192,15,0,0,0,0,0,0 ; a
.db 0,0,48,0,48,0,48,0,48,0,176,3,240,7,48,12,48,12,48,12,48,12,240,15,240,7,0,0,0,0,0,0 ; b
.db 0,0,0,0,0,0,0,0,0,0,192,7,224,15,112,0,48,0,48,0,112,0,224,15,192,7,0,0,0,0,0,0 ; c
.db 0,0,0,12,0,12,0,12,0,12,192,13,240,15,112,12,48,12,48,12,48,12,240,15,224,15,0,0,0,0,0,0 ; d
.db 0,0,0,0,0,0,0,0,0,0,224,3,240,15,56,12,248,15,248,15,24,0,240,15,224,7,0,0,0,0,0,0 ; e
.db 0,0,192,3,224,7,112,6,48,0,48,0,248,1,248,1,48,0,48,0,48,0,48,0,48,0,0,0,0,0,0,0 ; f
.db 0,0,0,0,0,0,0,0,0,0,192,15,224,15,112,12,48,12,48,12,112,12,224,15,192,15,16,12,240,15,224,7 ; g
.db 0,0,48,0,48,0,48,0,48,0,48,0,240,3,240,7,48,12,48,12,48,12,48,12,48,12,0,0,0,0,0,0 ; h
.db 0,0,0,0,0,0,128,1,128,1,0,0,128,1,128,1,128,1,128,1,128,1,128,1,128,1,0,0,0,0,0,0 ; i
.db 0,0,0,0,0,0,0,12,0,12,0,0,0,12,0,12,0,12,0,12,0,12,0,12,48,12,48,12,240,7,224,3 ; j
.db 0,0,48,0,48,0,48,0,48,0,48,0,48,12,48,7,240,1,240,1,176,1,48,7,48,12,0,0,0,0,0,0 ; k
.db 0,0,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,0,0,0,0,0,0 ; l
.db 0,0,0,0,0,0,0,0,0,0,124,14,252,31,140,49,140,49,140,49,140,49,140,49,140,49,0,0,0,0,0,0 ; m
.db 0,0,0,0,0,0,0,0,0,0,240,3,240,7,48,12,48,12,48,12,48,12,48,12,48,12,0,0,0,0,0,0 ; n
.db 0,0,0,0,0,0,0,0,0,0,224,7,240,15,24,24,24,24,24,24,24,24,240,15,224,7,0,0,0,0,0,0 ; o
.db 0,0,0,0,0,0,0,0,0,0,248,3,248,7,24,12,24,12,24,12,24,12,248,7,248,3,24,0,24,0,24,0 ; p
.db 0,0,0,0,0,0,0,0,0,0,224,15,240,15,24,12,24,12,24,12,24,12,240,15,224,15,0,12,0,12,0,12 ; q
.db 0,0,0,0,0,0,0,0,0,0,176,7,240,7,112,0,48,0,48,0,48,0,48,0,48,0,0,0,0,0,0,0 ; r
.db 0,0,0,0,0,0,0,0,0,0,224,7,240,15,48,0,240,7,224,15,0,12,240,15,224,7,0,0,0,0,0,0 ; s
.db 0,0,128,1,128,1,128,1,240,15,240,15,128,1,128,1,128,1,128,1,128,1,128,1,128,1,0,0,0,0,0,0 ; t
.db 0,0,0,0,0,0,0,0,0,0,48,12,48,12,48,12,48,12,48,12,48,12,224,15,192,15,0,0,0,0,0,0 ; u
.db 0,0,0,0,0,0,0,0,0,0,48,12,48,12,112,14,96,6,96,6,192,3,192,3,128,1,0,0,0,0,0,0 ; v
.db 0,0,0,0,0,0,0,0,0,0,140,49,140,49,140,49,152,25,216,27,112,14,112,14,48,12,0,0,0,0,0,0 ; w
.db 0,0,0,0,0,0,0,0,0,0,48,12,48,12,96,6,192,3,192,3,96,6,48,12,48,12,0,0,0,0,0,0 ; x
.db 0,0,0,0,0,0,0,0,0,0,48,12,48,12,48,12,48,12,48,12,48,12,224,15,192,15,0,12,240,15,224,7 ; y
.db 0,0,0,0,0,0,0,0,0,0,240,15,240,15,0,6,128,3,192,1,96,0,240,15,240,15,0,0,0,0,0,0 ; z
.db 0,0,0,15,192,3,192,0,192,0,224,0,56,0,56,0,224,0,192,0,192,0,192,3,0,15,0,0,0,0,0,0 ; {
.db 0,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,0,0,0,0,0,0 ; |
.db 0,0,240,0,192,3,0,3,0,3,0,7,0,28,0,28,0,7,0,3,0,3,192,3,240,0,0,0,0,0,0,0 ; }
.db 0,0,112,48,248,57,156,31,12,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; ~
.db 0,0,128,1,64,2,64,2,96,6,32,4,48,12,16,8,16,8,16,8,16,8,16,8,240,15,0,0,0,0,0,0 ; 
$end asm

0

9

RDW написал(а):

В итоге накидал свою прожку на VB6, которая вытягивает все шрифты в ОСи (винде), а потом их выбирая и манипулируя опциями

И где можно её стыбрить???

0

10

Почти понял, только что такое ".db 2,16,32,0" ?
Впрочем у меня всегда монохром и в основном 8хХ (не цветное).

0

11

sasha_1973 написал(а):

И где можно её стыбрить???

Стыбрить не проблема.  :D Проблема - мне в лом писать к ней описалово (с рисунками)..думаю так непонятно будет.

0

12

Прога тут.
По бырому накидаю описание основных моментов:

http://rdvv.ru/files/bascomavr_3bb_ru/hlp01.gif

1 - окно отображает исходный вид символа (со всеми его извратами: сглаживание, многосерость..);
2 - окно отображает символ после преобразования его в бинарный вид (только 0 и 1) - как есть;
3,4 - смена символов, для ознакомления с ними (чтобы оченить качество преобразования в окне 2);
5 - смена размера шрифта (в окне 1);
6 - изменение чувствительности преобразования из "аналога в цифру"  :D, качество преобразования из окна 1 в окно 2;
7 - разные варианты алгоритмов фильтрации данных при преобразовании;
8 - номер отображаемого символа;
9 - изменяют область вырезания символа в окне 2 (нажимаем и смотрим изменения в окне 2).

Суть в следующем:

- выбираем желаемый шрифт;
- если не влазиет по вертикали в 8 бит, то уменьшаем размерность рычагом №5;
- если не лезет и по горизонтали, то же уменьшаем размер шрифта рычагом №5 (сильно увлекаться подстройкой под один символ - не следует, надо использовать несколько разных: % & $ @ W...);
- дальше пытаемся при помощи №6 и №7 настроить наилучшее качество преобразования (в основном №7; №6 по умолчанию нормально установлен, если не нравится - меняем);
- если все контрольные символы отображаются как нравится (в окне 2), то при помощи рычагов №9 обрезаем шрифт в окне 2.
(эти все операции проделываются для того, чтобы настроить под конкретный шрифт обработчик, т.е. все настройки действуют на весь шрифт - не на отдельный символ!)
- жмём "Convert", после некого действия, в папке с программой появится шрифт (попап сообщит нам о названии созданного файла).

Окно с надписью "8х16" - сообщает нам заранее о размере получаемого шрифта (т.к. оно может меняться в зависимости от настроек сделаныз рычагами №9 и №7).

Максимальное качество переносимого шрифта получается при:

- максимальном разрешении вывода (8х9, 8х10...);
- используя опцию "Disable All Filter Size" (но при отключении этой опции, сложнее сделать более маленький шрифт).

+1

13

Что-то в инете пока не нашел готовых кириллических шрифтов, которые бы хорошо конвертировались, точнее: то английские буквы хороши - но нет русского, то на оборот.  :D
В итоге приходится пока довольствоваться малым:

Чую придется делать какой-то миксер шрифтовой...  :tired:

0

14

Новая версия, добавлено:

- создание файлов без пробелов;
- добавлено быстрое перемещение к основным символам (для визуальной проверки).

С шрифтом всё решилось проще, взял из ОС обычный Courier, шрифт не маленький (8х12), но очень хорошо выглядит/читается. Мне сейчас экономия на экрана не нужна, если нужно будет чуть увеличить количество строк помещающихся на экране, то можно использовать другой (тогда добавлю поддержку переключения шрифтов). Для русского языка шрифты все весьма не компактные, капризный язык по размерам.  :music:

0

15

А где посмотреть пример программы для bascom с этим дисплеем?

0

16

Если просто интересует код, то ищем в инете (примеров предостаточно).
Моделей этого дисплея - масса, но у каждого свои нюансы, надо точно знать/видеть модель.
Что конкретно интересует?

0

17

Доброе время суток. Помогите разобраться с SSD1306 . Примеров не так уж и много и код одинаковый http://sa.uploads.ru/t/tyQB4.jpghttp://sa.uploads.ru/t/QUqxj.jpg

Библиотека на Arduine работает и там адрес &Н3С здесь &H78 менял не получается . Но стоит первым прошить библу с ардуинке ( настройки остаются ) прошиваю с Bascoma этот пример и он работает пока не обесточишь!? Что куда записать, чтобы запустился? Спасибо.



Это рабочие адреса с библа Arduino ssd1306 128x64 ( при котором он работает "скопировал")

#define SSD1306_128_64
// #define SSD1306_128_32
// #define SSD1306_96_16
/*=========================================================================*/

#if defined SSD1306_128_64 && defined SSD1306_128_32
#error "Only one SSD1306 display can be specified at once in SSD1306.h"
#endif
#if !defined SSD1306_128_64 && !defined SSD1306_128_32 && !defined SSD1306_96_16
#error "At least one SSD1306 display must be specified in SSD1306.h"
#endif

#if defined SSD1306_128_64
#define SSD1306_LCDWIDTH 128
#define SSD1306_LCDHEIGHT 64
#endif
#if defined SSD1306_128_32
#define SSD1306_LCDWIDTH 128
#define SSD1306_LCDHEIGHT 32
#endif
#if defined SSD1306_96_16
#define SSD1306_LCDWIDTH 96
#define SSD1306_LCDHEIGHT 16
#endif

#define SSD1306_SETCONTRAST 0x81
#define SSD1306_DISPLAYALLON_RESUME 0xA4
#define SSD1306_DISPLAYALLON 0xA5
#define SSD1306_NORMALDISPLAY 0xA6
#define SSD1306_INVERTDISPLAY 0xA7
#define SSD1306_DISPLAYOFF 0xAE
#define SSD1306_DISPLAYON 0xAF

#define SSD1306_SETDISPLAYOFFSET 0xD3
#define SSD1306_SETCOMPINS 0xDA

#define SSD1306_SETVCOMDETECT 0xDB

#define SSD1306_SETDISPLAYCLOCKDIV 0xD5
#define SSD1306_SETPRECHARGE 0xD9

#define SSD1306_SETMULTIPLEX 0xA8

#define SSD1306_SETLOWCOLUMN 0x00
#define SSD1306_SETHIGHCOLUMN 0x10

#define SSD1306_SETSTARTLINE 0x40

#define SSD1306_MEMORYMODE 0x20
#define SSD1306_COLUMNADDR 0x21
#define SSD1306_PAGEADDR 0x22

#define SSD1306_COMSCANINC 0xC0
#define SSD1306_COMSCANDEC 0xC8

#define SSD1306_SEGREMAP 0xA0

#define SSD1306_CHARGEPUMP 0x8D

#define SSD1306_EXTERNALVCC 0x1
#define SSD1306_SWITCHCAPVCC 0x2

// Scrolling #defines
#define SSD1306_ACTIVATE_SCROLL 0x2F
#define SSD1306_DEACTIVATE_SCROLL 0x2E
#define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3
#define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26
#define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27
#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29
#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A

Пример:

Код:
$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 10
$framesize = 40
Config Scl = Portc.5
Config Sda = Portc.4
Config Twi = 400000
I2cinit

Dim Resetflag As Bit

Declare Sub Rstoled
Declare Sub Oled(byval Text As String * 16 , Byval Col As Integer , Byval Page As Integer)

Do

If Resetflag < 1 Then
Call Rstoled
Resetflag = 1
Call Oled( "ich liebe dieses" , 0 , 1)
Call Oled( "Display,denn es " , 0 , 2)
Call Oled( "ist so klein und" , 0 , 3)
Call Oled( "verbraucht kaum " , 0 , 4)
Call Oled( "Strom " , 0 , 5)
Call Oled( "SSD1306CRIUS I2c" , 0 , 6)
Call Oled( "v1.2 128x64 OLED" , 0 , 7)
Call Oled( "by Mathias Tenge" , 0 , 8)
End If


Loop


Sub Oled(byval Text As String * 16 , Byval Col As Integer , Byval Page As Integer)
Dim Buchstabe As String * 1

Dim Q As Integer
Dim H As Integer
Dim Temp As Integer
Dim Senden As Byte
Col = Col + 16
Page = Page + 175
I2cstart
I2cwbyte &H78
I2cwbyte &H80
I2cwbyte Page 'Bestimmung Page (Y)
I2cstop

I2cstart
I2cwbyte &H78
I2cwbyte &H80
I2cwbyte &H00
I2cstop

I2cstart
I2cwbyte &H78
I2cwbyte &H80
I2cwbyte Col 'Bestimmung Page (Y)
I2cstop


I2cstart
I2cwbyte &H78
I2cwbyte &H80
I2cstop

I2cstart
I2cwbyte &H78
I2cwbyte &H40
'Umwandlung von Buchstaben zu Asciiwert zu Clumndata der Datenbank
For Q = 1 To 16
Temp = 0
Buchstabe = Mid(text , Q , 1)
Temp = Asc(buchstabe)
Temp = Temp - 32
Temp = Temp * 8
For H = 1 To 8
Senden = Lookup(temp , Asciitab)
I2cwbyte Senden
Incr Temp
Next H
Next Q
I2cstop

End Sub


Sub Rstoled 'OLED RESET, Aufwecken, alles loeschen
Dim I As Byte
Dim J As Integer
Dim Page As Byte
Page = 176
I2cstart
I2cwbyte &H78
I2cwbyte &H80
I2cwbyte &HAF 'DISPLAY aufwecken sleep= &HAE
I2cstop

I2cstart
I2cwbyte &H78
I2cwbyte &H80
I2cwbyte &H81 'DISPLAY aufwecken sleep= &HAE
I2cstop

I2cstart
I2cwbyte &H78
I2cwbyte &H80
I2cwbyte &HFF 'Kontrast
I2cstop

I2cstart
I2cwbyte &H78
I2cwbyte &H80
I2cwbyte &H20 'Adressmapping
I2cstop

I2cstart
I2cwbyte &H78
I2cwbyte &H80
I2cwbyte &H00 'Adressmapping Horizontal
I2cstop

I2cstart
I2cwbyte &H78
I2cwbyte &H40 'Datenempfang
For J = 0 To 1023
I2cwbyte &H00 'sende "leere Column"
Next J
I2cstop
End Sub


Asciitab:
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,
Data 0 , 0 , 6 , 95 , 6 , 0 , 0 , 0,
Data 0 , 7 , 3 , 0 , 7 , 3 , 0 , 0,
Data 0 , 36 , 126 , 36 , 126 , 36 , 0 , 0,
Data 0 , 36 , 43 , 106 , 18 , 0 , 0 , 0,
Data 0 , 99 , 19 , 8 , 100 , 99 , 0 , 0,
Data 0 , 54 , 73 , 86 , 32 , 80 , 0 , 0,
Data 0 , 0 , 7 , 3 , 0 , 0 , 0 , 0,
Data 0 , 0 , 62 , 65 , 0 , 0 , 0 , 0,
Data 0 , 0 , 65 , 62 , 0 , 0 , 0 , 0,
Data 0 , 8 , 62 , 28 , 62 , 8 , 0 , 0,
Data 0 , 8 , 8 , 62 , 8 , 8 , 0 , 0,
Data 0 , 0 , 224, 96 , 0 , 0 , 0 , 0,
Data 0 , 8 , 8 , 8 , 8 , 8 , 0 , 0,
Data 0 , 0 , 96 , 96 , 0 , 0 , 0 , 0,
Data 0 , 32 , 16 , 8 , 4 , 2 , 0 , 0,
Data 0 , 62 , 81 , 73 , 69 , 62 , 0 , 0,
Data 0 , 0 , 66 , 127 , 64 , 0 , 0 , 0,
Data 0 , 98 , 81 , 73 , 73 , 70 , 0 , 0,
Data 0 , 34 , 73 , 73 , 73 , 54 , 0 , 0,
Data 0 , 24 , 20 , 18 , 127 , 16 , 0 , 0,
Data 0 , 47 , 73 , 73 , 73 , 49 , 0 , 0,
Data 0 , 60 , 74 , 73 , 73 , 48 , 0 , 0,
Data 0 , 1 , 113 , 9 , 5 , 3 , 0 , 0,
Data 0 , 54 , 73 , 73 , 73 , 54 , 0 , 0,
Data 0 , 6 , 73 , 73 , 41 , 30 , 0 , 0,
Data 0 , 0 , 108 , 108 , 0 , 0 , 0 , 0,
Data 0 , 0 , 236 , 108 , 0 , 0 , 0 , 0,
Data 0 , 8 , 20 , 4 , 65 , 0 , 0 , 0,
Data 0 , 36 , 36 , 36 , 36 , 36 , 0 , 0,
Data 0 , 0 , 65 , 34 , 20 , 8 , 0 , 0,
Data 0 , 2 , 1 , 89 , 9 , 6 , 0 , 0,
Data 0 , 62 , 65 , 93 , 85 , 30 , 0 , 0,
Data 0 , 126 , 17 , 17 , 17 , 126 , 0 , 0,
Data 0 , 127 , 73 , 73 , 73 , 54 , 0 , 0,
Data 0 , 62 , 65 , 65 , 65 , 34 , 0 , 0,
Data 0 , 127 , 65 , 65 , 65 , 62 , 0 , 0,
Data 0 , 127 , 73 , 73 , 73 , 65 , 0 , 0,
Data 0 , 127 , 9 , 9 , 9 , 1 , 0 , 0,
Data 0 , 62 , 65 , 73 , 73 , 122 , 0 , 0,
Data 0 , 127 , 8 , 8 , 8 , 127 , 0 , 0,
Data 0 , 0 , 65 , 127 , 65 , 0 , 0 , 0,
Data 0 , 48 , 64 , 64 , 64 , 63 , 0 , 0,
Data 0 , 127 , 8 , 20 , 34 , 65 , 0 , 0,
Data 0 , 127 , 64 , 64 , 64 , 64 , 0 , 0,
Data 0 , 127 , 2 , 4 , 2 , 127 , 0 , 0,
Data 0 , 127 , 2 , 4 , 8 , 127 , 0 , 0,
Data 0 , 62 , 65 , 65 , 65 , 62 , 0 , 0,
Data 0 , 127 , 9 , 9 , 9 , 6 , 0 , 0,
Data 0 , 62 , 65 , 81 , 33 , 94 , 0 , 0,
Data 0 , 127 , 9 , 9 , 25 , 102 , 0 , 0,
Data 0 , 38 , 73 , 73 , 73 , 50 , 0 , 0,
Data 0 , 1 , 1 , 127 , 1 , 1 , 0 , 0,
Data 0 , 63 , 64 , 64 , 64 , 63 , 0 , 0,
Data 0 , 31 , 32 , 64 , 32 , 31 , 0 , 0,
Data 0 , 63 , 64 , 60 , 64 , 63 , 0 , 0,
Data 0 , 99 , 20 , 8 , 20 , 99 , 0 , 0,
Data 0 , 7 , 8 , 112 , 8 , 7 , 0 , 0,
Data 0 , 113 , 73 , 69 , 67 , 0 , 0 , 0,
Data 0 , 0 , 127 , 65 , 65 , 0 , 0 , 0,
Data 0 , 2 , 4 , 8 , 16 , 32 , 0 , 0,
Data 0 , 0 , 65 , 65 , 127 , 0 , 0 , 0,
Data 0 , 4 , 2 , 1 , 2 , 4 , 0 , 0,
Data 128 , 128 , 128 , 128 , 128 , 128 , 128 , 128,
Data 0 , 0 , 3 , 7 , 0 , 0 , 0 , 0,
Data 0 , 32 , 84 , 84 , 84 , 120 , 0 , 0,
Data 0 , 127 , 68 , 68 , 68 , 56 , 0 , 0,
Data 0 , 56 , 68 , 68 , 68 , 40 , 0 , 0,
Data 0 , 56 , 68 , 68 , 68 , 127 , 0 , 0,
Data 0 , 56 , 84 , 84 , 84 , 8 , 0 , 0,
Data 0 , 8 , 126 , 9 , 9 , 0 , 0 , 0,
Data 0 , 24 , 164 , 164 , 164 , 124 , 0 , 0,
Data 0 , 127 , 4 , 4 , 120 , 0 , 0 , 0,
Data 0 , 0 , 0 , 125 , 64 , 0 , 0 , 0,
Data 0 , 64 , 128 , 132 , 125 , 0 , 0 , 0,
Data 0 , 127 , 16 , 40 , 68 , 0 , 0 , 0,
Data 0 , 0 , 0 , 127 , 64 , 0 , 0 , 0,
Data 0 , 124 , 4 , 24 , 4 , 120 , 0 , 0,
Data 0 , 124 , 4 , 4 , 120 , 0 , 0 , 0,
Data 0 , 56 , 68 , 68 , 68 , 56 , 0 , 0,
Data 0 , 252 , 68 , 68 , 68 , 56 , 0 , 0,
Data 0 , 56 , 68 , 68 , 68 , 252 , 0 , 0,
Data 0 , 68 , 120 , 68 , 4 , 8 , 0 , 0,
Data 0 , 8 , 84 , 84 , 84 , 32 , 0 , 0,
Data 0 , 4 , 62 , 68 , 36 , 0 , 0 , 0,
Data 0 , 60 , 64 , 32 , 124 , 0 , 0 , 0,
Data 0 , 28 , 32 , 64 , 32 , 28 , 0 , 0,
Data 0 , 60 , 96 , 48 , 96 , 60 , 0 , 0,
Data 0 , 108 , 16 , 16 , 108 , 0 , 0 , 0,
Data 0 , 156 , 160 , 96 , 60 , 0 , 0 , 0,
Data 0 , 100 , 84 , 84 , 76 , 0 , 0 , 0,
Data 0 , 8 , 62 , 65 , 65 , 0 , 0 , 0,
Data 0 , 0 , 0 , 119 , 0 , 0 , 0 , 0,
Data 0 , 0 , 65 , 65 , 62 , 8 , 0 , 0,
Data 0 , 2 , 1 , 2 , 1 , 0 , 0 , 0,
Data 0 , 60 , 38 , 35 , 38 , 60 , 0 , 0,

0

18

Ну так используйте адреса инициализации экрана из дуни (&Н3С). Раз они работают.

Для моего экрана она выглядит так:

Код:
   'OLED initialisation ***********************************************************
   Const Oled_address = &H78
   Const Oled_data_mode = &H40
   Const Oled_command_mode = &H80

   I2cstart
   I2cwbyte Oled_address 
   I2cwbyte Oled_command_mode 
   I2cwbyte &HAE                                        '10101110    Display off

   I2cwbyte &B00000000                                  'Set lower column start address for page addressing mode at 0

   I2cwbyte &B00010000                                  'Set higher column start address for page addressing mode at 0   *

   'Set Memory Addressing Mode
   '00b, Horizontal Addressing Mode
   '01b, Vertical Addressing Mode +++
   '10b, Page Addressing Mode (RESET)
   '11b, Invalid
   I2cwbyte &H20 
   I2cwbyte &B00000000 

   I2cwbyte &H21                                        'Set start and end colomn
   I2cwbyte &B00000000                                  'Column start address, range
   I2cwbyte &B01111111                                  'Column end address, range

   I2cwbyte &H22                                        'Set Start and end page
   I2cwbyte &B00000000                                  'Page start Address, range
   I2cwbyte &B00000111                                  'Page end Address, range

   I2cwbyte &HB0                                        'Set page start address

   I2cwbyte &H40                                        '01000000    Set display start line at 0

   I2cwbyte &H81                                        '10000001    Set contrast
   I2cwbyte &HFF                                        '01111111    7F                                       anders

   I2cwbyte &HA0                                        'Column address is mapped to SEG0 (reset)                                *

   '???
   I2cwbyte &HA8                                        'Set multiplex ratio                                             *
   I2cwbyte &B00111111                                  'at 0F = 15                                                      *

   I2cwbyte &HD3                                        'Set Display Offset
   I2cwbyte &H00                                        'at 00 = 0

   I2cwbyte &HD5                                        'Set display clock divide ratio/oscillator frequency
   I2cwbyte &B10000000                                  'at 80 = 128                                                     anders

   I2cwbyte &HD9                                        'set precharge period
   I2cwbyte &H22                                        'at F1 = 241 (22)

   I2cwbyte &HDA                                        'Set COM pins hardware configuration                             *
   I2cwbyte &H02                                        'at 02 = 2                                                       *

   'I2cwbyte &HDB                                           'Set Vcomm deselect level at 0.77 x Vcc
   'I2cwbyte &H20                                           'at 20 = 32

   I2cwbyte &HC0                                        'Set COM output scan direction in normal C0/C8 - переворот экрана на 180 градусов

   I2cwbyte &HA4                                        'Display follows the RAM content (A4 - follows/ignores - A5)

   I2cwbyte &HA6                                        'Normal display, A6/A7 = inversed

   I2cwbyte &H8D                                        'ChargePump Setting                                              * moet
   I2cwbyte &H14                                        'Enable Charge Pump
   I2cwbyte &HAF                                        '10101111    Display on in normal mode                           * moet
   I2cstop

Адреса соответственно меняем под нужные и настройки (конфигурацию) самого дисплее тоже.

0

19

Ребят, а есть у кого пример по этому диспу ?

0

20

Что значит "пример"?...текста, графики...под какой МК/экран (ибо тогда возможности разные).

0

21

Под ssd1306, одноцветный 128х64 вот такой :
http://artofcircuits.com/wp-content/uploads/2014/06/SSD1306-wht-i2c-oled-display-1.png
Текст и графику )

0

22

Заказал себе такой. А уже потом почитал, что не так все "радужно". Черезстрочная развертка, например.

0

23

Ну это я бы не назвал минусом, всё зависит от конкретной модели/партии производителя самого экрана. Да на некоторых, порой чуть видна на глаз эта черезстрочность, но это скорее исключение из правил. Впрочем я заметил, что большая часть китайцев продают их вне сертификации/стандартов (но тогда цена была бы в 2-3 раза дороже). Т.е. экраны, что работают 24/7, довольно быстро выгорают пиксели (как говорится: "скупой платит дважды").
А в черезстрочности одни плюсы:

- нужна меньшая нагрузка на МК, чтобы получить на выходе плавную, графическую картинку (можно вообще рисовать только четные или нечетные строки (экономия памяти/скорости);
- при съемке камерами, мерцание практически не видно.

Насчет самого дисплея...конкретной этой модели (что на картинке) - такого 1 в 1 не попадалось, а это значит, что: адресация может не совпадать и не быть встроенных шрифтов/ знакогенератора.
Вообще в штатном виде SSD1306 ничего это и не содержит, только голый графический интерфейс и некоторые настройки по части положения экрана (обычный/перевернут), переключение страниц отображения (теневая память), некоторые эффекты с скроллингом (всей области отображения или части).
Соответственно вся работа ведется вокруг этого, алгоритмы вывода текста и графики может быть у каждого своя, в зависимости от задач и хар-к МК. Я по этой причине исходник своих наработок выкладывать не хочу (дабы не было критики или просьб (писал под ХМегу32А4).
Основные строки инициализации описаны выше в этой теме.
У меня алгоритм был такой (мне так проще, но не быстрее):

- создаю буфер для экрана в ОЗУ МК (линейный, без черезстрочности);
- провожу операции с ним (вывод графики, разное логическое наложение, масштабирование);
- вывод/отправка всё на экран.

Могу только добавить, как производится дальнейший обмен данными:

Код:
   ' -= рисуем НЕчетные строки =-
   ' задаем стартовую позицию OLED-экрану
   I2cstart #1
   I2cwbyte Oled_address , #1
   I2cwbyte Oled_command_mode , #1
   I2cwbyte &HB0 , #1
   I2cstop #1

   ' передаём данные в экран
   I2cstart #1
   I2cwbyte Oled_address , #1
   I2cwbyte Oled_data_mode , #1
   ...
            I2cwbyte Oled_i_byte , #1   ' повторяем 512-раз
   ...
   I2cstop #1

Для второй части отрисовки:

Код:
   ' -= рисуем Четные строки =-
   ' задаем стартовую позицию OLED-экрану
   I2cstart #1
   I2cwbyte Oled_address , #1
   I2cwbyte Oled_command_mode , #1
   I2cwbyte &HB4 , #1
   I2cstop #1

   ' передаём данные в экран
   I2cstart #1
   I2cwbyte Oled_address , #1
   I2cwbyte Oled_data_mode , #1
   ...
            I2cwbyte Oled_i_byte , #1   ' повторяем 512-раз
   ...
   I2cstop #1

На работу с экраном, с буфером нужно 1024 байт в ОЗУ.
Вот пример (уже кажется выкладывал).

Чтобы была совместимость с разными моделями экранов, проще вообще отказаться от использования всяческих доп. возможностей, типа интегрированного текста (он то есть, то его нет), проще всегда работать в графике и тогда сокращается надобность знать полностью всю информацию о адресах (которые неизвестны). Исключением данного подхода может быть только то, что МК не имеет нужных хар-к (очень маленький), вот тогда нужно специально подбирать такой экран, в котором работа с текстом 100% есть...мне в этом проекте (ATTINY84), как раз такой понадобился.  :D Только текст.

0

24

А кусочек проги с выводом данных можно ?

0

25

Я же выше пример привел?  :tired:

0

26

Это надо было знать "..текста, графики...под какой МК/экран (ибо тогда возможности разные)." чтобы рассказать общий принцип передачи данных? :D  :D

Так бы и сказал- не дам, а то  вокруг да около

-1

27

Skull написал(а):

Так бы и сказал- не дам, а то  вокруг да около

Я это не говорил!
Идея была привлечь и научить разбираться в SSD1306, если нафиг надо, то пожалуйста:

Код:
$regfile = "xm32a4def.dat"
$hwstack = 64
$swstack = 64
$framesize = 64
$crystal = 32000000

$lib "xmega.lib"
$external _xmegafix_clear
$external _xmegafix_rol_r1014

Config Osc = Enabled , 32mhzosc = Enabled , Extosc = Enabled , Startup = Extclk

Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1

Config Clock = Soft , Rtc = 1khz_32khz_crystosc , Gosub = Sectic

Config Porte.3 = Output
Config Xpin = Porte.3 , Invertio = Enabled                  ' инверсия порта
Led Alias Porte.3

Config Priority = Static , Vector = Application , Lo = Enabled

Dim Twi_start As Byte                                       'This Variable is used by the I2C functions
Open "twic" For Binary As #1
Config Twic = 1200000                                       '1100000
I2cinit #1

Enable Interrupts

Dim A As Word
Dim Oled_cls_stp As Word
Dim Oled_data_i_stp As Word                                
Dim Oled_data_y_step As Byte                              
Dim Oled_data_x_step As Byte                              
Dim Oled_i_byte As Byte                                     
Dim Oled_horizon_line As Byte                           
Dim Oled_page As Byte                                       
Dim Oled_buff(1024) As Byte
Dim Oled_adr_div As Word
Dim Oled_adr As Word
Dim Frm As Byte
Dim Tmp As Word

Const Oled_address = &H78
Const Oled_data_mode = &H40
Const Oled_command_mode = &H80

Gosub Oled_init
Gosub Oled_cls
Wait 1

Do
   ' подготовка картинки, перенос из FLASH в ОЗУ/буфер (по 1 кадру)
   Tmp = 0
   For Frm = 1 To 37                                        ' кадры
      For A = 1 To 768                                      '1024                                           ' 128х64/8=1024 байт
         Oled_buff(a) = Lookup(tmp , Logo)                  'C                                   '&B10100101
         Tmp = Tmp + 1
      Next A
      Gosub Oled_buff_out                                   ' выводим на экран
      Waitms 40
   Next Frm

   For Frm = 35 To 2 Step -1                                ' кадры (чтобы не было повторяющихся)
      Tmp = Frm * 768                                       ' длина одного кадра
      For A = 1 To 768                                      '1024                                           ' 128х64/8=1024 байт
         Oled_buff(a) = Lookup(tmp , Logo)                  'C                                   '&B10100101
         Tmp = Tmp + 1
      Next A
      Gosub Oled_buff_out                                   ' выводим на экран
      Waitms 40
   Next Frm
Loop
End

Sectic:
   Toggle Led
Return

Oled_buff_out:
   ' -= рисуем НЕчетные строки =-
   ' задаем стартовую позицию OLED-экрану
   I2cstart #1
   I2cwbyte Oled_address , #1
   I2cwbyte Oled_command_mode , #1
   I2cwbyte &HB0 , #1
   I2cstop #1

   ' рисуем с особым извращением
   I2cstart #1
   I2cwbyte Oled_address , #1
   I2cwbyte Oled_data_mode , #1

   Oled_adr = 1024
   For Oled_page = 1 To 4                                   ' количество страниц 4
      Oled_adr_div = Oled_adr                               ' стартовый адрес нечетных строк
      ' рисуем 1 страницу/полоску данных из буфера
      For Oled_horizon_line = 1 To 16                       ' строка = 128 / 8 bit = 16 раз
         ' собираем 8 вертикальных пикселей, получаем 8х8 знакоместо
         For Oled_data_x_step = 1 To 8                      ' крутим до байта буфера (8 бит)
            Oled_data_i_stp = Oled_adr_div                  ' адрес буфера в ОЗУ
            Oled_i_byte = 0                                 ' подготавливаем/очищаем байт для будущего вывода
            ' собиралка байта (один вертикальный пиксель из 8 точек)
            For Oled_data_y_step = 1 To 8                   ' подготовка байта для вывода на OLED (8 бит)
               If Oled_buff(oled_data_i_stp).0 = 1 Then Set Oled_i_byte.7
               Rotate Oled_i_byte , Right
               Rotate Oled_buff(oled_data_i_stp) , Right
               Oled_data_i_stp = Oled_data_i_stp - 32       ' x=128bit / 8 = 16 byte * 2 = 32 (interlace)
            Next Oled_data_y_step
            Rotate Oled_i_byte , Left
            I2cwbyte Oled_i_byte , #1
         Next Oled_data_x_step
         Decr Oled_adr_div
      Next Oled_horizon_line
      Oled_adr = Oled_adr - 256
   Next Oled_page
   I2cstop #1


   ' -= рисуем Четные строки =-
   ' задаем стартовую позицию OLED-экрану
   I2cstart #1
   I2cwbyte Oled_address , #1
   I2cwbyte Oled_command_mode , #1
   I2cwbyte &HB4 , #1
   I2cstop #1

   ' рисуем с особым извращением
   I2cstart #1
   I2cwbyte Oled_address , #1
   I2cwbyte Oled_data_mode , #1

   Oled_adr = 1008
   For Oled_page = 1 To 4                                   ' количество страниц 4
      Oled_adr_div = Oled_adr                               ' стартовый адрес нечетных строк
      ' рисуем 1 страницу/полоску данных из буфера
      For Oled_horizon_line = 1 To 16                       ' строка = 128 / 8 bit = 16 раз
         ' собираем 8 вертикальных пикселей, получаем 8х8 знакоместо
         For Oled_data_x_step = 1 To 8                      ' крутим до байта буфера (8 бит)
            Oled_data_i_stp = Oled_adr_div                  ' адрес буфера в ОЗУ
            Oled_i_byte = 0                                 ' подготавливаем/очищаем байт для будущего вывода
            ' собиралка байта (один вертикальный пиксель из 8 точек)
            For Oled_data_y_step = 1 To 8                   ' подготовка байта для вывода на OLED (8 бит)
               If Oled_buff(oled_data_i_stp).0 = 1 Then Set Oled_i_byte.7
               Rotate Oled_i_byte , Right
               Rotate Oled_buff(oled_data_i_stp) , Right
               Oled_data_i_stp = Oled_data_i_stp - 32       ' x=128bit / 8 = 16 byte * 2 = 32 (interlace)
            Next Oled_data_y_step
            Rotate Oled_i_byte , Left
            I2cwbyte Oled_i_byte , #1
         Next Oled_data_x_step
         Decr Oled_adr_div
      Next Oled_horizon_line
      Oled_adr = Oled_adr - 256
   Next Oled_page
   I2cstop #1
Return


Oled_init:
   'OLED initialisation ***********************************************************
   I2cstart #1
   I2cwbyte Oled_address , #1
   I2cwbyte Oled_command_mode , #1
   I2cwbyte &HAE , #1                                       '10101110    Display off

   I2cwbyte &B00000000 , #1                                 'Set lower column start address for page addressing mode at 0

   I2cwbyte &B00010000 , #1                                 'Set higher column start address for page addressing mode at 0   *

   'Set Memory Addressing Mode
   '00b, Horizontal Addressing Mode
   '01b, Vertical Addressing Mode +++
   '10b, Page Addressing Mode (RESET)
   '11b, Invalid
   I2cwbyte &H20 , #1
   I2cwbyte &B00000000 , #1

   I2cwbyte &H21 , #1                                       'Set start and end colomn
   I2cwbyte &B00000000 , #1                                 'Column start address, range
   I2cwbyte &B01111111 , #1                                 'Column end address, range

   I2cwbyte &H22 , #1                                       'Set Start and end page
   I2cwbyte &B00000000 , #1                                 'Page start Address, range
   I2cwbyte &B00000111 , #1                                 'Page end Address, range

   I2cwbyte &HB0 , #1                                       'Set page start address

   I2cwbyte &H40 , #1                                       '01000000    Set display start line at 0

   I2cwbyte &H81 , #1                                       '10000001    Set contrast
   I2cwbyte &HFF , #1                                       '01111111    7F                                       anders

   I2cwbyte &HA0 , #1                                       'Column address is mapped to SEG0 (reset)                                *

   '???
   I2cwbyte &HA8 , #1                                       'Set multiplex ratio                                             *
   I2cwbyte &B00111111 , #1                                 'at 0F = 15                                                      *

   I2cwbyte &HD3 , #1                                       'Set Display Offset
   I2cwbyte &H00 , #1                                       'at 00 = 0

   I2cwbyte &HD5 , #1                                       'Set display clock divide ratio/oscillator frequency
   I2cwbyte &B10000000 , #1                                 'at 80 = 128                                                     anders

   I2cwbyte &HD9 , #1                                       'set precharge period
   I2cwbyte &H22 , #1                                       'at F1 = 241 (22)

   I2cwbyte &HDA , #1                                       'Set COM pins hardware configuration                             *
   I2cwbyte &H02 , #1                                       'at 02 = 2                                                       *

   'I2cwbyte &HDB , #1                                          'Set Vcomm deselect level at 0.77 x Vcc
   'I2cwbyte &H20 , #1                                          'at 20 = 32

   I2cwbyte &HC0 , #1                                       'Set COM output scan direction in normal C0/C8 - переворот экрана на 180 градусов

   I2cwbyte &HA4 , #1                                       'Display follows the RAM content (A4 - follows/ignores - A5)

   I2cwbyte &HA6 , #1                                       'Normal display, A6/A7 = inversed

   I2cwbyte &H8D , #1                                       'ChargePump Setting                                              * moet
   I2cwbyte &H14 , #1                                       'Enable Charge Pump
   I2cwbyte &HAF , #1                                       '10101111    Display on in normal mode                           * moet
   I2cstop #1
Return


Oled_cls:
   'Clear display *****************************************************************
   I2cstart #1
   I2cwbyte Oled_address , #1
   I2cwbyte Oled_data_mode , #1
   For Oled_cls_stp = 1 To 1024
      I2cwbyte 0 , #1
   Next Oled_cls_stp
   I2cstop #1
Return

$inc Logo , Nosize , "kp1.fop"                              ' спрайты 128х48х37шт

0

28

Спасибо!!
Получилось.
http://sh.uploads.ru/t/PeyRT.jpg
Еще вот накопал у немцев :

Код:
' OLED display 128x64 using SSD1306 0.96"
$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 40
$framesize = 40
$lib "i2c_twi.lbx"
Config Scl = Portc.5
Config Sda = Portc.4
Config Twi = 100000

Const Oled_address = &HA2
Const Write_cmd = &H01
Const Oled_reset = &H03
Const Oled_8x16str = &H10

Const Disp_area = &H11
Const Fill_area = &H12
Const Set_scrohor = &H13
Const Set_scrover = &H14
Const Set_scroverhor = &H15

Const Scroll_up = &H01
Const Scroll_down = &H00
Const Scroll_right = &H26
Const Scroll_left = &H27
Const Scroll_vr = &H29
Const Scroll_vl = &H2A
Const Scrollstop = &H2E

Dim A As Byte
Dim B As Byte
Dim C As String * 1

Declare Sub Resetdisplay
Declare Sub Deactivatescroll
Declare Sub Display8x16str(byval Page As Byte , Byval Column As Byte , Byval Char As String * 16)
Declare Sub Scrollingvertical(byval Rowsfixed As Byte , Byval Rowsscroll As Byte , Byval Scrollstep As Byte , Byval Stepdelay As Byte)
Declare Sub Scrollinghorizontal(byval Lr As Byte , Byval Spage As Byte , Byval Epage As Byte , Byval Frames As Byte)
Declare Sub Fillarea(byval Spage As Byte , Byval Epage As Byte , Byval Scolumn As Byte , Byval Ecolumn As Byte , Byval Filldata As Byte)

I2cinit
' Main

Do
   Call Resetdisplay
   Waitms 100
   Call Display8x16str(0 , 0 , "Hello World")
   Call Display8x16str(2 , 0 , "Hello OLED")
   Call Display8x16str(4 , 0 , "0123456789ABCDF")
   Call Display8x16str(6 , 0 , "Bascom AVR")
   Wait 2
   Call Scrollingvertical(0 , 32 , 1 , 250)
   Wait 2
   Call Scrollinghorizontal(&H27 , 4 , 5 , &H07)            ' To left
   Wait 3
   Call Deactivatescroll
   Call Scrollinghorizontal(&H26 , 4 , 5 , &H07)            ' To right
   Wait 3
   Call Deactivatescroll
   Call Fillarea(0 , 7 , 32 , 64 , 3)
   Wait 3
Loop
Sub Fillarea(byval Spage As Byte , Byval Epage As Byte , Byval Scolumn As Byte , Byval Ecolumn As Byte , Byval Filldata As Byte)
   I2cstart
   I2cwbyte Oled_address
   I2cwbyte Fill_area
   I2cwbyte Spage
   I2cwbyte Epage
   I2cwbyte Scolumn
   I2cwbyte Ecolumn
   I2cwbyte Filldata
   I2cstop
End Sub
Sub Deactivatescroll
   I2cstart
   I2cwbyte Oled_address
   I2cwbyte Write_cmd
   I2cwbyte Scrollstop
   I2cstop
End Sub
Sub Scrollinghorizontal(byval Lr As Byte , Byval Spage As Byte , Byval Epage As Byte , Byval Frames As Byte)
   I2cstart
   I2cwbyte Oled_address
   I2cwbyte Set_scrohor
   I2cwbyte Lr
   I2cwbyte Spage
   I2cwbyte Epage
   I2cwbyte Frames
   I2cstop
End Sub
Sub Scrollingvertical(byval Rowsfixed As Byte , Byval Rowsscroll As Byte , Byval Scrollstep As Byte , Byval Stepdelay As Byte)
   I2cstart
   I2cwbyte Oled_address
   I2cwbyte Set_scrover
   I2cwbyte Scroll_up
   I2cwbyte Rowsfixed
   I2cwbyte Rowsscroll
   I2cwbyte Scrollstep
   I2cwbyte Stepdelay
   I2cstop
End Sub
Sub Display8x16str(byval Page As Byte , Byval Column As Byte , Byval Char As String * 16)
   I2cstart
   I2cwbyte Oled_address
   I2cwbyte Oled_8x16str
   I2cwbyte Page
   I2cwbyte Column
   For A = 1 To 16
      C = Mid(char , A , 1)
      B = Asc(c)
      I2cwbyte B
   Next
   I2cstop
End Sub
Sub Resetdisplay
   I2cstart
   I2cwbyte Oled_address
   I2cwbyte Oled_reset
   I2cstop
End Sub

Отредактировано Skull (2015-04-27 22:53:34)

+1

29

Вчера на конец сумел добраться до экранчика: MIDAS MCOT096016AV-WI OLED 96x16 I2C, получилось запустить/разобраться с настройками.
Код инициализации:

Код:
   Const Oled_address = &H78
   Const Oled_data_mode = &H40
   Const Oled_command_mode = &H80
   Const Oled_buff_mem = 192

   I2cstart #1
   I2cwbyte Oled_address , #1
   I2cwbyte Oled_command_mode , #1
   I2cwbyte &HAE , #1                                       '10101110    Display off

   I2cwbyte &B00000000 , #1                                 'Set lower column start address for page addressing mode at 0

   I2cwbyte &B00010000 , #1                                 'Set higher column start address for page addressing mode at 0   *

   I2cwbyte &H20 , #1
   I2cwbyte &B00000000 , #1

   I2cwbyte &H21 , #1                                       'Set start and end colomn
   I2cwbyte 32 , #1                                         'Column start address, range
   I2cwbyte 127 , #1                                        'Column end address, range (&B01111111)

   I2cwbyte &H22 , #1                                       'Set Start and end page
   I2cwbyte 0 , #1                                          'Page start Address, range
   I2cwbyte 1 , #1                                          'Page end Address, range (&B00000111)

   I2cwbyte &HB0 , #1                                       'Set page start address

   I2cwbyte &H40 , #1                                       '01000000    Set display start line at 0

   I2cwbyte &H81 , #1                                       '10000001    Set contrast
   I2cwbyte &HFF , #1                                       '01111111    7F                                       anders

   I2cwbyte &HA0 , #1                                       'Column address is mapped to SEG0 (reset)                                

   I2cwbyte &HA8 , #1                                       'Set multiplex ratio                                             
   I2cwbyte &B00001111 , #1                                 'at 0F = 15 (&B00111111)                                                     

   I2cwbyte &HD3 , #1                                       'Set Display Offset
   I2cwbyte &H00 , #1                                       'at 00 = 0

   I2cwbyte &HD5 , #1                                       'Set display clock divide ratio/oscillator frequency
   I2cwbyte &B10000000 , #1                                 'at 80 = 128                                                     anders

   I2cwbyte &HD9 , #1                                       'set precharge period
   I2cwbyte &H22 , #1                                       'at F1 = 241 (22)

   I2cwbyte &HDA , #1                                       'Set COM pins hardware configuration                             
   I2cwbyte &H02 , #1                                       'at 02 = 2                                                       

   I2cwbyte &HC0 , #1                                       'Set COM output scan direction in normal C0/C8 - переворот экрана на 180 градусов (зеркало)

   I2cwbyte &HA4 , #1                                       'Display follows the RAM content (A4 - follows/ignores - A5)

   I2cwbyte &HA6 , #1                                       'Normal display, A6/A7 = inversed

   I2cwbyte &H8D , #1                                       'ChargePump Setting                                              
   I2cwbyte &H14 , #1                                       'Enable Charge Pump
   I2cwbyte &HAF , #1                                       '10101111    Display on in normal mode                          
   I2cstop #1

Уверенно себя чувствует на 1.2МГц.
Единственное, что удивило, что вывод данных из графической памяти осуществляется не черезстрочно, пришлось чуть упростить/изменить алгоритм вывода данных:

Код:
   ' задаем стартовую позицию OLED-экрану
   I2cstart #1
   I2cwbyte Oled_address , #1
   I2cwbyte Oled_command_mode , #1
   I2cwbyte &HB0 , #1
   I2cstop #1

   ' рисуем с особым извращением
   I2cstart #1
   I2cwbyte Oled_address , #1
   I2cwbyte Oled_data_mode , #1

   Oled_adr_div = Oled_buff_mem                             ' стартовый адрес нечетных строк
   ' рисуем 1 страницу/полоску данных из буфера
   For Oled_horizon_line = 1 To 12                          ' строка = 96 / 8 bit = 12 раз
      ' собираем 8 вертикальных пикселей, получаем 8х8 знакоместо
      For Oled_data_x_step = 1 To 8                         ' крутим до байта буфера (8 бит)
         Oled_data_i_stp = Oled_adr_div                     ' адрес буфера в ОЗУ
         Oled_i_byte = 0                                    ' подготавливаем/очищаем байт для будущего вывода
         ' собиралка байта (один вертикальный пиксель из 8 точек)
         For Oled_data_y_step = 1 To 8                      ' подготовка байта для вывода на OLED (8 бит)
            If Oled_buff(oled_data_i_stp).0 = 1 Then Set Oled_i_byte.7
            Rotate Oled_i_byte , Right
            Rotate Oled_buff(oled_data_i_stp) , Right
            Oled_data_i_stp = Oled_data_i_stp - 12          ' x = 96bit / 8 = 12 byte
         Next Oled_data_y_step
         Rotate Oled_i_byte , Left
         I2cwbyte Oled_i_byte , #1
      Next Oled_data_x_step
      Decr Oled_adr_div
   Next Oled_horizon_line
   I2cstop #1


   ' задаем стартовую позицию OLED-экрану
   I2cstart #1
   I2cwbyte Oled_address , #1
   I2cwbyte Oled_command_mode , #1
   I2cwbyte &HB1 , #1
   I2cstop #1

   ' рисуем с особым извращением
   I2cstart #1
   I2cwbyte Oled_address , #1
   I2cwbyte Oled_data_mode , #1

   Oled_adr_div = Oled_buff_mem / 2                         ' стартовый адрес нечетных строк
   ' рисуем 1 страницу/полоску данных из буфера
   For Oled_horizon_line = 1 To 12                          ' строка = 96 / 8 bit = 12 раз
      ' собираем 8 вертикальных пикселей, получаем 8х8 знакоместо
      For Oled_data_x_step = 1 To 8                         ' крутим до байта буфера (8 бит)
         Oled_data_i_stp = Oled_adr_div                     ' адрес буфера в ОЗУ
         Oled_i_byte = 0                                    ' подготавливаем/очищаем байт для будущего вывода
         ' собиралка байта (один вертикальный пиксель из 8 точек)
         For Oled_data_y_step = 1 To 8                      ' подготовка байта для вывода на OLED (8 бит)
            If Oled_buff(oled_data_i_stp).0 = 1 Then Set Oled_i_byte.7
            Rotate Oled_i_byte , Right
            Rotate Oled_buff(oled_data_i_stp) , Right
            Oled_data_i_stp = Oled_data_i_stp - 12          ' x = 96bit / 8 = 12 byte
         Next Oled_data_y_step
         Rotate Oled_i_byte , Left
         I2cwbyte Oled_i_byte , #1
      Next Oled_data_x_step
      Decr Oled_adr_div
   Next Oled_horizon_line
   I2cstop #1

+1

30

всем привет!!тоже приобрел этот дисплей(SSD1306 128 * 64),но столкнулся с проблемой,в строке после вывода текста или каких либо переменных,в оставшееся свободное место пишутся какие то кракозябры!кто сталкивался с данной проблемой???как их убрать??

Отредактировано shim (2015-05-30 08:35:02)

0


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » OLED 128x64 (UG-2864HSWEG01) на SSD1306