Главная » Микроконтроллеры
Призовой фонд
на октябрь 2020 г.
1. 1500 руб
Сайт Паяльник
2. Тестер компонентов MG328
Сайт Паяльник
3. 150 руб.
От пользователей

Похожие статьи:



Мотор-редуктор для Arduino

Урок 18. Работа с дисплеем от Nokia 3310

Наверное все помнят легендарный мобильник Nokia 3310? Да, было время когда этот телефон был одним из самых популярных, а теперь разве что найти его можно в запылившихся ящиках столах и на разборках. Но и сейчас он может пригодится в качестве донора деталек для самодельных конструкций. Одна из таких интересных деталек это дисплей от Nokia 3310. Приемуществ у него масса, а именно: маленький, тонкий, графический, работает по SPI, жрёт меньше миллиампера и если покупать то стоит копейки. Вот так он примерно выгядит:

DSC04684.jpg

Теперь поговорим о его характеристиках. Разрешение дисплея состовляет 48х84 пикселя. Основой является контроллер PCD8544 выполненный по технологии COG - Chip On Glass, чип на стекле, по этому дисплей очень хрупкий, это следует учитывать при установки, пайки и креплении. Кстати наши китайские братья научились клепать такие дисплейчики, на оригинальном дисплее металлизированные контакты а на китайском металлические штырьки или ещё хуже - резинка. Если волею судьбы вам попался дисплей без контактов, только дорожки на стекле то в таком случае удобно использовать язычки от разьёма PBS, припаял и надел, удобно (сам так делал). И так пришла пора подключить сие чудо к микроконтроллеру и написать прошивку на баскоме! Для начала соберём простую схемку:

cxem.png

Фьюз-биты микроконтроллера в программе SinaProg:

fuse(6).png

Если смотреть на лицевую сторону дисплея контактами к вверху то выводы считаются с права на лево от 1 до 8. Питание дисплея не должно превышать 3 вольта иниче он может сгореть, хотя некоторые люди запитывали его от 5 вольт и дисплей нормально работал, но вам так делать не советую. Поскольку в дисплее нет знакогенератора то для работы с ним в BASCOM-AVR нужна специальная библиотека взять её можно тут или в файлах к статье. Вообще можно сказать что главный недостаток экранчика заключается в том что в нём нет знакогенератора, поэтому всё символы приходится хранить во flash памяти микроконтроллера, в общем выбирайте микроконтроллер с немалым обьёмом флеша (минимум Atmega8). 

Как собрали схемку можно писать и программу. Для начала установим размер стека и фрейма микроконтроллера для работы с библиотекой, вот так:

$hwstack = 32
$swstack = 8
$framesize = 52

Потом настроим порты к которым у нас подключён дисплей:

Config Portc.2 = Output
D3310dc Alias Portc.2
Config Portc.3 = Output
D3310ce Alias Portc.3
Config Spi = Soft , Din = None , Dout = Portc.1 , Ss = None , Clock = Portc.0

В данном случае: SCL=PORTC.0, SDIN=PORTC.1, D/C=PORTC.2, SCE=PORTC.3. Поскольку у нас используется программный SPI то дисплей можно вешать абсолютно к любым портам микроконтроллера, если вы подключили дисплей к другим портам микроконтроллера нежели на схеме то просто впишите другие названия портов. После того как настроили порты, инициализируем SPI:

Spiinit    

Далее подключим один из файлов библиотеки:

$include "3310init.bas" 

И инициализируем дисплей командой:

Call D3310init 

Всё, теперь можно работать с дисплеем. Вот команды:

Call D3310clear - Очистка дисплея

Call D3310position(x , y) - установка текстовго курсора в позицию экрана x, y

Call D3310print( "txt") - вывод текста txt после текстового курсора

Call D3310invert - Инвертировать пиксели дисплея (Отключенные пиксели включаются, включенные отключаются - инверстный эффект)

Call D3310uninvert - Отмена инвертирования дисплея

Restore Img - Загрузить в память картинку массив которой называется Img

Call D3310bmpout - Вывести картинку загруженную ранее в память

В программе картинка представляет из себя массив который загружается в дисплей. Чтобы вывести свою картинку нужно: нарисовать её в любом графическом редакторе, разрешение должно быть 48х84 пикселя, далее картинку нужно сохранить в чёрно-белом BMP формате. Позже открыть в её специальной программой FastLCD  (при открытии в окошке установите флажок New Size),  потом нажмите на кнопку BAS, выберите флажок HD, SEG, Nokia3310 и сохраните BAS файл.

fcd2.png

flcd.png

fcd3.png

Далее откроем этот файл и увидим массив картинки, перенесём этот массив в конец своей программы предварительно добавив перед каждой строчкой Data. Также дайте название массиву в программе, название пишется в начале массива, в конце названия ставится двоеточие. Для демонстрации я в Paint нарисовал такую картинку:

img.gif

Перевёл её в массив, добавил Data и написал название. Вот что получилось:

Img:
data &h00,&h04,&h08,&h30,&h40,&h80,&h00,&h00,&h00,&h01,&h02,&h04,&h08,&h10,&h20,&h40,
data &h80,&h00,&h00,&h00,&h02,&h04,&h08,&h08,&h10,&h20,&h40,&h40,&h80,&h00,&h00,&h00,
data &h00,&h02,&h04,&h04,&h08,&h10,&h20,&h20,&h40,&h80,&h02,&h04,&h04,&h08,&h10,&h90,
data &hA0,&h40,&h20,&h20,&h10,&h10,&h08,&h04,&h04,&h02,&h02,&h81,&h80,&h40,&h40,&h00,
data &h10,&h10,&h08,&hF8,&hFC,&h02,&h02,&h01,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,
data &h00,&h00,&h00,&h00,&h04,&h18,&h60,&h80,&h00,&h00,&h03,&h04,&h08,&h30,&h40,&h80,
data &h00,&h00,&h00,&h00,&h00,&h03,&h04,&h08,&h10,&h20,&h40,&h80,&h00,&h00,&h00,&h00,
data &h00,&h01,&h02,&h04,&h04,&h08,&h90,&h40,&h40,&h20,&h20,&h10,&h08,&h08,&h04,&h04,
data &h02,&h01,&h01,&h00,&hC0,&hE0,&hC0,&h00,&h00,&hF8,&hFC,&h00,&h00,&hFF,&hFF,&h08,
data &h08,&h84,&h84,&h00,&h00,&h00,&h00,&h1F,&h0F,&h00,&h80,&h40,&h40,&h20,&h10,&h10,
data &h08,&h08,&h04,&h02,&h02,&h01,&h00,&h00,&h60,&h80,&h00,&h00,&h03,&h04,&h18,&h60,
data &h80,&h00,&h00,&h00,&h03,&h04,&h08,&h30,&h40,&h80,&h00,&h00,&h00,&h80,&h40,&h40,
data &h21,&h22,&h10,&h08,&h08,&h04,&h02,&h02,&h01,&hC1,&hC0,&hE0,&h00,&h00,&h80,&h78,
data &hFC,&hFC,&h00,&h00,&h00,&h80,&h00,&h00,&hFF,&h7F,&h00,&h03,&h06,&h1F,&h0F,&h00,
data &h00,&h83,&h43,&h41,&h21,&h20,&h10,&h08,&h08,&h04,&h02,&h02,&h01,&h21,&h40,&h40,
data &h80,&h80,&h00,&h01,&h02,&h04,&h08,&h08,&h10,&h20,&h40,&h00,&h00,&h01,&h06,&h18,
data &h60,&h80,&h00,&h80,&h80,&h43,&h44,&h20,&h10,&h10,&h08,&h08,&h04,&h82,&h02,&h01,
data &h01,&hE0,&h20,&h00,&h00,&hF8,&hFC,&h44,&h22,&h22,&h11,&h00,&h00,&hFF,&hFF,&h01,
data &h3E,&h30,&h0F,&h00,&h0F,&h0F,&h00,&h00,&h83,&h81,&h40,&h20,&h20,&h10,&h08,&h88,
data &h04,&h04,&h02,&h01,&h01,&h00,&h00,&h00,&h00,&h04,&h08,&h08,&h10,&h20,&h40,&h40,
data &h80,&h00,&h00,&h00,&h00,&h00,&h01,&h02,&h02,&h04,&h04,&h08,&h10,&h10,&h20,&h40,
data &h00,&h08,&h04,&h04,&h02,&h02,&h01,&h80,&hC0,&h10,&h10,&h08,&h0C,&h08,&h00,&h00,
data &h03,&hE3,&h3E,&h0E,&h3F,&h38,&h60,&h00,&h00,&h1F,&h0F,&h08,&h04,&h04,&h02,&h80,
data &h80,&h40,&h20,&h20,&h10,&h10,&h08,&h04,&h14,&h22,&h21,&h41,&h40,&h80,&h80,&h00,
data &h00,&h00,&h00,&h00,&h01,&h01,&h02,&h02,&h04,&h04,&h08,&h10,&h10,&h20,&h20,&h40,
data &h40,&h80,&h00,&h00,&h00,&h01,&h02,&h02,&h04,&h08,&h08,&h10,&h20,&h40,&h40,&h80,
data &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h1F,&h30,&h20,&h20,&h10,
data &h0C,&h04,&h00,&h04,&h03,&h00,&h00,&h00,&h00,&h00,&h20,&h10,&h10,&h08,&h04,&h04,
data &h02,&h06,&h09,&h08,&h10,&h20,&h40,&h40,&h80,&h00,&h00,&h00,&h00,&h00,&h00,&h00,
data &h00,&h00,&h00,&h01,&h01,&h02,&h04,&h04,&h08,&h08,&h10,&h10,&h20,&h20,&h40,&h00,
data &h00,&h00,&h00,&h00,&h00,&h00,&h01,&h01,&h02,&h02,&h04,&h04,&h08,&h10,&h10,&h20,
data &h20,&h40,&h40,&h80,&h01,&h02,&h02,&h04

Для демонстрации работы дисплея я написал следующую программу:

$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 8
$framesize = 52


Config Portc.2 = Output
D3310dc Alias Portc.2
Config Portc.3 = Output
D3310ce Alias Portc.3
Config Spi = Soft , Din = None , Dout = Portc.1 , Ss = None , Clock = Portc.0
Spiinit
$include "3310init.bas"

Call D3310init

Do
Call D3310clear
Call D3310position(0 , 0)
Call D3310print( "Hello, world!")
Call D3310position(0 , 3)
Call D3310print( "cxem.net")
Waitms 5000
Call D3310invert
Waitms 5000
Call D3310uninvert
Waitms 5000
Restore Img
Call D3310bmpout
Waitms 5000
Loop
End
$include "3310end.bas"

Img:
data &h00,&h04,&h08,&h30,&h40,&h80,&h00,&h00,&h00,&h01,&h02,&h04,&h08,&h10,&h20,&h40,
data &h80,&h00,&h00,&h00,&h02,&h04,&h08,&h08,&h10,&h20,&h40,&h40,&h80,&h00,&h00,&h00,
data &h00,&h02,&h04,&h04,&h08,&h10,&h20,&h20,&h40,&h80,&h02,&h04,&h04,&h08,&h10,&h90,
data &hA0,&h40,&h20,&h20,&h10,&h10,&h08,&h04,&h04,&h02,&h02,&h81,&h80,&h40,&h40,&h00,
data &h10,&h10,&h08,&hF8,&hFC,&h02,&h02,&h01,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,
data &h00,&h00,&h00,&h00,&h04,&h18,&h60,&h80,&h00,&h00,&h03,&h04,&h08,&h30,&h40,&h80,
data &h00,&h00,&h00,&h00,&h00,&h03,&h04,&h08,&h10,&h20,&h40,&h80,&h00,&h00,&h00,&h00,
data &h00,&h01,&h02,&h04,&h04,&h08,&h90,&h40,&h40,&h20,&h20,&h10,&h08,&h08,&h04,&h04,
data &h02,&h01,&h01,&h00,&hC0,&hE0,&hC0,&h00,&h00,&hF8,&hFC,&h00,&h00,&hFF,&hFF,&h08,
data &h08,&h84,&h84,&h00,&h00,&h00,&h00,&h1F,&h0F,&h00,&h80,&h40,&h40,&h20,&h10,&h10,
data &h08,&h08,&h04,&h02,&h02,&h01,&h00,&h00,&h60,&h80,&h00,&h00,&h03,&h04,&h18,&h60,
data &h80,&h00,&h00,&h00,&h03,&h04,&h08,&h30,&h40,&h80,&h00,&h00,&h00,&h80,&h40,&h40,
data &h21,&h22,&h10,&h08,&h08,&h04,&h02,&h02,&h01,&hC1,&hC0,&hE0,&h00,&h00,&h80,&h78,
data &hFC,&hFC,&h00,&h00,&h00,&h80,&h00,&h00,&hFF,&h7F,&h00,&h03,&h06,&h1F,&h0F,&h00,
data &h00,&h83,&h43,&h41,&h21,&h20,&h10,&h08,&h08,&h04,&h02,&h02,&h01,&h21,&h40,&h40,
data &h80,&h80,&h00,&h01,&h02,&h04,&h08,&h08,&h10,&h20,&h40,&h00,&h00,&h01,&h06,&h18,
data &h60,&h80,&h00,&h80,&h80,&h43,&h44,&h20,&h10,&h10,&h08,&h08,&h04,&h82,&h02,&h01,
data &h01,&hE0,&h20,&h00,&h00,&hF8,&hFC,&h44,&h22,&h22,&h11,&h00,&h00,&hFF,&hFF,&h01,
data &h3E,&h30,&h0F,&h00,&h0F,&h0F,&h00,&h00,&h83,&h81,&h40,&h20,&h20,&h10,&h08,&h88,
data &h04,&h04,&h02,&h01,&h01,&h00,&h00,&h00,&h00,&h04,&h08,&h08,&h10,&h20,&h40,&h40,
data &h80,&h00,&h00,&h00,&h00,&h00,&h01,&h02,&h02,&h04,&h04,&h08,&h10,&h10,&h20,&h40,
data &h00,&h08,&h04,&h04,&h02,&h02,&h01,&h80,&hC0,&h10,&h10,&h08,&h0C,&h08,&h00,&h00,
data &h03,&hE3,&h3E,&h0E,&h3F,&h38,&h60,&h00,&h00,&h1F,&h0F,&h08,&h04,&h04,&h02,&h80,
data &h80,&h40,&h20,&h20,&h10,&h10,&h08,&h04,&h14,&h22,&h21,&h41,&h40,&h80,&h80,&h00,
data &h00,&h00,&h00,&h00,&h01,&h01,&h02,&h02,&h04,&h04,&h08,&h10,&h10,&h20,&h20,&h40,
data &h40,&h80,&h00,&h00,&h00,&h01,&h02,&h02,&h04,&h08,&h08,&h10,&h20,&h40,&h40,&h80,
data &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h1F,&h30,&h20,&h20,&h10,
data &h0C,&h04,&h00,&h04,&h03,&h00,&h00,&h00,&h00,&h00,&h20,&h10,&h10,&h08,&h04,&h04,
data &h02,&h06,&h09,&h08,&h10,&h20,&h40,&h40,&h80,&h00,&h00,&h00,&h00,&h00,&h00,&h00,
data &h00,&h00,&h00,&h01,&h01,&h02,&h04,&h04,&h08,&h08,&h10,&h10,&h20,&h20,&h40,&h00,
data &h00,&h00,&h00,&h00,&h00,&h00,&h01,&h01,&h02,&h02,&h04,&h04,&h08,&h10,&h10,&h20,
data &h20,&h40,&h40,&h80,&h01,&h02,&h02,&h04

Вот так работает она, выводит на дисплей текст:

DSC04679.jpg 

И картинку:

DSC04682.jpg

Вот видео как это работает:

Вот собственно и всё! Если возникнут вопросы задавайте их в комментариях, всегда рад помочь, 73!

Прикрепленные файлы:

Теги:

Опубликована: 0 1
Я собрал 1 2
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 2 чел.

Комментарии (29) | Я собрал (0) | Подписаться

+1
Виктор #
Хорошая статья, мне понравилось. Спасибо автору за труды.
Ответить
0

[Автор]
#
Спасибо! Приятно слышать когда ты трудился не зря!
Ответить
0
Роналду Лионель #
Спасибо, у Вас лучший учебник! Вот только я не нашел дисплея на 3310, но нашел на 1100. Тоже управление через spi 9 битное. Есть на него библиотека?
Ответить
0

[Автор]
#
Вот с 3310 работал я не раз, а с 1100 ни разу но возможно и на него есть библиотека. Смотрите вот здесь
Ответить
0
andreol #
Прошу помощи! У меня вылазит ошибка при попытке отобразить переменную.
Отредактирован 14.03.2015 19:50
Прикрепленный файл: Clock.bas
Ответить
0
Сергей #
А видео как-то можно на нем запустить, ну хотя бы gif?
Ответить
0
ол #
Сергей это же монохром. Черно-белое видео? Ну если вы организуете свой формат ч/б видео, то пожалуйста. Вообще можно, но здесь уже зависит от максимальной скорости SPI дисплея и производительности микроконтроллера. Выводить через DMA или организовать буфер. Плюс еще вам придется расковырять сжатый gif (несколько стандартов) или видео. Думаю этого данный дисплей не стоит.
Работал с дисплеем от nokia 6280. Вот там уже совсем другая история
Ответить
0

[Автор]
#
Можно поочерёдно выводить картинки (кадры)
Ответить
0
Алексей #
А как вывести значение переменной? Что-то у меня не получилось.
Ответить
0
Attiny2313 #
Call 3310print (Имя переменной)
Ответить
0
Вячесав #
Как поставить fuse для поньки?
Ответить
0

[Автор]
#
Установить калочки SUT0, CKSEL3, CKSEL1, CKSEL0, SPIEN, BOOTSZ0, BOOTSZ1. Остальные галочки убрать.
Ответить
0
domrustika #
Написано, что программный SPI можно задавать любые порты. Хотел поменять порты C0 и С1 на D0 и D1, остальное все оставил как есть. Не работает. Вопрос почему?
Мега 16, частота 8.
Ответить
0
Attiny2313 #
А сам МК в проге менял?
Ответить
0

[Автор]
#
Очевидно вы не поменяли конфигурацию портов на выход, а также их метки.
Config Portc.2 = Output
D3310dc Alias Portc.2
Config Portc.3 = Output
D3310ce Alias Portc.3
Также проверьте установку фьюзов для 8 МГц.
Ответить
0
Алексей #
У меня вылетает ошибка при компиляции
Error1 : Line 40 Unknown statement (.EQU not found for: DDRE)
Error1 : Line 40 Unknown statement (.EQU not found for: Pine)
Причём один раз получилось зашить и всё работало в железе. Но захотел кое-что изменить в программе стали выскакивать такие ошибки. Хотя в протеусе всё работает. В чём дело?
Ответить
0

[Автор]
#
Какая у вас версия BASCOM-AVR?
Ответить
0
Алексей #
Версия 2.0.5.0
Всё получилось, мешало "Din = None" в конфигурации SPI. Я это убрал и всё пошло как "по -маслу". Ещё раз спасибо автору за труд.
Ответить
0

[Автор]
#
Отлично! В моей практике бывало что разные версии баскома по разному определяли ошибки в коде.
Ответить
0
koteika #
Отличный урок, очень доходчиво. Ждем урок о дисплее посерьезнее
Ответить
0
timer #
Какая у вес версия бэйсика? Не могу править библиотеку. Ругается на первые строчки...
Ответить
0
Vladimir #
В протеусе получаю вот это
External model DLL "PCD_8544.DLL" not found. GLE=0x0000007E.
Библиотеку прикрутил, проект запускается.
Только на дисплее нет ничего.
Дисплей светится после запуска светло-серым цветом и все.
Ответить
0
OLEGKARAS2 #
А надпись на заднем фоне - ДЕМО ВЕРСИЯ и в железе будет, если да то как ее убрать?
Ответить
0
Vladimir #
В железе не будет
Ответить
0
valdumar #
Качаешь с нета PCD_8544.DLL копируешь ее в библиотеку протеуса (C:/Program Data/Lab centre electronic..../library
И все заработает.
Ответить
0
Сергей #
Такая же беда. Не найдена библиотека использованная в проекте.
Нашел в сети dll-файл модели pcd_8544.dll
и библиотеки OTTO.IDX и OTTO.LIB
скопировал в соответствующие папки с установленным протеусом (версия 8.4)
Проект запускается и ... БЕЛЫЙ экран модели 3310.
Модель не рабочая и DLL по-видимому тоже в новых версиях протеуса.
Нажимаем кнопочку P поиска моделей компонентов и вводим в поиске NOKIA3310
Там есть 2 модели 3310 и 5110, выбираем любую из них и параллельно той модели соединяем.
Все прекрасно работает: вывод текста через строку, инверсный текст и картинка cxem.net
Ответить
0
Сергей #
Подскажите пожалуйста, как одновременно вывести на дисплей и картинку и, например, значение переменной, ну или текст?
Ответить
0
Сергей #
А можно ли в самом Баскоме сделать симуляцию программы с дисплеем от 3310?
В смысле добавить модель чтобы видеть =экран дисплея=
Ответить
0
AnnaKamikawa #
Это единственная библиотека для работы с этим ЖКИ в баскоме? Я так понимаю вывод больших шрифтов в ней не предусмотрен?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Программатор Pickit3
Программатор Pickit3
LC-измеритель LC100-A МиниПК MK809V - 4 ядра, Android 4.4.2
вверх