Статьи..


PROTEUS вместо макетной платы. MCS51. Подключаем ЖК индикатор к AT89c2051.

Для большинства устройств необходимо отображение алфавитно-цифровой информации. Это могут быть результаты измерений, параметры настройки и многое другое. Кроме очевидных плюсов 7-ми сегментного индикатора (простота управления, контрастность отображения информации, низкая цена), есть и недостатки, одним из которых являются ограниченные возможности вывода текстовых сообщений. Поэтому в некоторых случаях удобней использовать ЖК-индикатор. Напишем функции, которые позволят управлять выводом на индикатор LM016L, который доступен в PROTEUS.

Управление ЖК-индикатором состоит из отправки команд/данных контроллеру дисплея. Краткое описание выводов контроллера дисплея:

Используем 4-х битный режим подключения.

LM016L lcd_2x16

Передача команды (данных). Байт передается в функцию через аккумулятор.

OutData:
push B
push ACC
setb LCD_E ; E=1 - разрешаем запись
anl A,#0F0h ; выделим старшую часть байта
mov P1,A
clr LCD_E ; E=0
mov B,#24
djnz B,$ ; задержка 50 мкс
pop ACC
swap A
setb LCD_E ; E=1 - разрешаем запись
anl A,#0F0h ; выделим младшую часть байта
mov P1,A
clr LCD_E
mov B,#24
djnz B,$ ; задержка 50 мкс
pop B
ret

Для начала работы с LCD-дисплеем, необходимо провести его инициализацию. Напишем функцию, которая делает это:

InitLcd:
push B
mov A,#2 ; 4-x битный режим
lcall OutData
mov A,#28h
lcall OutData
mov A,#2
lcall Delay_ms ; задержка 2 мс
mov A,#6 ; режим (сдвига изображения нет, инкремент счетчика)
lcall OutData
mov A,#0Ch ; включим дисплей
lcall OutData
pop B
ret

Установка позиции печати осуществляется с помощью функции SetYX. Так как видимое поле 2х16, координата помещатся в одном байте. Старшие 4 бита задают Y-координату, а младшие позицию по оси X.

SetYX:
push B
mov B,A
anl A,#0F0h ; анализ Y-координаты
jnz str_y1
mov A,B
anl A,#0Fh
add A,#080h ; Y=0 ...
sjmp set_poz
str_y1: ; Y=1, формируем X
mov A,B
anl A,#0Fh
add A,#0C0h
set_poz: ; уcтановка позиции курсора
lcall OutData
pop B
ret

Осталось написать функцию печати. Адрес передаваемой строки содержится в DPTR.

OutStr:
setb LCD_RS ; уcтановка режима передачи данных
next_ch:
clr A
movc A,@A+DPTR ; считаем байт
jz end_str ; если 0 - конец строки
lcall OutData ; передаем ...
inc DPTR ; следующий символ
sjmp next_ch ; повтор
end_str:
clr LCD_RS ; возврат в режим команд
ret

Теперь для вывода на дисплей, достаточно установить позицию курсора и вызвать функцию печати строки.

.......
; вывод текста на экран
mov A,#1h ; y=0 x=1
lcall SetYX
mov DPTR,#str_1
lcall OutStr ; печать строки

mov A,#14h ; y=1 x=4
lcall SetYX
mov DPTR,#str_2
lcall OutStr ; печать строки
.......
str_1: db "* LM016L LCD *",0
str_2: db "AT89C2051",0

Исходый код проекта.

На главную страницу...