Главная » Микроконтроллеры
Призовой фонд
на октябрь 2021 г.
1. Рюкзак Mean Well
Компэл
2. Инвертор авто Mean Well 150 Ватт
Компэл
3. Термос MeanWell
Компэл
4. 100 руб.
От пользователей

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


Урок 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

Pickit 2 - USB-программатор PIC-микроконтроллеров
Pickit 2 - USB-программатор PIC-микроконтроллеров
Печатная плата для усилителя "LM3886 + AD825" Тестер ESR, полупроводников, резисторов, индуктивностей
вверх