Главная » Статьи » Как подключить

Работа с дисплеем от Nokia3310
 Когда телефоны были большими, а экранчики в них маленькие, протоколы общения между ними были очень просты. Учитывая цену на них сейчас, использовать такие дисплеи в своих проектах одно удовольствие. Например, у себя в городе приобрел дисплей от 3310 всего за 55 руб.
 Это монохромный дисплей разрешением 48х84 пикселя, с контроллером PCD8544 поддерживающий последовательный интерфейс связи. Для работы дисплея требуется напряжение питания 3,3В и конденсатор 4,7мкФ. Распиновка контактов:



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




 Библиотеку для работы с дисплеем в Bascom-AVR взял отсюда. Эта библиотека позволяет выводить цифровую, текстовую и графическую информацию. Для подготовки картинок нашел замечательную программу FastLCD, которая шла под компилятор FastAVR, но после небольшой доработки выходного файла изображения, можно использовать с этой библиотекой.
 Для примера подготовил картинку в формате BMP разрешением 48 на 84 пикселя, картинка должна быть монохромной:




 В программе создаем или загружаем уже подготовленный BMP-файл. Главное сначала создать новое изображение с нужным разрешением, так как по дефолту загружается поле 128х64 пикселей.



 После создания изображения, перегоняем его в массив данных для библиотеки, кнопкой BAS. Получаем следующий код:


 Который необходимо привести к такому виду (перед каждой строчкой ставим Data):


 Теперь копируем подготовленный массив в файл 3310bmp1.bas
 Компилируем и наблюдаем следующую картину:




 А вот как это выглядит вживую:


 
  Дисплей позволяет выводить информацию как в нормальном отображении:


Так и в инверсном:


  Исходники хорошо комментированы, поэтому проблем с выводом информации на дисплей возникнуть не должно.
 Файлы проекта можно скачать ниже:



Категория: Как подключить | Добавлено: 10.04.2011
Просмотров: 53580 | Комментарии: 83 | Теги: дисплей, SPI, ATmega32, NOKIA3310 | Рейтинг: 4.4/18
Всего комментариев: 83« 1 2 3
23 exersizze   (31.07.2011 08:41) [Материал]
фак йех! глянул у себя, аналогично! Вплоть до 13Мгц показывает как надо, дальше теряет сигнал.
Причем такое наблюдается по всему диапазону частот, ставил в программе 2,5 Мгц в симуляторе 2 Мгц, показывает правильно.

22 ya-zp   (29.07.2011 23:12) [Материал]
...заметил странную особенность : при работе программы с частотой 10 МГц а в протеусе в опциях контроллера выставлено 8 МГц - температура датчика отображается корректно во всем диапазоне температур! Картинки тоже ок. Это только у меня так?

21 exersizze   (29.07.2011 22:52) [Материал]
У меня такого нет, так что эту тему не рыл. А так конечно интересно было бы поработать с цветным дислеем.

20 ya-zp   (29.07.2011 21:36) [Материал]
Жаль, конечно. Но спасибо и за это!
Вопрос немножко не по теме, думаю будет интерестен не только мне - а есть наработки с дисплеем на контроллере LS020 от Siemens CX65?

19 exersizze   (29.07.2011 20:52) [Материал]
Отлично! Заметил что протеус хреново работает с датчиком 18b20, иногда нормально показываем, иногда чёрти-что.
С данной библиотекой никак( выше я описал принцип вывода информации на дисплей, она происходит побайтно и поэтому максимумальная высота знакоместа 8 точек. Придется придумывать свой алгоритм работы с контроллером дисплея.

18 ya-zp   (28.07.2011 23:41) [Материал]
Проверил все в железе, делал на Меге8, все работает. Спасибо за консультацию. Есть еще вопросик: как создать свой шрифт? Мне нужны цифры почти на весь размер дисплея.

17 exersizze   (26.07.2011 20:47) [Материал]
присвоение надо делать наоборот: Y=T1 да и от самой переменной Y можно избавиться, сразу делать преобразование переменной T1: Temp_d=Str(T1)
а так вроде все верно, должно работать. К сожалению нет возможности проверить в железе, а протеус показывает ерунду, так что попробуйте прошить микроконтроллер.Удачи!

16 ya-zp   (25.07.2011 23:56) [Материал]
Доброго времени суток. Привожу обещанный код:

$regfile = "m16def.dat"

'This is v2.0 with support for printing bitmap images.

$crystal = 8000000
$hwstack = 32 ' default
$swstack = 8 ' default
$framesize = 52 ' minimum for this library. Increase for your application needs!

Dim Strstring As String * 14 'Just used for this demo
Dim C As Byte
Dim Temp_d As String * 10
Dim Sign_d As String * 10
Dim Y As Byte

Config 1wire = Portb.2
Dim Byte0 As Byte
Dim Byte1 As Byte
Dim Sign As String * 1
Dim T1 As Byte
Dim T2 As Byte
Dim I As Integer

Dim T As Byte

Config Portd.7 = Output
D3310dc Alias Portd.7

Config Portb.0 = Output
D3310ce Alias Portb.0

Config Portb.7 = Output
D3310re Alias Portb.7

'Configure SPI in soft mode
Config Spi = Soft , Din = Portb.1 , Dout = Portd.6 , Ss = None , Clock = Portd.5

'Initialise Spi
Spiinit

$include "3310init.bas"

'Initialise the display
Call D3310reset
Call D3310init
Call D3310clear

'Main program loop
Do
1wreset

If Err = 1 Then 'если при опросе небыло ответа ставим флаг ошибки

Call D3310clear
Call D3310position(3 , 3) 'назначаем позицию на индикаторе
Call D3310print( "No signal")

Wait 1

Else ' иначе, если ошибки не было, продолжаем опрос датчика

1wwrite &HCC ' Выдаем команду чтения ПЗУ
1wwrite &H44 ' Запуск измерения

Waitms 750 ' Ждем окончания преобразования

1wreset
1wwrite &HCC
1wwrite &HBE ' Команда чтения ОЗУ датчика

Byte0 = 1wread() ' Читаем нулевой байт

Byte1 = 1wread() ' Читаем первый байт

If Byte1 > 248 Then ' Проверка на отрицательность температуры
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Sign = "-"

Else
Sign = "+"
End If

T1 = Byte0 / 16 ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 16 ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)

T1 = T1 + T2 ' Формируем результат для вывода на дисплей

' *** Коррекция полученных значений

If Sign = "-" Then ' для корректного вывода отрицательных температур
T1 = T1 + 1
End If

If Sign = "+" And T1 = 0 Then ' убираем знак "+" с нулевой температуры
Sign = " "
End If
T1 = Y

Temp_d = Str(y)

' *** Выводим результат на дисплей

Rem Температура
Call D3310clear
Call D3310position(1 , 1)
Call D3310print(temp_d)

Wait 1
End If

Loop

Stop

$include "3310end.bas"

...только не смейтесь - это пока "гадкий утенок" smile

15 exersizze   (24.07.2011 19:14) [Материал]
перед записью дисплей очищается? а вообще да, лучше выложите код.

14 ya-zp   (23.07.2011 19:11) [Материал]
...код тоже остался на работе.
Проблема в отображении температуры. При подключении (в протеусе пока) индикатора 2х16 - все нормально. А при использовании дисплея от Нокии - какие-то случайные цифры. После выходных выложу наброски программы.

13 Gordon_shumway   (21.07.2011 19:32) [Материал]
Теперь только в понедельник, ибо все на работе, а я в пятницу решил отдохнуть. А что не получается ? Или пришлите код, посмотрим...

12 ya-zp   (21.07.2011 19:29) [Материал]
...а можно взглянуть на код. А то я снова в тупике((

11 ya-zp   (01.07.2011 17:01) [Материал]
Спасибо, суть идеи поймана, на днях попробую.

10 Gordon_shumway   (30.06.2011 18:14) [Материал]
Нужно из цифрового значения сделать строчное:

Пример:

Dim x as string*10 'значение для вывода
Dim y as byte ' значение для счета ваших данных

тело программы, по итогам получаем значение y

x= str(y)

Call D3310position(6 , 3) 'назначаем позицию на индикаторе
Call D3310print(x) 'выводим

или так :

Call D3310position(2 , 3) 'назначаем позицию на индикаторе
Call D3310print("Var:") 'выводим слово Var

Call D3310position(6 , 3) 'назначаем позицию на индикаторе
Call D3310print(x) 'выводим значение x

Выведется:
Var:значение

Вот примерно так.

9 Gordon_shumway   (30.06.2011 15:34) [Материал]
Спасибо ! Он у меня практически закончен - с картинками, максимумом и минимумом, вообще сам в восторге !

8 Gordon_shumway   (30.06.2011 15:32) [Материал]
Без проблем, но только после 6 июля, когда из отпуска выйду - я этим на работе занимался, все там кроме собственно девайса - он на выявлении глюков дома.

7 ya-zp   (30.06.2011 12:21) [Материал]
привет всем!
А можно взглянуть на исходник термометра? Сейчас занимаюся тем же, только для бойлера. Не получается выводить на индикатор цифровые значения. Хотелось бы взглянуть как это реализовано у вас

6 exersizze   (17.05.2011 19:18) [Материал]
Поздравляю ! Теперь сможете фиксировать аномальную летнюю жару, это скоро будет актуально biggrin
Просмотрел тему на радиокоте с вашим термометром, зачетно получилось =)

5 Gordon_shumway   (17.05.2011 17:17) [Материал]
Доброго времени суток !
Спасибо, символ градуса получился.
Сделал на основе ваших примеров термометр с выводом на этот экран, только добавил отображение десятых долей градуса и максимум/минимум за время измерения. На меге8, работает !" smile

Спасибо за разъяснения !


+1   Спам
4 exersizze   (16.05.2011 19:37) [Материал]
Можно вот этим. Расставляешь единички как надо и сгенерированный код копируешь в 3310end.bas, там думаю все ясно будет, если что спрашивай.

3 Gordon_shumway   (16.05.2011 15:09) [Материал]
Доброго времени суток !

Спасибо за ответ !

А как вывести символ градуса (маленький кружок вверху) ?
Нельзя ли поподробнее про свои символы ? К примеру нужен символ 2х2 знакоместа...

Спасибо !


+1   Спам
2 exersizze   (16.05.2011 01:32) [Материал]
Высота фиксирована 7 пикселей на шрифт +1 пиксель на межстрочное расстояние, итого 8 пикселей на одну строку. Связано с тем, что запись в контроллер дисплея идет побайтно - отправили один байт, закрасили один столбик, и так 6 раз (5 на символ +1 на отступ). Поэтому надо будет выводить как картинку или рисовать свои символы, разбивать на части и эти части выводить в разных строках. Другого пока придумать не смог smile

1 Gordon_shumway   (14.05.2011 18:23) [Материал]
Доброго времени суток !
А возможно ли вывести буквы и цифры размером больше, чем в Вашем примере ?
Или размер символов фиксирован ?
Спасибо !

1-30 31-60 61-83
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






авторизация
Логин:
Пароль: