Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
основа ассемблера и примеры подключения LCD.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
581.96 Кб
Скачать

Vcc, gnd, Vo, a, k шина питания.

Типовая схема подключения LCD к МК показана на рис.3. Именно она и будет использоваться для первой тестовой проверки LCD с выведением на экран знаменитой фразы "Hello, world!" ("Здравствуй, мир!"). Кнопка SB1 осуществляет начальный сброс. Переменным резистором R2 регулируют контрастность изображения. Его сопротивление непринципиально и может меняться от 5 до 20 кОм.

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

Отрегулировать R2 следует на перегибе характеристики, как правило, с потенциалом ближе к общему проводу, когда слабо видны все точки знакомест на LCD. Неправильная установка контрастности может привести к ложному выводу о дефекте индикатора, хотя все, что надо сделать, это покрутить движок резистора.

Управляющая программа хранится в МК DD1. Чтобы облегчить ее составление, здесь и в дальнейшем приняты некоторые упрощения.

Во-первых, LCD будет работать только на прием информации по всем 11 соединительным линиям шины данных и управления.

Во-вторых, экран LCD считается жестко привязанным к начальной позиции с фиксированными адресами знакомест.

В-третьих, при программировании будет использоваться ограниченный набор команд (желающие смогут в последствие расширить свои познания, изучив DATASHEET на HD44780.

Программное управление LCD

Поскольку внутри LCD находится свой собственный контроллер со своей разветвленной системой команд, то задача упрощается. Две такие мощные и интеллектуальные микросхемы, как HD44780 и ATmega8, смогут быстро между собой "договориться" на машинном языке. Труд программиста заключается в том, чтобы "объяснить" контроллерам правила общения и установить протокол соединения.

Таблица 3

В таблице (см. выше) показана расшифровка наиболее употребляемых команд, посылаемых от МК в LCD, а на рис.4 - распределение адресов на верхней и нижней строках экрана. Время выполнения команд указано приблизительно. Оно определяется частотой внутреннего RC-генератора LCD, которая, в свою очередь, зависит от технологического разброса и температуры нагрева корпуса.

Рисунок 4

Различают команды прямого и косвенного действия. Первые из них занимают адреса 0x01-0x3F и не требуют передачи данных. За вторыми (диапазон выше 0x3F) обязательно следует передача одного или нескольких байтов информации. Для примера на рис.5 показаны временные диаграммы выполнения команды 0x80 "Установка курсора в первое знакоместо верхней строки экрана" и индикация в нем цифры "4" пересылкой кода данных 0x34.

Рисунок 5

Формировать диаграммы, показанные на рис.5, должен МК с учетом задержек из табл.3, необходимых контроллеру LCD на выполнение команд. Для повышения устойчивости работы экономить на задержках не надо. По крайней мере, при отладке программы они должны быть достаточно большими.

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

Далее показана Си-программа для тестовой проверки LCD по схеме, собранной на рис.3.

01. /****Тестовая программа для LCD****/

02.

03. #include <avr/io.h>

04. #include <util/delay.h> //используем стандартную процедуру задержки

05.

06. #define RS PC0 //RS подключаем к PC0 микроконтроллера

07. #define EN PC2 //EN подключаем к PC2 микроконтроллера

08.

09. /***Функция записи команды в LCD***/

10.

11. void lcd_com(unsigned char p) //'p' байт команды

12. {

13. PORTC &= ~(1 << RS); // RS = 0

14. PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD)

15. PORTD = p; // вывод команды на шину DB0-7 LCD

16. _delay_us(100); // длительность сигнала EN

17. PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)

18._delay_us(100); // пауза для выполнения команды

19. }

20.

21. /***Функция записи данных в LCD***/

22.

23. void lcd_dat(unsigned char p) //'p' байт команды

24. {

25. PORTC |= (1 << RS)|(1 << EN); //RS = 1, EN = 1 (начало записи команды в LCD)

26. PORTD = p; //вывод команды на шину DB0-7 LCD

27. _delay_us(100); // длительность сигнала EN

28. PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)

29. _delay_us(100); // пауза для выполнения команды

30. }

31.

32. /***Функция инициализации LCD***/

33.

34. void lcd_init(void)

35. {

36. lcd_com(0x08); // полное выключение дисплея

37. lcd_com(0x38); // 8 бит 2 строки

38. _delay_us(100);

39. lcd_com(0x38); // 8 бит 2 строки

40. _delay_us(100);

41. lcd_com(0x38); // 8 бит 2 строки

42. lcd_com(0x38);

43. lcd_com(0x01); // очистка дисплея

44. _delay_us(100);

45. lcd_com(0x06); // сдвиг курсора вправо

46. lcd_com(0x0D); // включение дисплея, мигающий курсор

47. }

48.

49. /***Основная программа***/

50.

51. int main (void)

52. {

53. DDRC |= (1 << PC2)|(1 << PC1)|(1 << PC0); // PC0-3 выходы

54. PORTC = 0x00; // лог. 0 на выходе

55. DDRD = 0xFF; // PD0-7 выходы

56. PORTB = 0x00;

57.

58. lcd_init(); // инициализация дисплея

59. lcd_dat('H'); // выводим символы на экран

60. lcd_dat('e');

61. lcd_dat('l');

62. lcd_dat('l');

63. lcd_dat('o');

64. lcd_dat(' ');

65. lcd_dat('w');

66. lcd_dat('o');

67. lcd_dat('r');

68. lcd_dat('l');

69. lcd_dat('d');

70. lcd_dat('!');

71. }

Функции "lcd_com" и "lcd_dat" формируют соответственно левую и правую половину временных диаграмм, показанных на рис.5.

Без процедуры инициализации ни один LCD работать не будет. Это самая важная часть листинга. Именно на процессе инициализации часто "спотыкаются" начинающие программисты. Дело в том, что в разных источниках приводятся разные варианты последовательностей команд инициализации и не все из них гарантированно будут работать с конкретным LCD.

Наиболее общая процедура инициализации приведена в DATASHEET на HD44780. Функция "lcd_init" в целом повторяет ее с тем отличием, что команда полного выключения дисплея 0х08 поставлена первой, чтобы при включении питания на экране не появлялся "мусор". Здесь нет ограничений против экспериментов, главный критерий - практика.

После выполнения инициализации курсор устанавливается в крайнее слева положение в верхней строчке экрана. Следовательно, первая буква "H" будет выведена именно в это знакоместо. Далее курсор автоматически переходит на одну позицию вправо и следующая команда выведет сюда букву "e" и т.д.