Об использования графического индикатора, на основе контроллера KS0108, отечественной фирмы МЭЛТ - МТ12864А.

Категория: 1. Индикаторы
Автор: MAZ Просмотров: 106

12864

 Радиолюбители стали применять в своих конструкциях графические индикаторы на основе контроллера KS0108, как простые, доступные и относительно недорогие. Самое интересное, что графические индикаторы, даже такие простейшие, очень удобны для различных радиолюбительских приложений и конструкций, дают настоящую «свободу творчества» в отличие, например: от индикаторов на HD44780 и HT1611/1613 и других привязанных к символам записанных в ОЗУ и месту на индикации. Многие сталкиваются с проблемами управления индикаторами на этом контроллере.

 

         Здесь рассматриваются основные понятия и правила использования графического индикатора, на основе  контроллера KS0108, отечественной фирмы МЭЛТ - МТ12864А. В конце будет предложена простейшая учебная программа для проверки работоспособности индикатора и освоения основ его управления с помощью микроконтроллера.
Общие понятия
Жидкокристаллический модуль МТ12864А. состоит из БИС контроллера управления КБ1013ВГ6, производства ОАО «Ангстрем» ( аналогичен KS0108
фирмы «Samsung») и жк панели. Модуль оснащен встроенной подсветкой,
причем существует возможность питания подсветки от источника питания без включения дополнительных элементов.
Внешний вид модуля (рис.1)

1

Модуль разбит на два кристалла, каждый по 64х64 точки, кристаллы полностью идентичны. Каждой светящейся точки на кристалле соответствует логическая единица в ячейки ОЗУ. Следовательно, ОЗУ каждого кристалла представляет собой 64Х64 ячейки памяти. В индикаторе два кристалла, тогда 64х2х64= 128х64 это все ОЗУ индикатора. Что и отражено в его название.

Модуль может:
- принимать команды с шины данных ( перечень команд ниже)
- записывать данные в ОЗУ по шине данных
- читать данные из ОЗУ на шину данных
- читать состояние служебных бит на шину данных, для определения состояния индикатора
Как обращаться к памяти? Для этого необходимо рассмотреть, как она организована
ОЗУ одного кристалла
Напоминаю, что индикатор состоит из двух одинаковых кристаллов и обращение к ним тоже одинаковое. Надо только выбрать нужный кристалл.
ОЗУ кристаллов на рисунке. На рисунке (рис. 2) показано соответствие между адресом ОЗУ и конкретной точкой выводимой на индикацию

2

 

 

Рассмотрим ОЗУ кристаллов, для конкретного представления, выберем

1 кристалл (левый).
Поле кристалла разбито на 64 столбца и 64 строки. Строки объединены по 8 в одну страницу. Страницы назначаются сверху вниз. Т.е. в кристалле 8 страниц по 8 строк. В каждой странице в одном столбце можно записать 1 байт информации, соответственно, логическая единица - темная точка, логический ноль светлая ячейка. Верхняя строка каждой страницы предназначена для записи младшего бита записываемого байта информации. После записи одного байта информации в страницу, номер столбца автоматически инкрементируется, и позволяет записать следующий байт, и так по кругу.
Выбор страниц осуществляется специальной командой, так же возможно выбирать строки и столбцы. Т.е. в любое время можно указать номер столбца и страницы, «перескочить». Если больше не указанно где выводить информацию контроллер индикатора начнет дальше инкрементировать счетчик номер столбца.
Назначение выводов индикатора
Назначение выводов индикатора указано на рис.3.

3

Рассмотрим подробней назначение выводов.

С 1 и 2 понятно, питание модуля. Здесь рассматриваем питание при 5В. А можно и при 3В.
Выводы 3 и 18 должны быть соединены переменным резистором с сопротивлением от 10-22 кОм, (регулируется угол поворота жидких кристаллов), используются для регулировки контрастности модуля.
Вывод 4 (А0) используется для выбора что будет записываться в модуль по шине данных, команда для модуля или данные для ОЗУ.
Вывод 5 (RD/WR) уровень на этом выводе определяет, будет производиться запись в ОЗУ или чтение из ОЗУ модуля.
Вывод 6 (Е) перепад на этом выводе напряжения с высокого на низкий уровень, является командой для записи в ОЗУ индикатора или чтения данных из ОЗУ находящихся в этот момент на шине данных.
Выводы 7-14, (D0-D7) это и есть восьмиразрядная шина данных.
Выводы 15 и 16 (Е1;Е2), высокий уровень на одном из этих выводов определяет к какому кристаллу индикатора будем обращаться и управлять.
Е1- левый кристалл
Е2- правый кристалл
Вывод 17(RES), предназначен для общего сброса модуля, обычно используется при начальной инициализации.
Выводы 19 и 20 определяют полярность подключения питания для светодиодной подсветки модуля. Здесь есть приятная особенность, если используется для питания модуля 5В., то для включения подсветки достаточно подать это напряжение на выводы. Все уже настроил производитель.

Перечень команд модуля и порядок работы с ними

Команды модуля МЭЛТ 12864 представлены на рисунке (рис.4)

4
Один из вариантов инициализации и порядок работы с командами модуля в Таблице1

tab12864

 

Начальная установка или инициализация модуля

Инициализация может быть еще в нескольких вариантах.
1. Задействовать вывод порта контроллера, при включении, с него подать низкий уровень на вывод RES (сброс) индикатора на время не меньше 1 мкс.
Выполнить команду «включить ЖКИ», подождать не менее 10мкс.
или прочитать состояние бита BUSY (0 - индикатор готов к работе)
2. Задействовать вывод порта контроллера, при включении, с него подать низкий уровень на вывод RES (сброс) индикатора. Через «чтение» опросить индикатор о его состоянии, бит 4, RESET. (при сбросе, индикатор выполняет команду « выключить ЖКИ»). Выполнить команду «включить ЖКИ», подождать не менее 10мкс
3. Вывод RES подключен к шине питания. Программно выполняется команда
« выключить ЖКИ», задержка 1мкс, команда «включить ЖКИ», задержка 10мкс.

Чтение и запись в данных в ОЗУ модуля
Рассматриваем только один кристалл.
Выбираем нужный кристалл, установкой высокого уровня на выводах Е1 или Е2 модуля.
Чтение и запись в ОЗУ модуля осуществляется по страницам. Каждая страница представляет 64 байта (64х8 бит или 64х1байт ). Для чтения или записи байта данных:
- установить ( команда Set Page) номер страницы ОЗУ выбранного кристалла
- установить ( команда Set Address) номер столбца внутри страницы
- установить/ прочитать байт данных в ОЗУ/из ОЗУ
Напоминаю, что модуль поддерживает непрерывную последовательность операций чтения или записи: после записи (или чтения) одного байта данных счетчик столба автоматически увеличивается на 1( инкрементируется) и модуль готов к следующей операции записи (чтения) без предварительной установки страницы ОЗУ или номера столбца. Счетчик столбца считает только внутри одной предварительно выбранной страницы. При достижении адреса столбца 63 следующим значением счетчика будет 0.
Это процесс удобен при непрерывном заполнении данными одной страницы, т.к. не требует предварительных установок. Но если нужно «нарисовать» например вертикальную линию в разных страницах ОЗУ, но в одном столбце, надо перед каждой записью данных указывать номер выбранного столбца и страницу.

Вертикальное смещение отображаемой информации
Модуль позволяет осуществлять плавный сдвиг картинки на ЖКИ по вертикали
изменением номера первой отображаемой строки. Выполняется с помощью команды «Display START Line. Эта команда устанавливает номер самой верхней отображаемой строки. Номер может быть в интервале от 0 до 63, что соответствует интервалу от первой строки нулевой страницы ОЗУ до последней
строки седьмой страницы.
Чем интересен этот режим? Он расширяет возможности применения индикатора.
Можно в зависимости от поставленной задачи выйти как бы за пределы видимой части изображения, расширить картинку. Можно реализовать режим
« строчной развертки» без обратного хода луча.
При некоторых условиях можно получит «третий цвет» на изображение, если в этом есть необходимость. Но режим этот в программном исполнение должен быть тщательно продуман. Общий алгоритм основывается на знаменитых 24 кадрах. Т.е если смену картинки на индикаторе производить со скоростью 24 кадра в секунду и через кадр, например, линию выводить на индикацию, то глаз не успевает отследить эти изменения и появляется третий цвет «серый» линии. Временные параметры этого режима не трудно подсчитать. Смена кадров (картинок изображения) должна происходить через 41,5мС.

Составление простой программы для управления и вывода на индикацию тестового изображения.

Вот и подошли к самому главному. Сам индикатор без микроконтроллера, который будет им управлять, просто красивая стекляшка. Я в основном работаю с микроконтроллерами фирмы «Microchip». Поэтому и предлагаю рассмотреть программу, назову её учебную или тестовую. Написанную на ассемблере. Так как постараюсь её разобрать по подробней и с комментариями, то думаю, если нужно, будет не трудно перейти и на другой тип микроконтроллера.
Схема под тестовую программу изображена на рис.5.

5

Выбран PIC 16F877A. Обосновать это выбор могу только тем, что графический модуль для отображения данных на своем экране должен получить большое количество байтов данных. А у контролеров среднего семейства 8Кб ОЗУ. Если необходимо, чтобы у индикатора «загорелись» все точки, нужно 128х8 байт или 1кбайт ОЗУ. Конечно, такой режим очень маловероятен, но зато понятно какие нужны ресурсы. И это тоже не главное, PIC 16F877A имеет много встроенных периферийных модулей, которые удобно применять совместно с графическим индикатором и большое количество выводов используемых как вх/вых.. МТ12864А не поддерживает 4-х разрядный интерфейс ввода данных, только 8 разрядный. Поэтому нужно будут, как минимум двенадцать выводов микроконтроллера.
И как полезная функция, два вывода можно использовать для внутрисхемного отладчика ICD2. На схеме указан его разъем.
Приступим.
В начале происходит стандартная инициализация микроконтроллера, включаются, отключаются различные режимы его работы, назначаются выводы и т.д. Все стандартно и под конкретную задачу. Обозначу только выводы микроконтроллера работающие с индикатором и они настроены как выходы.

;-----------------------------------------------------------------------------
; назначение выводов портов
;-----------------------------------------------------------------------------
RD0 -шина данных
RD1 -шина данных
RD2 -шина данных
RD3 -шина данных
RD4 -шина данных
RD5 -шина данных
RD6 -шина данных
RD7 -шина данных
RB0 - Е2 ; 2 кристалл
RB1 - Е1 ; 1 кристалл
RB2 - E строб записи/чтения
RB3 - A0 выбор данные/команда
Чтение из модуля не предполагается, поэтому вывод 5 (RD/WR) подключен к общей шине

Инициализация
Выбрал 3 вариант инициализации, как самый простейший.

;-----------------------------------------------------------------------------
; инициализация индикатора 12864А
;-----------------------------------------------------------------------------
         clrf          PORTB
         bsf          PORTB,1         ; включить кристалл №1
         bsf          PORTB,0         ; включить кристалл №2
         movlw     b'00111110'   ; команда "DISPLAY OFF"
         movwf     PORTD           ; команда установлена на шине данных
         call          zap_ypr         ; записать управ. команду
         movlw      b'00111111'  ; команда "DISPLAY ON"
         movwf      PORTD          ; команда установлена на шине данных
         call          zap_ypr         ; записать управ. команду
         movlw      .4                 ; задержка 13мкс ( с запасом 3 мкс)
         movwf      temp            ; для окончания инициализации индикатора
m_1   decfsz      temp
         goto         m_1


инициализация закончена, индикатор готов к работе

Здесь есть подпрограмма «zap_ypr». Она формирует строб на выводе Е, перепад с высокого уровня на низкий, после чего данные, установленные на шине будут переданы в модуль. Так как при ее выполнение, на А0 всегда будет низкий уровень, то можно считать, что она может также передавать команды для индикатора, но не данные.

;-----------------------------------------------------------------------------
; формирование строба и запись команд управления
;-----------------------------------------------------------------------------

zap_ypr                                 ; запись команд (строб)
          bsf         PORTB,2         ; установить высокий уровень на Е
          bcf         PORTB,2         ; установить низкий уровень на Е
           ; при переходе с 1 в 0, производится запись
          nop                              ; задержка для страховки
          return

логическое продолжение этой подпрограммы, которая понадобится в дальнейшем, подпрограмма передачи данных, необходимых для вывода непосредственно на индикацию.
;-----------------------------------------------------------------------------
; запись данных
;-----------------------------------------------------------------------------

zap_dan                                ; запись данных
          bsf         PORTB,3        ; установить признак запись данных (А0)
          call        zap_ypr          ; запись команд (строб)
          bcf         PORTB,3 ; убрать признак запись команд (А0)
          return

остальные «служебные» подпрограммы для включения нужного кристалла, выбора страницы, выбора столбца, из-за простоты не буду рассматривать.
В самой программе есть все комментарии.
Рассмотрим процесс вывода данных на индикатор.
Для того, чтобы вывести данные, их надо для начало где-то взять. Нарисовать нужную картинку, а потом перевести точки одного столбца, одной страницы в двоичную или шестнадцатеричную систему счисления, это не благодарное занятие.
Существуют программы упрощающие этот процесс. Например, журнал Радио №5 2009год. Стр.26 «KS0108»
Эта программа, позволяет нарисовать на индикаторе любое изображение и перевести в готовый код, для каждой страницы памяти индикатора. Что я и сделал.
Выводить данные на индикатор, как уже и было сказано, нужно постранично.
Поэтому в памяти программ контроллера отведены регистры для хранения данных, обращение к ним происходит из программы вывода одной страницы по байтно с помощью директивы dt. Программа вывода страницы последовательно (через вычисляемый переход) опрашивает номера регистров памяти программ контролера и данные находящиеся в них, так же последовательно выводятся на индикацию. После заполнения данными первой страницы ОЗУ индикатора, программно производится переход на вторую страницу и так последовательно до восьмой страницы.
Ещё раз напоминаю, что это учебная программа. И для усвоения порядка вывода данных и получения нужной картинки на индикаторе. Сделана как можно проще и наглядней.

;-----------------------------------------------------------------------------
; запись в 1 страницу 1 кристалла
;-----------------------------------------------------------------------------
            call               ctr_1             ; указать первую страницу
            call               vert_0           ; указать первый столбец
            movlw           .64               ; 64 – число проходов (всего 64 столбца)
            movwf           temp            ; записать во временный регистр число проходов
WR_1   movf             temp,W         ; Копирование содержимого регистра temp в W.
            sublw           .64                ; .64 - temp = ... (результат записывается в W).
            movwf          reg                ; reg сохраняем число для «прыжка» в переходе
            movlw           high TEXT_1  ; записать старший байт счетчика команд метки TEXT_1 в w
            movwf           PCLATH         ; записать W в PCLATH (выбрали страницу памяти где наход. метка TEXT_1)
            call               TEXT_1          ; Переход в ПП TEXT_1.выводим 1 байт данных
            movwf          PORTD           ; записать константу из выч. перех. в PORTD
            movlw          high zap_dan  ; записать старший байт счетчика команд метки zap_dan в w
            movwf          PCLATH          ; записать W в PCLATH
            call               zap_dan         ; записать данные в ОЗУ индикатора
            decfsz t         emp,F            ; Подготовка к выводу на индикацию следующего перехода
            goto             WR_1             ; Если результат декремента не=0, то вывод следующего байта
                                                     ; Если результат декремента равен 0, то переход на вывод следующей страницы.


  Для каждой страницы программы одинаковые по конфигурации, учитываются, только новые ячейки откуда будем брать данные.
А вот и данные первой страницы, которые нужно выводить на индикацию.

;-----------------------------------------------------------------------------
; данные 1 стр 1 кристалла
;-----------------------------------------------------------------------------

TEXT_1           

                       movlw             high ctpa_1 ; записать старший байт счетчика команд метки ctpa_1 в w
                       movwf             PCLATH
                        ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )
                       movf               reg,w           ; переслать в w (насколько перейдем)
                       addlw             low ctpa_1    ; cложить w и младший байт PC метки ctpa_1
                       btfsc               STATUS,C     ; проверить бит С (переполнение)
                       incf                 PCLATH        ;  было, +1 к PCLATH
                       movf               reg,w           ; не было, просто выч. переход.
                       addwf              PCL,F           ; Приращение PCL на величину содержимого W.

ctpa_1
                        dt 0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01
                        dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01
                        dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01
                        dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01

dt - директива, с помощью которой производится побайтное сохранение данных в памяти программ. Эти данные идут последовательно слева направо,
последовательно. Чтобы запись данных была наглядней, я её разбил на 4 строки по 16 байтов, можно и по другому, сути не меняет.
high и low – операторы компилятора, которые помогают распределить в памяти программ контроллера выводимые данные. Распределение характерно для контроллеров фирмы «Microchip», поэтому думаю объяснять их назначение не целесообразно. Если кого, заинтересует их предназначение, то можно прогнать программу в симуляторе и разобраться, для чего они нужны.

После вывода данных первого кристалла, точно таким же образом выводятся данные второго кристалла. Что получилось можно посмотреть на рис.6

7

 

Нарисовал спектр АМ сигнала.

Если нарисовать в программе «KS0108» то, что изображено в 1 странице
1 кристалла и перекодировать то, как раз получатся данные после директивы dt.
Если изменить данные 7,6, и 5 страниц ОЗУ индикатора, а потом вывести на индикацию вместе с картинкой, которая уже выводилась, через один кадр или несколько, спектр «оживет», т.е. будет меняться в течении времени.

Описал, только основы того, что можно сделать использую данный индикатор.
Наверно, нет даже одного процента. Можно реализовать различные шкалы, выводить графики зависимости величин. Индикатор можно развернуть на угол 90о и надписи и рисунки получать в этом положении с нормальным восприятием для пользователя. Все зависит от фантазии разработчика или конкретных задач.
Исходный текст программы можно скачать здесь.
Литература:
1. MT-12864A документация фирмы МЭЛТ


Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2018 © ChipMK.ru

ChipMk.ru Яндекс Метрика