Подписаться на получение новых статей на почту:

Подключаем ЖКИ на базе ks0066 к AVR. Программа на Си. Шаг № 4

Обновлено 23.02.15. Всем привет. Рассмотрев первую программу в статье №3на микроконтроллере, способы настройки Makefile (статья №2), заливки, а также имея «aрсенал» необходимой литературы (статья №1), приступаем чуть к более сложному этапу: подключим ЖКИ к AVR и разберем алгоритм «общения» с ним. Итак начнем с того, что же такое ЖКИ ? Это жидкий  кристалл который помещен в стеклянный кювет. Жидкокристаллический дисплей состоит из нескольких слоев, где ключевую роль играют две стеклянные панели,  на которые наносится тонкий слой металла, образующий электроды. Последние, в свою очередь,  наносятся в виде точек, пиктограмм или сегментов для отображения различных видов информации. Как и во всех устройствах у индикатора есть свои  параметры:

- важным является время релаксации — это то время, которое необходимо для возвращения молекул жидкого кристалла в исходное состояние после выключения поля,  и составляет 30-50 мс. Приемлемо для индикаторов, но не достаточно для компьютерных мониторов. Данный параметр зависит от температуры;

контрастность – зависит также от температуры, при повышении допустимой, четкость падает;
- угол обзора — зависит от скважности динамического режима индикации. Чем больше скважность – тем меньше получается угол обзора индикатора;
Особенностью работы жидкокристаллического индикатора является то, что на него следует подавать переменное напряжение.Это связано с тем, что при подаче на жидкокристаллический индикатор постоянного напряжения происходит электролиз жидкого кристалла и индикатор выходит из строя. Собственно ЖКИ использовать довольно сложно — его управляющие сигналы многочисленны, сложны и, в отличие от простых логических уровней «ноль» и «единичка», имеют много градаций уровней напряжения и тока. Поэтому для управления ЖКИ используются контроллеры.

От общей теории перейдем к практике. Рассмотрим ЖКИ фирмы RAYSTAR RC1602D-YKY-CSX, на базе контроллера ks0066 (Samsung), который является аналогом hd44780, за исключением алгоритма инициализации hd44780.Ну что ж разберем техничексое описание и напишем функции на Си.Контроллер ks0066.

На общей блок-диаграмме видно примерное взаимодействие элементов модуля. Контроллер управляет индикатором а мы будем управлять контроллером. Он имеет свой набор команд, определенные требования по задержкам. Кстати команды обоих контроллеров (hd44780  и ks0066)  идентичны, также и по временным задержкам.
На рисунке ниже приведено описание выводов модуля. С 4 по 14 пин — эти выводы непосредственно подключаются к микроконтроллеру. На блок-диаграмме (выше)  пин №3 подключен к переменному резистору (подстроечному). Регулируя его мы регулируем контрасность. Однако если прибор используется в промышленности то используется другая схема включения для регулировки контрастности в зависимости от переменны температуры.

Interface Pin Function.
Выводы ЖКИ на базе ks0066

Для экономии «ножек» микроконтроллера, при подключениии к ЖКИ,  существует два варианта подключения к шинам данных: 8-ми битная и 4-х битная. Программа для 4-х битного подключения сложней, но зато экономия! В этом варианте байт передаётся в два приёма: на старшую половину шины данных ЖК-модуля, первым передают старший полубайт, затем – младший.
В  даташите описаны алгоритмы для двух режимов работы. Рассмотрим инициализацию  для 4-х битного режима, которая кардинально отличается от аналогичногоконтроллера hd44780.

Напишем функции для работы с ЖКИ.
1.Инициализация 4 –битного интерфейса контроллера ks0066

Инициализация ЖКИ на базе KS0066

На рисунке слева приведен порядок инициализации контроллера ks0066 . Как видно, алгоритм делится на четыре блока: инициализация самого дисплея и строчного режима(одно или двух); включение или выключение управления дисплеем; очистка дисплея; установка режима ввода.

Пусть выводы ЖКИ DB7, DB6, DB5, DB4 соответствуют ножкам PB7,PB6,PB5,PB4 , а выводы RS- PB0, R/W-PB2,Е-PB1. ЗАМЕТЬТЕ ЧТО ЭТО УСЛОВНОСТЬ, МОЖНА БРАТЬ ЛЮБЫЕ НОЖКИ МИКРОКОНТРОЛЛЕРА AVR.

Перед написанием функции используем макросы препроцессора define для настройки программы под другие ножки, т.е. используем приемы универсальности. Данный вопрос мы рассмотрели в статье №20. Итак что б не писать каждый раз строки, например посылки комманды

PORTB = 0×20;                   
_delay_us (2);                       
PORTB |= _BV (PB1);         
_delay_us (2);                        
PORTB &= ~_BV (PB1);    
Длинные строки PORTB |= _BV (PB1);  мы упрощаем путем переопределения в define, а однотипный алгоритм запихиваем в функцию.
#define PORTLC PORTB /*Порт подключения к ЖКИ*/
#define DDRLC DDRB /*Определяем направленность вход/выхода порта*/
#define poryd 0b11110011/*Определяем подключенные ножки порта к ЖКИ*/
#define E PB1  /*Нога подключенная для передачи строба подтверждения передачи данных*/
#define RS PB0  /*Нога для характера(команда или данные) передачи данных*/
#define E1 PORTLC |= _BV (E);      
#define E0 PORTLC &= ~_BV (E);
#define RS1 PORTLC |= _BV (RS); /*RS=1: данные которые следует отобразить*/ 
#define RS0 PORTLC &= ~_BV (RS); /*RS=0: влияющая на режим работы дисплея*/
Все теперь мы можем легко поменять порт и применить программу к другому микроконтроллеру. Пропишем функцию передачи команды.
void  command_lcd (unsigned char cmd)
{
         PORTLC = (cmd & 0xF0); /* Передаем старший полубайт *1111 0000 */
         RS0;   /*Для передачи комманды*/
         E1;     /*Подтверждение передачи данных*/
         _delay_us (2); /* Небольшая задержки для обработки команды    контроллером ЖКИ*/
         E0; /*Окончание импульса строба*/  
         PORTLC = ((cmd & 0x0F) << 4); /*Передаем младший полубайт * 0000 1111*/
         RS0;       
         E1;
         _delay_us (2);
        E0;   
        _delay_us (2);
}

Теперь руководствуясь алгоритмом выше пропишем функцию инициализации.

void Initialization (void) /*Определяем функцию инициализации */
{
         DDRLC = poryd; /*подключенные к жки устанавливаем в 1- выходы, два  не использующихся оставляем как входы */
         PORTLC = 0×00; /*устанавливаем на выходах 0, где по условию RS and RW также должны быть = 0.*/
          _delay_ms (50); /*после подачи питания ждем более 30 мс*/
          command_lcd (0×20);
          command_lcd (0×20);
          command_lcd (0xc0); /*1100 0000, двухстрочный режим и включение дисплея*/
          _delay_us (50); /*задержка более 39 мкс*/
         command_lcd (0xf0); /* 1111 0000 -  включение дисплея, курсора и его мигания*/
         _delay_us (50); /*задержка более 39 мкс*/
       
         command_lcd (0×10);    /*0001 0000 – очистка дисплея*/
         _delay_ms (2); /* задержка более 1,53 мс*/
     
        command_lcd (0×60); /* Последняя команда – выбираем режим ввода */
         _delay_us (50);     /*пауза между командами*/
}

Ниже приведена таблица команд для управления индикатором.

Комманды ks0066

Комманды ks0066

Character Generator ROM Pattern. Таблица возможных символов. Знакогенератор.

Таблица символов ЖКИ ks0066

Таблица символов ЖКИ ks0066

2. Функция установки курсора в нужную позицию на дисплее.

void InstallationCursor (unsigned char x, unsigned char y) /*пердаем в функцию номер символа(знакогенератора ) в строке, и номер строки.*/
{
            unsigned char adr;
            x—;    /*уменьшаем номер ячейки в строке так как начинается с 00*/
            if (y > 1) {adr = x + 64;}  /*если вторая строка, то переводим символ на вторую строку, 64- в десятичной ,соответствует 40 в 16-ричной*/
            else { adr = x;}    /* иначе присваиваем переменной позицию курсора в первой строке, добавляя максимальную длину строки*/
/*Передаем номер ячейки  индикатору для этого проведем побитовое сложение*/
             adr = adr|0×80;    /*0xxx xxxx | 1000 0000*/
             command_lcd (adr);
}

Адресса знакомест на дисплее.

Адресса знакомест на дисплее.

3.Напишем функцию вывода строки, передачи данных и очистка дисплея
void PrintString (char *sign )
{
          unsigned char i;   
          for (i=1;i<17;i++)  /* максимальное количество символов в строке, в шестнадцатеричной форме */
          {
                  if (*sign == 0×00) break; /*Если передаваемый символ равен 0, конец строки, выход*/
                 data_lcd (*sign);  /*иначе передаем код символа индикатору, который распознает его, в соответствии с таблицей символов и выводит соответствующий*/
                  *sign++;                  // переходим к следующему элементу массива
           }
}
Функция передачи данных отличается от передачи команд установкой в 1 вывода RS.
void  data_lcd (unsigned char data)
{
         PORTLC = (data & 0xF0);
         RS1;       
         E1;
         _delay_us (2);
         E0;
 
         PORTLC = ((data & 0x0F) << 4);
         RS1; 
         E1;
         _delay_us (2);
         E0;   
         _delay_us (50);
}

Функция очистки дисплея

void Clear (void)
{
             command_lcd (0×10);
             _delay_us (50); 
}

Выше мы описали самые необходимые функции: инициализация, установка курсора, вывод строки, очистка дисплея. Напишем небольшую программу с использованием этих функций. Как правило все первые программы на микроконтроллерах, начинаются миганием светодиодами. Первые программы в консольном приложении выводом слова HELLO, что ж выведем и мы это первое слово на свой символьный индикатор.

#include <avr/io.h>                           
#include <util/delay.h>    
          
#define PORTLC PORTB               
#define DDRLC DDRB                 
#define poryd 0b11110011          
#define E PB1
#define RS PB0
#define E1 PORTLC |= _BV (E);     
#define E0 PORTLC &= ~_BV (E);
#define RS1 PORTLC |= _BV (RS);     
#define RS0 PORTLC &= ~_BV (RS); 
 //Объявляем функции
void Initialization (void);
void InstallationCursor (unsigned char x, unsigned char y);
void PrintString (char );
int main (void)          /* начало основой программы, главная функция*/
{
             Initialization ();
             InstallationCursor (4, 2);
             _delay_us (50);
             PrintString (“Hello” );
}           /*Определяем выше приведенные функции*/
…………………………………………………

Результат работы программы на рисунке:

Выводим hello на ЖКИ ks0066 и avr  В этой статье были представлены основные функции для работы с ЖКИ. Для лучшего понимания экспериментируем, пробуем писать сами, анализируем другие коды, главное не перепутать полярность питания к ЖК-модуля и не подавать более 5,5В.  В следующей статье №5 научимся работать с семисегментным индикатором и напишем программу на Си.  На этом все. Далее будет…

Литература:
  1. Угрюмов Е. П. Цифровая схемотехника. СПб, БХВ-Петербург, 2004.
  2. Technical specification... RC1602D-YKY-CSX  (22p.)
  3. Technical specification KS0066U — 16COM / 40SEG DRIVER & CONTROLLER FOR DOT MATRIX LCD.  SAMSUNG.
Просмотрено 18253 раз.

Я на Google+

Подключаем ЖКИ на базе ks0066 к AVR. Программа на Си. Шаг № 4: 9 комментариев

    • Все зависит от поставленной задачи. Если постоянный монитроинг одного параметра, то конечно семисегментник, и конечно же зависиит на сколько элементов. если посмотрите следующую статью, где описывается индикатор на три элемента, то видно что задействовано 8+3=11 ножек, а в жки минимум 6. ну и конечно цена отличается в разы.

  1. а дисплей на контроллере KS0066 можно использовать вместо HD44780? говорят, они совместимы, но все таки.

    • Здравствуйте. у них разный алгоритм инициализации, описано в тех.докум.

  2. ЖКИ QC1602A программа типа как у вас в статье, подключение типовое,. При включении загорается верхний ряд знакомест и ничего не происходит!

    Что может быть? В симуляторе проверено.

    • Надо смотреть даташит, и сравнивать алгоритм инициализации. Т.к. может быть другой.

  3. В общем я разобрался, но мне кажется у вас ошибка, должно быть написано sign++; вместо *sign++=0×00; в функции PrintString. В вашем варианте она в бесконечном цикле не работает. Еще хотел заметить почему в этой же фунции i вы сделали 40, если в строке у вас 16 символов и писать больше 16 символов смысла нет. i должно быть 16, мне так кажется.

    • Здравствуйте Григорий. Спасибо в первом случае у меня опечатка , должно быть *sign++. Во втором действительно для точности надо поставить 17.

Добавить комментарий

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting