Мы научились: управлять микроконтроллером и управлять чем то, при помощи микроконтроллера. Теперь, чтобы сделать наше устройство более дружелюбным, будем к нему подключать дисплей.
Сразу оговорюсь дисплей — символьный. Это значит что внутри у него, в памяти, уже есть алфавит. Все что нам нужно — дать команду вывести строку.
Дисплеи бывают разные: разный цвет подсветки экрана, разное количество строк, разное количество символов в строке. Поэтому, здесь рассматривается дисплей WH0802A-YGK-CT, 2 строки по 8 символов, подсветка желтая светодиодная.
Создадим проект в CodeVision. На вкладке LCD укажем порт, к которому будет подключен наш дисплей (PORTD). В строке Char/Line указываем количество символов нашего ЖК дисплея (8).
Генерируем, сохраняем проект. Приводим код к следующему виду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <mega8.h> #asm .equ __lcd_port=0x12 ;PORTD #endasm #include <lcd.h> void main(void) { PORTD=0x00; DDRD=0x00; lcd_init(8); while (1) { }; } |
Добавились новые строчки
#asm .equ __lcd_port=0x12 #endasm |
Дисплей подключен к PORTD |
#include <lcd.h> | Библиотека для работы с LCD дисплеями |
Немного изменим код нашей программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include <mega8.h> #asm .equ __lcd_port=0x12 #endasm #include <lcd.h> void main(void) { PORTD=0x00; DDRD=0x00; lcd_init(8); lcd_gotoxy(0,0); lcd_putsf("lesson3"); #pragma rl+ lcd_gotoxy(0,1); lcd_putsf("Урок3"); #pragma rl- while (1) { }; } |
lcd_gotoxy(0,0); | Переставить курсор в координату ХУ,х – позиция по горизонтали,у – по вертикали |
lcd_putsf(«lesson3»); | Вывести слово lesson3 на LCD дисплей |
#pragma rl+ lcd_putsf(«Урок3»); #pragma rl- |
Данная директива позволяет вывести на экран русский алфавит, при условии что дисплей его поддерживает |
Запустим получившийся код на симуляцию в ISIS Proteus. Как видно первая строчка отображается правильно, а вот вторая кракозябами. Дело в том, что протеус не распознает русский алфавит и если ваш дисплей не будет поддерживать его, то на реальном дисплее тоже будут непонятные символы.
Теперь нужно опробовать все это на настоящем дисплее. Тут есть свои нюансы. Открываем даташит на наш дисплейчик и видим такую вот таблицу с распиновкой:
Наверное, тут все очевидно, но все же:
1 — Земля 0В.
2 — Питание +5В.
3 — Управление контрастностью. Подключается через переменный резистор.
Светодиодная подсветка. Подключаем как обычный светодиод.
А — подключаем к «+» через токоограничивающий резистор, К — подключаем к «земле» (GND).
Еще один важный момент — микроконтроллер должен тактироваться от кварцевого резонатора, в противном случае корректная работа не гарантируется.
Внешний вид прошитого устройства
Файл прошивки и протеуса доступны тут
думаю вряд ли, ибо библиотека не узнает какому именно дисплею адресована команда, пишите свою либу.
Можно подключить хоть три дисплея. Картинка на дисплее статична и при отключении ножек, данные не теряет, лишь бы питание не отключалось. Для подключения нужно поставить два, или сколько дисплеев нужно, регистра защёлки с тремя состояниями и по необходимости переключаться на нужный дисплей. Таким образом один порт может управлять бесконечным числом дисплеев. Это называется мультиплексирование. Можно вопрос. А зачем на одном МК два дисплея? Я такого ещё не встречал. 🙂
Алексей, может практическое применение и не нужно — интересен сам момент. Переключать внешне как-то.. да, вариант, но мне было интересно именно задействовать разные порты на МК, чтобы переключение между ними программно реализовать )
Тогда следуйте примеру admin и пишите свою библу. Со всеми отладками день работы с пивком. Я под студию шестую наваял за два часа. Данный дисплей очень прост в управлении. Сначала инициализируйте его, а потом только подкидывайте команды. У МЭЛТ можно скачать доку на русском. Их ЖК аналогичны Винстаровским.
Ув. Админ, хочу вывести на экран многозначное число. Раньше пользовался последовательным делением на 10 и преобразованием float в int (отброс дробной части), прознал про функцию sprintf — очень удобно. Но есть одно НО! Она выводит десятичные числа только до 65536, затем выводит разность между числом и 65536. В конфигурации проекта выставил при компилировании (s)printf long, width, саму переменную и long прописывал и long long — ничего не помогает! Может вы чем подсобите? Код выглядит так:
long s=69000;
char l[6];
if (PINC.4==1 && PINC.3==1) // условие
{
lcd_clear();
lcd_gotoxy(0,0);
sprintf(l,»%u», s) ;
lcd_puts (l);
lcd_gotoxy(6,0);
lcd_putsf(«ms»);
}
На экране получаю 3464 ms вместо положенных 69000
попробуйте
пробовал, тогда на экране тот же результат 3464 с буквой «l» на конце
stdio.h подключен, может какая библиотека эта модифицированная? Использую CV AVR 3.12
тьфу) наоборот
Здравствуйте админ подскажите какой частоте должен быть кварц
8мгц
Здравствуйте тов. admin
Прошу помочь разобраться в следующей ситуации.
Есть переменные char k0=0x00,k1=0x16,k2=0xDD,k3=0xDF;
для вывода на дисплей использую sprintf(buffer,»%X%X%X%X»,k0,k1,k2,k3);
Хочу получить вывод информации на дисплей по этим четырем переменным из buffer бинарный вид. Как это можно сделать?
Т.е. нужно получить из этих переменных buffer=0000 0000 0001 0110 1101 1101 1101 1111, далее я эти числа/символы переведу в целые числа x=atoi(buffer); затем выведу на дисплей в десятичном виде (должно получиться число 1498591).
может есть готовое решение, но пока приходит в голову только проверка побитно, т.е.
if((k0 && 0b00000001) == 1)
{
lcd_putchar(‘1’)
}
else
lcd_putchar(‘0’);
и так далее проверяем в цикле каждый бит
Здравствуйте , уважаемый admin
1)Ведь порт D работает на LCD дисплей , на выход.
тогда почему в примере порт D объявлен , как вход DDRD=0x00; ?
Ведь запись DDRD=0x00; означает , что ни один из контактов порта D не работает , как выход ? Или я не то спрашиваю ?
2) посоветуйте добрую книжку про Си для таких как я , такую-же дружественную , как у Вас.
где про синтаксис , чуть-чуть по-подробнее ))
Спасибо.
Дисплей настраивается внутри lcd_init поэтому не важно что написано до нее. А вот если объявить порт как вход после lcd_init, то да работать не будет. Посоветовать могу 2 основные книжки: 1. Дейтел, Как Программировать на СИ, 2. Язык программирования Си Керниган Ричи. Очень много доступных видеоуроков на Youtube
Дейтел. 1454 страницы ( ещё раз — Полторы Тысячи Страниц ! ) — Спаасибо , Дорогой admin ! (((((((((((((((((((((((((((((((((((((((
мне-б книжку-раскраску , страниц на 6 и без английских букавак (((((((((((((((((
Смотрите видосы на ютубе их мильены, ищите подходящий формат
luzerok, смотрите Кочан Стефан «Программирование на языке Си». Всего 500 стр. А вообще — если занялись программированием — привыкайте к толстым книгам))))
спасибо, идея ясна.
Здравствуйте тов. admin. Не подошло мне такое решение. По другому попробую задачу поставить. Есть четыре переменные char k0=0x00,k1=0x16,k2=0xDD,k3=0xDF; из этих переменных хочу получить float k5=0x0016DDDF; Как их можно объединить?
либо сдвигом, либо указателем
со сдвигом не получилось, но значит думал в правильном направлении. еще раз попробую. про указатели почитаю — не знаю про них ничего…спасибо
тут почитайте http://avr-start.ru/?p=1966
Еще раз внимательно протестировал. Со сдвигом все получилось. Еще раз спасибо.
здравствуйте админ
Спасибо за ваши бескорыстные старания помочь людям.
У меня такой вопрос.
Где можно скачать ту версию CVAVR где соединения ножек LCD задается в свойствах проекта?
В любой версии. Отличия лишь в том что, либо жестко один порт, либо на разных пинах.
Уважаемый Админ, как в ЖК 16*2 на контроллере ks0070b вывести информацию на вторую строку, никак не получается даже в Proteus, функция lcd_gotoxy(0.1); не помогает.
Алексей,
не совсем понятно,что значит в любой версии.
т.е. в одной и той же версии есть и то и другое?
в версиях до 2 настраивалось через ассемблерную вставку, начиная с версии 2 можно и через настройку проекта, и через вставку.
может проблема в том что в этой строке lcd_gotoxy(0.1); разделитель запятая должна быть? Если нет, то скорее всего проблема в инициализации, либо читайте даташит, либо ищите готовую либу.
Здравствуйте , уважаемый admin.
Не увидел разъяснений по поводу подключения контроллера и LCD.
Решил воспроизвести проект, но в CodeVision настройку порта не делал, в просто скопировал код программы.
В строке .equ __lcd_port=0x12 ;PORTD понятно, что в первые 3 бита порта D записываются 1,1 и 0 соответственно. В проекте Proteus видно, что данные выводятся в биты D4-D7. Как контроллер понял, что именно туда идет вывод данных и разве в коде программы это указано ?
в первых версиях CAVR было достаточно выбрать порт микроконтроллера, компилятор сам докинет все что нужно за вас. в версиях 2+ ноги можно выбирать в настройках. либа дисплея закрытая, поэтому если хотите чтобы все было под контролем, качайте отдельную либу, интернет ими кишит.
Уважаемый Админ, ок, а что насчет физического подключения МК к ЖКИ ? Как узнать, какие именно биты порта МК будут заведены на пины ЖКИ ?
в первых версиях p0-p3 — управляющие, p4-p7 — данные, во второй настраиваются на любые пины
Увидел ваш последний комментарий)
качайте отдельную либу, интернет ими кишит. (с)
Сломал моск).Давече почитал статью о подключение жки к авр.) Там был описан выбор способа подключения по 4 или по 8 шинам данных) На Си, но ничего не сказано про визард) там была такая функция определения))
* функция инициализации работы жки
в 4-битном режиме, без курсора */
void lcd_init()
{
_delay_ms(15);
lcd_putnibble(0b00000011);
_delay_ms(4);
lcd_putnibble(0b00000011);
_delay_us(100);
lcd_putnibble(0b00000011);
_delay_ms(1);
lcd_putnibble(0b00000010);
_delay_ms(1);
lcd_putbyte(0x28, LCD_COMMAND);
_delay_ms(1);
lcd_putbyte(0x0C, LCD_COMMAND);
_delay_ms(1);
lcd_putbyte(0x06, LCD_COMMAND);
_delay_ms(1);
}
И там автор настраивает отдельно управляющие пины .Можно ли назвать это «либой»?
П.С Я серьезно)
Админ) все не надо)) я нашел вашу статью о том как писать библиотеки) ааа теперь кое-что прояснилось)) спасибо)))
ПОМОГИТЕ НЕУКУ 😳
почему при компиляции выдает нет соответствия if 😳 ( no matching if)
{
if (PINC.0==0)
lcd_gotoxy(0,0);
lcd_putsf («I love you»);
lcd_gotoxy(0,1);
lcd_putsf («We love other»);
else
lcd_clear();
}
Достаточно расставить скобки if{операторы}else{операторы} и все ок. Прошу прощения. 😳
Ув. Админ подскажите пожалуйста (можно с примерами) где почитать про команды (ассемблеровские) типа очистить дисплей, вывести число (переменную), вывести число с плавающей точкой и т.п чтобы можно было ими манипулировать в проекте, просто незнание команд заставляет порой извращаться… Спасибо.
Дико извиняюсь не ассемблеровские команды, а СИ команды.. Не всегда понятно что означают к примеру sprintf(l,»%lu», s) %lu?
Если речь идет про «стандартные» функции, почитать про них можно в любой книжке про си/с++