Содержание
Урок 1. Первый проект
Урок 2. Управление кнопками
Урок 3. Подключение LCD
Урок 4. Использование ШИМ
Урок 5. Таймеры
Урок 6.1. Статическая индикация
Урок 6.2. Динамическая индикация
Урок 7.1. Генерация звука
Урок 7.2. Генерация звука. Продолжение
Урок 8.1. Передача данных через UART
Урок 8.2. Передача данных через UART. Продолжение»
Урок 9. Передача данных через SPI
Урок 10. Изучение АЦП. Простой вольтметр
Урок 11. Получение синуса при помощи ШИМ
Урок 12. Измерение температуры
Урок 13. Внешние прерывания.
Урок 14. Использование отладчика
Урок 15.1. Управление инкрементальным энкодером
Урок 15.2. Управление громкостью, при помощи энкодера
Урок 16. Управление RGB светодиодом
Урок 17. Использование ИК
Урок 18.1. Знакомство с графическим дисплеем
Урок 18.2 Вывод изображения на графический дисплей
Урок 18.3 Вывод русскоязычного текста
Урок 19. Формирование сигнала, при помощи ЦАП (R2R)
Урок 20. Опрос матричной клавиатуры
Урок 21. Сторожевой таймер
Урок 22.1 Воспроизведение wav. Введение.
Урок 22.2 Воспроизведение wav. Продолжение.
Урок 23.1 Работа с внешней памятью
Урок 23.2 Работа с файловой системой Fat

Мы научились: управлять микроконтроллером и управлять чем то, при помощи микроконтроллера. Теперь, чтобы сделать наше устройство более дружелюбным, будем к нему подключать дисплей.

Сразу оговорюсь дисплей — символьный. Это значит что внутри у него, в памяти, уже есть алфавит. Все что нам нужно — дать команду вывести строку.

Дисплеи бывают разные: разный цвет подсветки экрана, разное количество строк, разное количество символов в строке. Поэтому, здесь рассматривается дисплей 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).

Еще один важный момент — микроконтроллер должен тактироваться от кварцевого резонатора, в противном случае корректная работа не гарантируется.

Внешний вид прошитого устройства

Файл прошивки и протеуса доступны тут

206 комментариев: Урок 3. Как подключить ЖК(LCD) дисплей к AVR микроконтроллеру

  • спасиботза внимание,но я это сделал правда по другому немного…суть в том что смысл одинаков,а вот при выборе кнопки она записывается в переменную которая выводит на экран состояние в массиве,но потом сбрасывает так как в неё записывается другое значение другой кнопки и так далее…на lcd висят цифры допустим 2,6,9 как например сравнить что именно они введены..
    тоесть я хочу чтоб при нажатии клавиши цифры соответствующим кнопки выводили на lcd цифру(это есть и оно реализовано)а вот как потом сравнить что были нажаты определённые кнопки а точнее те цифры которые хранятся в еепром их сравнить с набранными и выполнить действие…
    еепром,вывод на lcd и опрос кнопок сделано, нужно только код где записать эти значения по порядку введенных для дальнейшей их работы,а быть точнее проверка введенных с ранее записанных в еепром…
    в интернете есть много схем кодового замка,но я хотел бы сам понять весь процесс и разобраться…исходники это не то,там гораздо сложнее чем написать самому,вот только в этом зпгвозка»в сравнении введённых кнопок с значением в переменной в памяти еепром»…

  • допустим так я нажал на кнопку она вывела нажатие допустим 2 на lcd..
    пишуи ее так допустим

    if (button[2]==0) lcd_putchar(2); delay_ms(10); //если нажата клавиша 2

    мой кусок кода вывода на lcd цифры два,но как добавить эту цифру в переменную скажем
    code_ente

    if (button[2]==0) lcd_putchar(2); code_enter=2; delay_ms(10); //если нажата клавиша 2

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

  • Я в своих прошивках делаю по другому, способ несколько геморный, но зато работает. Есть опрос кнопок:
    void scan_kb()
    {
    for(i=0; i<4; i++)
    {
    PORTD=portState[i];
    for(j=0; j<4; j++)
    {
    if(((PIND&inputState[j])==0))
    {
    while((PIND&inputState[j])!=inputState[j]){};
    key_code = mass2[i][j];
    }
    }
    }
    }

    теперь где то дальше по прошивке обрабатываем
    if(key_code != 'x')
    {
    lcd_putchar(key_code+0x30);
    password[i] = key_code;
    i++;
    key_code = 'x';
    }

    Думаю смысл понятен

  • Спасибо большое,наконец то разобрался…
    смысл понял,все ратотает…я не правельно вызывал функцию…теперь запоминает..за основу взял ваш выбор процедуры и записи…
    спасибо огоромное:)

  • А как подключить вот такой дисплейчик: LTBFAN582S1C?

  • Андрей, хз такой не юзал

  • Ув. Админ, в коде есть строка
    .equ __lcd_port=0x12
    Что значат эти цифры (12) и откуда их брать. Нашёл в примерах кода, что для подключения дисплея к порту D надо прописать шестнадцатеричные 18 вместо 12. Но не могу понять, откуда брать это число?

  • Допустим для Atmega8 открываем даташит находим таблицу Register summary, 0x18 это адрес портаВ
    register summary

  • Добрый день. прошу помощи. Есть необходимость использовать аналоговый компаратор (Атмега 16). Он висит на порту D. Хотел дисплей перевесить на порт С.
    Глянул даташит, инициализировал его на порт С 0x15

    Так вот, в протеусе моделирую все работает. прошиваю железку — болт! И цоколевку проверил уже, и все что можно. В чем может быть проблема? Заранее спасибо.

    #asm
    .equ __lcd_port=0x15
    #endasm
    #include

  • Аналоговый компаратор не юзал, но насколько знаю он «железно» висит на портуВ AIN0, AIN1 для меги16, т.е. нельзя назначить его на другой порт.

  • Блин, прочитал свой пост. Ахинею написал! Я хотел дисплей на порт С навесить, а не компаратор. Проблему решил. Изначально у меня там несколько битов не работали (как будто сгорели). Я инициализировал порт С на выход и выводил туда 0. Не на всех пинах был 0. Дисплей тоже не пахал на этом порту. Причиной переноса был как раз компаратор, из-за того что дисплей висел на порту D компаратор срабатывал при попытке что-нибудь вытащить на дисплей.

    В общем проблему решилась сбросом фьюза JTAGEN (записал туда 1). И все заработало!

    Вероятно кто-то еще сталкивался с такой проблемой, так что информацией я поделился =)

  • Как избавится от сигнала RW? Нужен свободный пин. Мне не надо читать с дисплея.

  • Использовать другую библиотеку.

  • Добрый День,Вечер !
    Подскажите подключил к Атмеге 8535 -WH1602
    к порту С.
    какие настройки нужны D порт занят.
    #include
    #asm
    .equ __lcd_port=0x12
    #endasm
    #include

    void main(void)
    {

    PORTC=0x00;
    DDRC=0x00;

    lcd_init(16);

  • я могу помочь только с тем что у меня есть, мелтовскую продукцию не использую

  • Добрый день!!! Подскажите пожалуйста как можно уменьшить моргание дисплея. Ведь он очень часто стирается и обновляется запись.
    Как вариант вывел на дисплей надпись и если нет ни каких изменений пускай светится. Если произошло изменение то тогда стирать и выводить новую запись. Но как это осуществить?

  • Анализируйте изменение, допустим запоминаете температуру old_temp = temp, после очередного измерения if(old_temp != temp){lcd_clear(); lcd_puts(temp);} т.е. температура будет обновляться на дисплее только тогда, когда ее значение изменилось. Вообще не обязательно очищать дисплей если выводить сообщения одинаковой длины, допустим так:

    lcd_puts("hello    "); 
    lcd_puts("avr      ");
  • Так тоже не надо делать. Первый вариант правильней. Я наелся мерцанием когда заполнял картинку заряда АКБ. В итоге проверял на выход из текущего диапазона вольтажа и все мерцания пропали. Для символов это тоже самое. Что будет если менять попеременно первую запись со второй? По любому будут мерцать буквы lo так как они каждый раз затирауются пробелами.

  • Подскажите как подключить LCD если по умолчанию у него стоит 8-ми битный режим. Как его переключить в 4-х битный или же какие библиотеки есть для 8-ми битного режима для CodeVisionAVR.

  • В CAVR режимы 4-8 бита не переключаются, но вообще это делается на этапе инициализации, почитать можно тут http://avr-start.ru/?p=2048

  • А где скачать proteus и admin какой у тебя дисплей ?

  • Дисплей wh0802a, ссылки на софт не оставляю

  • О, admin , оставь распиновку дисплея .

  • В таблице указана распиновка для wh0802, но она может отличаться

  • Admin,а почему в новой версии CodeVisionAVR пишет, что есть ошибка в строке : .equ __lcd_port=0x12 в непонятном
    Файле , а в старо CodeVisionAVR что нет ошибок и сохраняет файл (и того файла нет? ).

  • в новой версии ножки задаются в свойствах проекта

  • Admin, а как задавать в свойствах проекта.

  • project-configure-c compiler-libraries

  • Спасибо

  • Добрый день. Проблема с ЖК WH1602C.По началу было всё хорошо,выводил текст,потом в один прекрасный момент,начался неровный контраст,две линии пикселей вообще перестали гореть.Думал с Д портом косяк,проверил- работает.Поставил на А,тоже самое. Вот фото

  • Пробовал резинки протирать спиртом- толку нуль

  • Скорее всего крякнул дисплей.

  • admin,жаль

  • Не подскажите как можно заставить дисплей выводить свои символы? Или как поменять таблицу символов вшитую в дисплей?

  • Вшитую таблицу менять нельзя, можно выводить помойму до трех пользовательских символа. Посмотрите статью, там я рисовал символ будильника http://avr-start.ru/?p=1587

  • Т.е. таким образом нарисовать можно только 3 символа и вывести их?

  • только 3

  • День добрый. А подскажите пожалуйста — есть ли возможность подключить 2 дисплея на разные порты. Пробовал менять значение .equ __lcd_port=0x15 — команда отрабатывает, но перезаписываться не хочет…причем при компиляции ни на что не ругается, а только когда build делаю пишет «Error occured during assembly».

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

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

Последние комментарии
  • Загрузка...
Счетчик
Яндекс.Метрика