Наверное все помнят легендарный мобильник Nokia 3310? Да, было время когда этот телефон был одним из самых популярных, а теперь разве что найти его можно в запылившихся ящиках столах и на разборках. Но и сейчас он может пригодится в качестве донора деталек для самодельных конструкций. Одна из таких интересных деталек это дисплей от Nokia 3310. Приемуществ у него масса, а именно: маленький, тонкий, графический, работает по SPI, жрёт меньше миллиампера и если покупать то стоит копейки. Вот так он примерно выгядит:
Теперь поговорим о его характеристиках. Разрешение дисплея состовляет 48х84 пикселя. Основой является контроллер PCD8544 выполненный по технологии COG - Chip On Glass, чип на стекле, по этому дисплей очень хрупкий, это следует учитывать при установки, пайки и креплении. Кстати наши китайские братья научились клепать такие дисплейчики, на оригинальном дисплее металлизированные контакты а на китайском металлические штырьки или ещё хуже - резинка. Если волею судьбы вам попался дисплей без контактов, только дорожки на стекле то в таком случае удобно использовать язычки от разьёма PBS, припаял и надел, удобно (сам так делал). И так пришла пора подключить сие чудо к микроконтроллеру и написать прошивку на баскоме! Для начала соберём простую схемку:
Фьюз-биты микроконтроллера в программе SinaProg:
Если смотреть на лицевую сторону дисплея контактами к вверху то выводы считаются с права на лево от 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 файл.
Далее откроем этот файл и увидим массив картинки, перенесём этот массив в конец своей программы предварительно добавив перед каждой строчкой Data. Также дайте название массиву в программе, название пишется в начале массива, в конце названия ставится двоеточие. Для демонстрации я в Paint нарисовал такую картинку:
Перевёл её в массив, добавил 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
Вот так работает она, выводит на дисплей текст:
И картинку:
Вот видео как это работает:
Вот собственно и всё! Если возникнут вопросы задавайте их в комментариях, всегда рад помочь, 73!
Урок 19. Работа с ультразвуковым датчиком расстояния HC-SR04 в BASCOM-AVR
Прикрепленные файлы:
- m8lcd3310.rar (81 Кб)
Комментарии (29) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
[Автор]
[Автор]
Работал с дисплеем от nokia 6280. Вот там уже совсем другая история
[Автор]
[Автор]
Мега 16, частота 8.
[Автор]
D3310dc Alias Portc.2
Config Portc.3 = Output
D3310ce Alias Portc.3
Error1 : Line 40 Unknown statement (.EQU not found for: Pine)
[Автор]
Всё получилось, мешало "Din = None" в конфигурации SPI. Я это убрал и всё пошло как "по -маслу". Ещё раз спасибо автору за труд.
[Автор]
External model DLL "PCD_8544.DLL" not found. GLE=0x0000007E.
Библиотеку прикрутил, проект запускается.
Только на дисплее нет ничего.
Дисплей светится после запуска светло-серым цветом и все.
И все заработает.
Нашел в сети dll-файл модели pcd_8544.dll
и библиотеки OTTO.IDX и OTTO.LIB
скопировал в соответствующие папки с установленным протеусом (версия 8.4)
Проект запускается и ... БЕЛЫЙ экран модели 3310.
Модель не рабочая и DLL по-видимому тоже в новых версиях протеуса.
Нажимаем кнопочку P поиска моделей компонентов и вводим в поиске NOKIA3310
Там есть 2 модели 3310 и 5110, выбираем любую из них и параллельно той модели соединяем.
Все прекрасно работает: вывод текста через строку, инверсный текст и картинка cxem.net
В смысле добавить модель чтобы видеть =экран дисплея=