AVR Урок 12. LCD индикатор 16×2. Часть 4

 

 

 

 

Урок 12

Часть 4

 

LCD индикатор 16×2

 

 

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

Вернёмся в проект Atmel Studio.

В прошлой части мы завершили инициализацию дисплея.

Теперь хотелось бы что-нибудь увидеть на дисплее. Для этого нам нужна будет ещё одна функция, которая будет передавать только данные, а не команду

 

//—————————————-

void sendchar(unsigned char c)

{

sendbyte(c,1);

}

//—————————————-

 

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

Ну и давайте попробуем в дисплей передать пару каких-нибудь символов в функции main()

 

LCD_ini(); //Инициализируем дисплей

sendchar('n');

sendchar('m');

while(1)

 

Соберём код и запустим проект в протеусе.

Всё работает и мы видим следующую картину. В видеоуроке была ошибка, но потом она была исправлена, хотя я думал, что не было изображения из-за того, что не написана была функция позиционирования. Вот так работает дисплей

 

image20

 

Собственно, теперь давайте всё-таки напишем функцию позиционирования, чтобы мы могли выводить символы не только подряд, но и в любое место диспелея. Назовём ее setpos. Вообще данная функция будет устанавливать указатель в определенное место DDRAM. Выше была показана таблица организации данной памяти и соответствия её ячеек определённым знакоместам на дисплее. Будем этого и придерживаться при написании кода. Напишем нашу функцию после функции sendchar

 

//—————————————-

void setpos(unsigned char x, unsigned y)

{

}

//—————————————-

 

Ну, соответственно, у функции будет два входных аргумента — позиция по горизонтали и позиция по вертикали.

Добавим переменную типа char и вычислим её значение в зависимости от значений x и y. Значения входных аргументов мы будем начинать от нуля, а не от единицы. Поэтому чтобы вычислить адрес по y в памяти DDRAM, нам достаточно умножить значение y на 0x40, так как именно с данного адреса начинается 2 строка, а у нас она будет выглядеть как 1. Затем прибавляем x, тем самым получим смещение по горизонтали в данной памяти. И ещё по операции "ИЛИ" вычисленное значение мы сложим с двоичным числом 0b10000000, так как команда передачи адреса памяти DDRAM выглядит вот так

 

image21

 

То есть в 6 бите мы передаём единицу для того, чтобы контроллер дисплея "понял" что мы даём именно такую команду — передача адреса памяти DDRAM, чтобы контроллер дисплея установил указатель именно туда, какую позицию мы даём ему в оставшихся семи младших битах — DB6-DB0.

 

 

Вот такой мы получим код функции

 

void setpos(unsigned char x, unsigned y)

{

  char adress;

  adress=(0x40*y+x)|0b10000000;

  sendbyte(adress, 0);

}

 

Ну и давайте теперь вызовем данную функцию в функции main для порядка, установив жёстко перед вызовом фунции вывода символа указатель памяти на нулевой адрес

 

LCD_ini(); //Инициализируем дисплей

setpos(0,0);

sendchar('n');

 

Проверим на всякий случай сборку кода и запуск в протеусе. Всё работает, но эффекта данной функции мы не прочувствуем, пока не попробуем вывести ещё какие-нибудь симвовлы куда-то в другое место дисплея. Например, вот так

 

sendchar('m');

setpos(8,0);

sendchar('x');

sendchar('f');

 

После сборки и запуска мы должны увидеть вот такой результат

 

image22

 

Также давайте что-нибудь выведем на другую строку дисплея

 

sendchar('f');

setpos(8,1);

sendchar('r');

sendchar('e');

 

А вот и результат

 

image23

 

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

Также ещё мы научимся модульному программированию,то есть писать код мы будем не в один файл, а в несколько, что позволит избавиться от лишнего кода в главном файле или модуле, а поместить код, который включает в себя реализацию какой-то отдельной задачи в программе в отдельный модуль или библиотеку.

 

Предыдущая часть Программирование МК AVR Следующая часть

 

Техническая документация на дисплей

Техническая документация на контроллер дисплея HD44780

 

Программатор и дисплей можно приобрести здесь:

Программатор (продавец надёжный) USBASP USBISP 2.0

Дисплей LCD 16×2

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

AVR LCD индикатор 16×2

5 комментариев на “AVR Урок 12. LCD индикатор 16×2. Часть 4
  1. Riverman:

    Владимир, подскажите как вывести на LCD значение переменной ,

    например

    unsigned char Time_mode;

    • Евгений:

      char не бывает signed, или я совсем ничего не понимаю в форматах.

      Если переменная один символ:

      char Time_mode;

      то вывод на экран будет  выглядеть так:

      sendchar(Time_mode);

      • Евгений:

        Да, про char в общем случае, я наврал. Бывает и unsigned char, и signed char, и просто char. Зависит от реализации. Так как давно работаю с реализацией char'а как unsigned, то и в голове между ними стоял знак равенства.

  2. Михаил:

    В протеусе все замечательно, но у меня на реальном дисплее все, что не занято выводимыми символами было забито нулями или знаками курсора.

    Потом дошло, что не хватает очистки экрана. Добавил в инициализацию: 

    sendbyte(0b00000001, 0); // очистка дисплея
    _delay_ms(1);

    Хотя, наверное, правильнее сделать в виде функции и вызывать по мере надобности.

  3. Алексей:

    Как передать значения переменной
    unsigned char menu_tar=1;
    if(menu_tar==1){setpos(0,0); str_lcd(«Menu PWM:»); sendbyte(menu_tar, 1);}
    if(menu_tar==1){setpos(0,0); str_lcd(«Menu PWM:»); str_lcd(menu_tar);} Думал так должно работать. Но тоже не то. Ну очень нужно. Всю голову сломал.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*