Содержание
Урок 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 микроконтроллеру

  • Не правильно задал вопрос — команды для работы с ЖК дисплеем. Спасибо

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

  • Админ, научите общаться с VGA мониторами. Это очень интересная тема! У Вас получится

  • Почему выводим на дисплей что то в функции main а не в бесконечном цикле while(1) через if();? main читается один раз для инициализации.

  • как раз для того чтобы 1 раз вывести

  • Админ. Можно с вами через почту связаться? Проблема заключается в следующем. Накидал на меге8 подсчет скорости авто на датчик 6-ти импульсный. На бумаге при 120 импульсах должно вывестись на экран 144км/ч. А в протеусе выводится постоянно в два раза меньше, т.е. 72км/ч. Частота меги 8мгц. В протеусе так же.

  • что за беда; беру проект из скачанного урока, при компиляции пишет ошибку неизвестная директива

    #pragma rl+

    #pragma rl-

    }

  • CAVR версии 2 и выше не поддерживают кириллицу. Соответственно прагмы не работают

  • #include
    #include
    void main(void)
    {

    lcd_init(8);
    lcd_gotoxy(0,0);
    lcd_putsf(«lesson3»);

    lcd_gotoxy(0,1);
    lcd_putsf(«lesson3»);

    while (1)
    {
    // Place your code here

    }
    }
    не понимаю почему это работает, где настройки портов искать, и как их можно изменить если будет нужно?

  • видимо что в скобках не пишет
    #include mega8.h
    #include alcd.h

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

  • Компилятор CVAVR 2.05 ругается на директиву…
    #pragma rl+
    lcd_gotoxy(0,1);
    lcd_putsf("Урок3");
    #pragma rl-

    Эта директива не поддерживается? Подключал как lcd.h так и alcd.h.

  • не поддерживается

  • Здравствуйте. Помогите с таким вопросом. Вкратце опишу логику программы: за определённое время результат подсчёта Timer1 выводится на lcd. Если Timer1 переполняетя, то подсчитывается кол-во переполнений.
    Unsigned char a; // кол-во переполнений
    Unsigned long int Resultat;// результат, который выводится на lcd
    Resultat=(65535*a)+TCNT1; по такой формуле вычисляют результат.
    Так вот, если Resultat не превышает 65535, то всё в порядке.А если результат равен 70000, то на дисплее выводится 4465. Для вывода использую функцию sprintsf

  • надо приводить результат к long

  • Можно, пожалуйста, по-подробнее… Что вот эта строчка означает?
    .equ __lcd_port=0x12

  • это мы уже проходили…. 😛
    equ __lcd_port=0x12
    это на асемблере значит что дисплей подключенн к порту D,( PORTC — 0x15, PORTB — 0x18)
    А я теперь ищю либу для кодевижина, чтобы подключить LCD по шине I2C через PCF8574, на ардуино там всё просто, а для кодевижина проблематично. 🙁

  • Уважаемый! Подскажите как мне вывести данные с порта на LCD вывести . я опросил порт PORTB на нем к примеру 127, поместил в переменную, а на LCD не как вывести? мозга не хватает! Будьте добры…

  • Здравствуйте, я недавно начал осваивать программирование микроконтроллеров, и сейчас уже решил попробовать использование LCD индикаторов. Но я чтото немогу понять почему в приведеных здесь примерах (например во втором измененом коде программы) в строчках:
    11 PORTD=0x00;
    12 DDRD=0x00;
    PORTD инициализируется на вход с выысокоимпедансным входом, а ведь вроде этот порт должен работать на выход.

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

  • Уважаемий админ!
    У меня совсем каша, я запутался с тем как вывести число с переменной типа int на дисплей.
    Не могли бы вы на примере разъяснить какие масивы, какие указатели где берутся и как типы данных преобразовать (если это нужно)…
    Я делаю проэкт с электронной линейкой, в качестве датчика энкодер, дисплеем временно заменяю семисегменты для того чтобы в протеусе можно было работать, могу результат отдать на общее обозрение…

  • Читал ((
    Запутался

  • в чем запутался? там пример готовый, бери и вставляй в прошивку

  • разобрался…
    извините за тупые вопросы!
    просто завис еще на выводе «Hello» и не дочитал до конца…
    если вас не затруднит, посоветуйте как лучше разместить блоки программы. У меня будет опрос энкодера, управление подъемом или опусканием, вывод данных на семисегменты, опрос клавиатуры и основная программа.
    Я думаю в таймер 1 поместить первых три пункта, а в основном цикле опрос клавиатуры и там же в теле опроса основная часть основной программы которая будет записывать данные в переменную и в масив.
    правильно ли это будет или как лучше?

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

  • админ, как у тебя нервов хватает отвечать на одно и тоже. Хотя сам недавно не знал основного. )

  • Помогите!!! У меня такой же дисплей, только 16*2 и у него 16 выводов, а не 14. Вот название abc016002e11-yiy-r. Какая у него распиновка?!

  • pdf гуглится, описание есть, так что не вижу проблемы

  • интересно, что те 2 пина делают….:)

  • подсветка

  • С этим разобрался… А какой в Кодвижине-то выбирать? Там такого нет. Гуглил аналог — его тоже нету в Кодвижине. Или подскажите хотя бы какие библиотеки использовать для него..

  • по всей видимости это hd44780 совместимый дисплей

  • Ув. Админ, слышал, что на LCD дисплеях подобного рода можно самостоятельно рисовать символы не те что записаны в памяти LCD. Каким образом это возможно реализовать?

  • посмотрите тут http://avr-start.ru/?p=1587

  • Добрый день! Подключил ЖК экран LCM1602K-FSPG-YBW, а на нем почему-то верхняя строка вся серая. Может драйвер не тот? Как определить какой аналог по драйверу можно применить?

  • Уважаемый Админ скажите как потключить LCD display 16×2 через переходник PCF8574A
    библиотека из ардуино безполезна . как исползовать I2C ? заране спасибо

  • Почему на экран lcd выводит только последнее значение? (Ток)

    while (1)
    {
    if ((PINB.6==0)&&(OCR2<0xff))
    {
    OCR2=OCR2+0x01;
    delay_ms(1);
    result=(((5.00*adc_data[0])/1024.00)-((5.00*adc_data[1])/1024.00));
    current=(((5.00/10*adc_data[0])/1024.00)-((5.00/10*adc_data[1])/1024.00));
    lcd_gotoxy(0,0);
    sprintf(lcd_buffer,"U = %.2fV ",result);
    lcd_gotoxy(0,1);
    sprintf(lcd_buffer,"I = %.2fA ",current);
    lcd_clear();
    lcd_puts(lcd_buffer);
    };
    }

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

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

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