Главная » Статьи » PICBasicPro |
Инициализация LCD Nokia 3310
Знакомство с микроконтроллерами, как и у всех, у меня началось с «подмигивания» светодиодом. Это очень быстро надоело и я начал искать более информативные девайсы для представления информации. Под руку подвернулась статья в интернете про термометр на основе LCD дисплея от Nokia 3310. Немного погуглив, выяснилось, что не один я хотел использовать экран от этого телефона, но готового проекта понятного написанного на языке Pro picBasic я не нашёл. Да и интересно было самому разобраться, как работают с LCD дисплеями и шрифтами на самом низком уровне. LCD дисплей от Nokia 3310 (Рис.1) (Datasheet для Nokia 3310). Это графический чёрно-белый ЖК дисплей, использующий контроллер PCD8544 с разрешение матрицы 84х48 точек, имеет последовательный интерфейс SPI с максимальной скоростью обмена 4 мбит/с. Напряжение питания +2.7в...+3.6в. Обозначения выводов приведены в таблице: Вывод..Название..Функция 1..| VDD..| Питание +2.7...+3.3В 2..|SCLK..|Тактовый сигнал SPI 3..|SDIN..|Линия данных SPI 4..|DC....|Режим: данные(HIGH)/команда(LOW) 5..|SCE....|Выбор кристалла (LOW) 6..|GND ...|Земля 7..|VOUT .|Внутреннее напряжение 8..|RES....|Сброс (LOW/HIGH) Для подсоединения проводов к контактам надо постараться сделать (найти) разъём, но в крайнем случае можно припаять проводки прямо к контактам. При этом нужно быть крайне осторожным дабы не перегреть контакты и не испортить стекло. Дисплей питается от 3,3 вольтах. Чтобы подключить дисплей к микроконтроллеру, который питается от 5 вольт понадобиться небольшая развязка(Рис.2). Между выводом 7 VOUT и землёй дожен быть подключен конденсатор ёмкостью 1..10 мкФ(керамика или электролит) - фильтр для внутреннего источника питания LCD. Вывод 5 SCE можно сразу подцепить на землю.При нуле на SCE – чип дисплея принимает данные с входящей линии, при единице – находится в состоянии высокого импеданса, то есть отключён от линии.(сигнал ноль-активен).Назначение остальных выводом узнаем по ходу статьи. Немного теории о том, как организована работа контроллера этого экрана. Сразу после подачи питания экран необходимо сбросить, подав на вывод RES "0". Это нужно сделать обязательно, иначе можно повредить контроллер! После сброса (перевод RES "0"->"1") контроллер готов к записи. Чтение из контроллера не предусмотрено. Применяется стандартный SPI протокол: на вывод SCE подаётся активный низкий уровень, и по линии SDIN вводятся биты данных. Защёлкивание бита осуществляется по переднему фронту SCLK, сдвиг по заднему, данные передаются старшим битом вперёд (MSB). Если во время передачи последнего бита из восьми на выводе D/C логическая "1", то запись производится в память данных, иначе в управляющие регистры. Для задания режима работы служат несколько управляющих регистров. Запись в них происходит при "0" на выводе DC.....( LOW DC ) ссылка на таблицу управляющих регистров Reserved приведённый регистор команд являются резервированными и его использование недопустимо и далее где будет такой регистр мы будем его пропускать так он не предоставляет нам интереса(хотя практически им тоже можно побаловаться можите почитать тут). Function set 0 0010 0PVH управление питанием, способ ввода, выбор расширенных инструкций. Команда Function Set изменяет 3 управляющих бита контроллера: • P - PowerDown; P=0 - кристалл включен; P=1 - кристалл в режиме низкого эн.потребления • V - адресация; V=1 - увеличивается указатель адреса строк(вертикальная адресация); V=0 - столбцов(горизонтальная адресация); • Н - набор инструкций; H=0 - обычный; H=1 - расширенный Write Data 1 dddd dddd запись данных в память дисплея..просто передача байта в память экрана, dddd dddd - просто байт данных. Набор инструкций для H=0-обычный: Display Control 0 0000 1D0E режимы отображения. Команда Display Control включает следующие режимы отображения: • D=0, E=0 - дисплей пустой • D=1, E=0 - обычный режим ("0" - светлая точка, "1"-тёмная) • D=0, E=1 - все элементы включены • D=1, E=1 - режим инверсии ("1" - светлая точка, "0"-тёмная) Set Y 0 0100 0YYY установить адрес строки Set X 0 1XXX XXXX установить адрес столбца Набор инструкций для H=1 - расширенный : Temperature Control 0 0000 01TT установить температурный коэффициент для ТС1 и ТС2 изходя из таблице(Table 2) Bias System 0 0001 0BBB выбрать систему питания, таблица(Table 4 Programming the required bias system) Set Vop 0 1VVV VVVV включить напряжение питания дисплея пункт(8.9 Set VOP value) Значение и аргументы команд с H=1 объяснять долго и сложно, поэтому предлагаю воспользоваться чисто дилетантским приёмом. Ставьте: TT=10, BBB=011, VVVVVVV=100 1000, и всё будет! Тем, кто с таким подходом не согласен - читайте даташиты. Ну с настройкой управляющих регистров разобрались, теперь перейдем к непосредственно выводу информаций на дисплей. Весь экран разбит на банки – полосы толщиной в 8 бит и длинной в ширину экрана (48px). Всё время производится непрерывный вывод информации из видеопамяти непосредственно на матрицу: вывод по умолчанию "прямой” (единица в видеопамяти соответствует чёрному пикселю). Меняя байты видеопамяти экрана, вы меняете и само изображение. Для вывода информации в общем случае необходимо установить курсор в нужный банк и в нужную позицию по иксу. Делается это следующим образом: Выставляем на лини LOW DC (режим команд) передаём по SPI байт с командой. 0х40+номер банка (0…5) передаём по SPI байт с командой. 0х80+иксовая координата (0…83) выставляем на лини D/C единицу (режим вывода изображения) Каждому столбцу (Xi) данной строки (Yj)соответствует 1 байт памяти (Рис.4), причем верхнему пикселю соответствует младший бит (LSB). Выбрав номер строки и столбца (см. чуть выше), передаём байт в память данных, и он отображается на экране столбиком 8х1. После записи байта автоматически увеличивается на единицу указатель адреса столбца. Поэтому следующий байт отобразится в той-же строке но со сдвигом на 1 пиксель вправо. Если при записи достигнут конец строки y=yi; x=83 то происходит переход на следующую строчку y=yi+1; x=0. Вышесказанное справедливо для случая когда бит адресации V=0. При V=1 заполнение происходит по аналогии, но каждый последующий байт отображается со сдвигом на 8 пикселей вниз. Примечание. Движение курсора и расположение банков можно настраивать. С теорией разобрались, перейдем к практике. Подключения дисплея и МК можно посмотреть на (рис.2) Code
'Текст программы инициализации LCD дисплея Nokia 3310 '---------------------------------------------------------------------------------------------------------------------------------------------------- DC VAR GPIO.2 'определяем порты которым подключен дисплей DTA VAR GPIO.1 ' я использовал pic12f629 соответственно GPIO.X RST VAR GPIO.4 CLK VAR GPIO.0 '-------------------------------определяем переменные----------------------------------------------------------------------------------------- Chr VAR Byte ' Счетчик цикла For для очистки экрана PosX VAR Byte 'Позиция курсора по Х координате PosY VAR Byte 'Позиция курсора по Y координате LcdData VAR Byte ' Данные для отправки по SPI PAUSE 100 GOSUB LCD_INIT ' Подпрограмма инициализации дисплея PAUSE 100 GOSUB LCD_Clear ' Подпрограмма очистки дисплея main: 'основная программа 'сдесь заполним в следущей статье end '--------------------------------------Подпрограмма инициализации дисплея----------------------------------------------------------------- LCD_Init: ' Подпрограмма инициализации дисплея LOW RST :pause 20 : HIGH RST 'Сброс и Окончание Сброса LCD LOW DC 'Низкий уровень режим Kоманд LcdData= $20: GOSUB LCD_ByteOut ' Команда Function Set ($20 = % 0010 0000) P=0 ,V=1,H=0 - обычный LcdData= $0c: GOSUB LCD_ByteOut ' Команда Display Control ($0c = % 0000 1100) D=1, E=0 LcdData= $21: GOSUB LCD_ByteOut ' Команда Function Set ($21 = % 0010 0001) P=0 ,V=1,H=1-расширенный LcdData= $06: GOSUB LCD_ByteOut ' Temperature Control ($06 = 0000 0110) установить температурный коэффициент LcdData= $13: GOSUB LCD_ByteOut ' Bias System ($13 = 0001 0011) выбрать систему питания LcdData= $c8: GOSUB LCD_ByteOut ' Set Vop ($c8 = 1100 1000) включить напряжение питания дисплея RETURN '------------------------------------------подпрограмма для передачи Команд по SPI ------------------------------------------------------ 'данную подпрограмму стоит выделить отдельно от всего процесса инициализации, так как к ней будем постоянно 'обращаться чтобы передать Команды управляющим регистрам LCD_ByteOut: 'подпрограмма для передачи Команд по SPI SHIFTOUT DTA,CLK,1,[LcdData] 'передаём по SPI байт с командой. RETURN '-------------------------------------------Подпрограмма очистки дисплея--------------------------------------------------------------------- LCD_Clear: ' Подпрограмма очистки дисплея PosX=0:PosY=0 'Устанавливаем X=0,Y=0 начало координат GOSUB LCD_GotoXY HIGH DC 'Высокий уровень режим Данных FOR Chr=1 TO 252 'Очищаем дисплей заполняя его "0" - светлыми точки LcdData=0:GOSUB LCD_ByteOut LcdData=0:GOSUB LCD_ByteOut NEXT Chr RETURN '-------------------------------Подпрограмма определения положения курсора------------------------------------------------------------ 'данную подпрограмму стоит выделить отдельно от всего процесса инициализации, так как к ней будем постоянно 'обращаться чтобы установить нужную для нас строку или столбец LCD_GotoXY: 'определяем место положения курсора LOW DC 'Низкий уровень режим команд LcdData=%01000000 | PosY :GOSUB LCD_ByteOut ' 0х40+номер банка (0…5) LcdData=%10000000 | PosX :GOSUB LCD_ByteOut ' 0х80+иксовая координата (0…83) RETURN В итоге в процессе инициализации LCD дисплея требуется выполнить один раз подпрограмму LCD_Init: и больше в процессе работы программы нет надобности к ней обращаться. Подпрограмма LCD_Clear: вам понадобиться если придеть очистить экран от предыдущих записей(скажем большого изображения) Как я и писал ранее в комментария подпрограммы (LCD_GotoXY: , LCD_ByteOut:) вы будете часто обращаться, что бы скажем сделать экран инверсным, поменять строку,столбец В следущей статье рассмотрим вывод текстового сообщения на дисплей | |
Просмотров: 23926 | | |
Всего комментариев: 0 | |