Главная страница
Навигация по странице:

  • Подключение.

  • Логическая структура LCD контроллера HD44780. Контроллер имеет свой блок управления, который обрабатывает команды и память. Она делится на три вида:DDRAM

  • CGROM

  • Доступ к памяти.

  • Система команд.

  • Таблица команд

  • Значение отдельных битов

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

  • Интерфейсы периферийных устройств. ИПУ - лаб 1. Работы с алфавитноцифровымжк дисплеем


    Скачать 96.51 Kb.
    НазваниеРаботы с алфавитноцифровымжк дисплеем
    АнкорИнтерфейсы периферийных устройств
    Дата08.01.2020
    Размер96.51 Kb.
    Формат файлаdocx
    Имя файлаИПУ - лаб 1.docx
    ТипЛабораторная работа
    #103060

    Лабораторная работа 1

    РАБОТЫ С АЛФАВИТНО-ЦИФРОВЫМЖК ДИСПЛЕЕМ

    ЦЕЛЬ РАБОТЫ

    Ознакомление с методами вывода информации на алфавитно-цифровой жк дисплей.
    КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
    Зачастую контроллеру приходится сообщать пользователю какие-либо данные, и далеко не всегда можно обойтись одними лишь цифрами. Для отображения текстовой информации, как правило, применяют LCD индикаторы на базе контроллера HD44780.

    Подключение.

    LCD на базе HD44780 подключается к AVR микроконтроллеру напрямую к портам. Есть два способа подключения — на 8 бит и на 4 бита, но в используемом лабораторном стенде используется только 4 битовый способ.
    • Выводы DB0 -DB7 это шина данных/адреса.

    •E — стробирующий вход. Измененяя напряжения на этой линии мы даем понять дисплею что нужно забирать/отдавать данные с/на шину данных.

    •RW — определяет в каком направлении движутся данные. Если 1 — то на чтение из дисплея, если 0 - то на запись в дисплей.

    •RS — определяет что передается, команда (RS=0) или данные (RS=1). Данные будут записаны в память по текущему адресу, а команда исполнена контроллером дисплея.

    Логическая структура LCD контроллера HD44780.

    Контроллер имеет свой блок управления, который обрабатывает команды и память. Она делится на три вида:

    DDRAM — память дисплея. Все что запишется в DDRAM будет выведено на экран. То есть, например, если записать код 0×31 — на экранбудет выведен символ «1» т.к. 0х31 это ASCII код цифры 1. Но есть одна особенность — DDRAM память гораздо больше чем видимая область экрана. Как правило, DDRAM содержит 80 ячеек — 40 в первой строке и 40 во второй, а на дисплей может двигаться по этой линейке как окошко на логарифмической линейке, высвечивая видимую область. То есть, например, можно записать в DDRAM сразу пять пунктов меню, а потом просто высвечивать нужные, показывая по одному пункту. Для перемещения дисплея есть специальная команда. Также есть понятие курсора — это место, в которое будет записан следующий символ, т.е. текущее значение счетчика адреса. Курсор не обязательно может быть на экране, он может располагаться и за экраном или быть отключен вовсе.

    CGROM — таблица символов. Когда производится запись байта в ячейку DDRAM, из таблицы берется символ и рисуется на экране. CGROM нельзя изменить.

    CGRAMтоже таблица символов, но ее можно менять, создавая свои символы. Адресуется она линейно, то есть вначале идет 8 байт одного символа, построчно, снизу вверх — один бит равен одной точке на экране. Потом второй символ таким же образом. Поскольку знакоместо 5 на 8 точек, то старшие три бита роли не играют. Всего в CGRAM может быть 8 символов, соответственно CGRAM имеет 64 байта памяти. Эти программируемые символы имеют коды от 0х00 до 0х07. Так что, записав, например, в первые 8 байт CGRAM (первый символ с кодом 00) какой-нибудь необычный символ, и записав в DDRAM ноль (код первого символа в CGRAM) мы увидим на экране этот символ.

    Доступ к памяти.

    Командой нужно выбирать в какую именно память и начиная с какого адреса необходимо писать, потом просто отправлять байты. Если указано, что запись идет в DDRAM то на экран (или в скрытую область) будут выведены символы, если в CGRAM то байты будут записаны уже в память знакогенератора. Главное потом не забыть переключиться обратно на область DDRAM.

    Система команд.

    О том, что передается команда контроллеру дисплея, сообщит ножкаа RS=0. Сама команда состоит из старшего бита, определяющего за что отвечает данная команда и битов параметров, указывающих контроллеру HD44780 что именно необходимо выполнить.
    Таблица команд:


    Значение отдельных битов:

    •I/D — инкремент или декремент счетчика адреса. По умолчанию стоит 0 — Декремент. Т.е. каждый следующий байт будет записан в n-1 ячейку. Если поставить 1 — будет Инкремент.

    •S - сдвиг экрана, если поставить 1 то с каждым новым символом будет сдвигаться окно экрана, пока не достигнет конца DDRAM.

    •D — включить дисплей. Если поставить туда 0 то изображение исчезнет, а в это время можно в видеопамяти творить всякие преобразования и они не будут видны на дисплее. А чтобы картинка появилась в эту позицию надо записать 1.

    •С - включить курсор в виде прочерка.

    •B — сделать курсор в виде мигающего черного квадрата.

    •S/C сдвиг курсора или экрана. Если стоит 0, то сдвигается курсор. Если 1, то экран. По одному разу за команду

    •R/L — определяет направление сдвига курсора и экрана. 0 — влево, 1 — вправо.

    •D/L — бит определяющий ширину шины данных. 1-8 бит, 0-4 бита

    •N — число строк. 0 — одна строка, 1 — две строки.

    •F - размер символа 0 — 5х8 точек. 1 — 5х10 точек (встречается крайне редко)

    •AG - адрес в памяти CGRAM

    •АD — адрес в памяти DDRAM
    Пример программы, реализующей инициализацию и вывод текста на дисплей.
    #define F_CPU 8000000UL

    #include

    #include

    #include

    #include
    #define e1 PORTD|=0b00000100 // установка линии E в 1

    #define e0 PORTD&=0b11111011 // установка линии E в 0

    #define rs1 PORTD|=0b00000010 // установка линии RS в 1 (данные)

    #define rs0 PORTD&=0b11111101 // установка линии RS в 0 (команда)
    void port_ini(void)

    {

    PORTD=0x00;

    DDRD=0xFF;

    }

    void LCD_ini(void)

    {

    _delay_ms(15); //Ждем 15 мс (стр 45)

    sendhalfbyte(0b00000011);

    _delay_ms(4);

    sendhalfbyte(0b00000011);

    _delay_us(100);

    sendhalfbyte(0b00000011);

    _delay_ms(1);

    sendhalfbyte(0b00000010);

    _delay_ms(1);

    sendbyte(0b00101000, 0); //4бит-режим (DL=0) и 2 линии (N=1)

    _delay_ms(1);

    sendbyte(0b00001100, 0); //включаем изображение на дисплее (D=1), курсоры никакие не включаем (C=0, B=0)

    _delay_ms(1);

    sendbyte(0b00000110, 0); //курсор (хоть он у нас и невидимый) будет двигаться влево

    _delay_ms(1);

    }

    void sendhalfbyte(unsigned char c)

    {

    c<<=3;

    e1; //включаем линию Е

    _delay_us(50);

    PORTD&=0b10000111; //стираем информацию на входах DB4-DB7, остальное не трогаем

    PORTD|=c;

    e0; //выключаем линию Е

    _delay_us(50);

    }

    void sendbyte(unsigned char c, unsigned char mode)

    {

    if (mode==0) rs0;

    else rs1;

    unsigned char hc=0;

    hc=c>>4;

    sendhalfbyte(hc); sendhalfbyte(c);

    }

    void sendcharlcd(unsigned char c)

    {

    sendbyte(c,1);

    }

    void setpos(unsigned char x, unsigned y)

    {

    char adress;

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

    sendbyte(adress, 0);

    }

    void clearlcd(void)

    {

    sendbyte(0b00000001, 0);

    _delay_us(1500);

    }

    void str_lcd (char str1[])

    {

    wchar_t n;

    for(n=0;str1[n]!='\0';n++)

    sendcharlcd(str1[n]);

    }
    int main(void)

    {

    port_ini(); //Инициализируем порты

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

    clearlcd();

    setpos(0,0);

    str_lcd("Hello World!");

    setpos(2,1);

    str_lcd("String 2");

    while (1)

    {

    }

    }


    ВАРИАНТЫ ЗАДАНИЙ

    1. Написать функцию вывода строки на дисплей.

    2. Вывести на дисплей бегущую строку.

    3. Вывести на дисплей строку, содержащую пользовательский символ.

    4. Вывести на дисплей мигающую молнию.

    5. Вывести на дисплей строку текста и включить отображение курсора.

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

    7. Собрать схему из алфавитно-цифрового дисплея и 2 кнопок. Запрограммировать микроконтроллер так, чтобы при нажатии на первую кнопку выведенное на дисплей слово смещалось влево, а при нажатии на вторую вправо.

    8. Собрать схему из алфавитно-цифрового дисплея и 2 кнопок. Запрограммировать микроконтроллер так, чтобы при нажатии на первую кнопку выведенное на дисплей слово смещалось вверх, а при нажатии на вторую вниз.

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

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

    11. Вывести на дисплей алфавит.

    12. Собрать часы из алфавитно-цифрового дисплея.

    13. Собрать схему из алфавитно-цифрового дисплея и 2 кнопок. Запрограммировать микроконтроллер так, чтобы можно было редактировать дату.

    14. Вывести на дисплей квадрат.

    15. Вывести на дисплей окружность.

    16. Вывести на дисплей треугольник.

    КОНТРОЛЬНЫЕ ВОПРОСЫ

    1.Каким является назначение выводов алфавитно-цифрового дисплея?

    2. Какие виды памяти используются в алфавитно-цифровом дисплее?

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

    4. Какая последовательность команд необходима для инициализации дисплея?


    написать администратору сайта