LCD+AVR Studio+WINAVR. Праздник к нам приходит

AVR Studio+WINAVR. Праздник к нам приходит и …. дарит классный инструментарий для работы с LCD дисплеем на основе HD44780. Вот только его еще надо найти.

Display

Зачем в устройстве с микроконтроллером дисплей? Лично для меня это увеличивает удобство отладки, я могу визуально наблюдать состояние переменных. Можно информировать пользователя о состоянии устройства, и просто красиво! Дисплей будет полезен во многих изделиях. Например, в соревнованиях Евробот 2011 года наш робот TurboT был оснащен дисплеем на который выводились данные о текущем состоянии выполнения главной программы.

Как ни странно, но вместе с компилятором WINAVR идет так называемый ликбез в виде описания библиотек AVR LibC. Если из среды AVR Studio открыть/создать проект на С, нажать на вкладку help и выбрать AVR libC reference manual, то будет вызван ваш браузер по умолчанию и ему будет передана строка – ссылка на хтмл документ, после открытия слева вы увидите гиперссылку Example Projects, перейдя на него внизу страницы обратите внимание на comprehensive example on using the standard IO facilities. После этого вы попадете на страничку, где увидите занимательную каритнку с отладочным набором от ATMEL и дисплеем. Внизу увидите среди списков файлов проекта следующие:

- defines.h Contains some global defines, like the LCD wiring
- hd44780.c Implementation of an HD44780 LCD display driver
- hd44780.h Interface declarations for the HD44780 driver
- lcd.c Implementation of LCD character IO on top of the HD44780 driver
- lcd.h Interface declarations for the LCD driver


Собственно, это то, что нужно. Но для добавления в свой проект необходимо помнить следующее:

 defines.h

– файл линковки портов. Объявляет адреса ножек, к которым подключены управляющие линии вашего дисплея. Внимание, управление дисплеем 4х проводное! Здесь содержится код:

 /* HD44780 LCD port connections */
#define HD44780_RS B, 6

      //  - номер ножки и порт адресного сигнала дисплея

#define HD44780_RW B, 4

     //- номер ножки и порт выбора режима записи или чтения

#define HD44780_E  B, 5

      //   - разрешение  обращения к модулю (строб данных)

/* The data bits have to be in ascending order. */
#define HD44780_D4 B, 0

      //     - номер ножки и порт DB4 шины данных дисплея, подразумевается, что остальные будут идти в порядке возрастания и линковаться в том же порядке к ножкам порта.

/* Whether to read the busy flag, or fall back to
worst-time delays. */
#define USE_BUSY_BIT 1

Main.c contains

lcd_init();
stderr = &lcd_str;

Формат вывода при этом следующий:

fprintf(stderr, "Hello world!\n");

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

void fprintfFloat(float input, int number)
{
int temp;
temp=input*10*number;
char str[20];
itoa(temp/(10*number),str,10);
fprintf(stderr, str);
char str1[number];
unsigned char drob;
drob=temp % (number*10);
itoa(drob,str1,10);
fprintf(stderr, ".");
fprintf(stderr, str1);
}

где первый параметр - число в формате float, а второй параметр - кол-во чисел после запятой

Если компилятор ругается на функцию itoa, подключите соответствующий стандартный header файл.

Для примера выкладываю собственно дисплей, на котором я это делал, а также полную распиновку разъема к нему.

Вот собственно и все, я использовал в своей разработке именно это. На дисплее МЭЛТ с hd44780 совместимым контроллером это работает. Проверено на практике. Можете скачать проект в исходниках на С ниже.

Скачать:

LCD

mt-16s3d

Схемы соединения:

Leave a Reply

You must be logged in to post a comment.