- •1.1 Определение номера нажатой клавиши.
- •Подготовить ”бегущий 0”
- •Установить начальный адрес кс
- •1.2 Сопряжение мк с жки. Вывод заголовков.
- •1.3 Составление программы, управляющей взаимодействием мк с клавиатурой и жки.
- •Определение н.А., с которого выводится первый пробел
- •Начало работы с системой. Основные требования.
- •2. Порядок выполнения работы
- •Оформление отчета.
- •Контрольные вопросы.
Подготовить ”бегущий 0”

Установить начальный адрес кс







Выделить значащие разряды и записать
в ячейку КС
Сдвинуть”0”в следующую позицию

Перейти к следующей ячейке КС


ДА

НЕТ
Установить начальный адрес КС



Прочитать очередную ячейку КС


ДА


НЕТ
Перейти к следующей ячейки КС
Определение № строки



Определение №столбца


НЕТ
row_n
=8
col_n
=2



Определение № нажатой клавиши



Программа опроса клавиатуры.
row_n: egu 41h
col_n: egu 42h
N: egu 40h ; номер нажатой клавиши
map start: egu 30h ; начало области хранения КС клавиатуры
klav: push psw. ; сохранение используемых
push a ; ресурсов МК в стеке
push 0
push 1
; формирование КС и запись в память МК
установка ”0”в начальные позиции
mov a,#07Fh ; подготовка “бегущего нуля ”
mov r0,#map_start ; адрес начала карты
;состояние клавиатуры
opros: mov 0E8h,a ;выдача байта, вида ”бегущий 0” в порт 4
setb p1.1 ;настройка на
setb p1.0 ;
mov b,p1 ;чтение состояние клавиши очередной строки клав-ры
anl b,#03h ;маска, выделение значащих разрядов
mov @r0,b
setb c
rrc a ;подготовка нового опроса сдвиг “0”в следующую
позицию
inc r0 ;в очередную позицию карты, перейти к следующей
ячейки КС
cjne a,#11111111b,opros ; дешифрация карты
mov r0,#map_start,
dc: mov a,@r0
cjne a,#03h,dck ; нажата клавиша?
inc r0 ;нет просмотр карты далее
cjne r0?#(map_start+8),dc
mov row_n, #8 ; если клавиша не нажата, row_n=8, col_n=2
mov col_n, #2 ; если клавиша нажата, row_n=0..7, col_n=0..1
sjmp end1
dsk: mov a, 0 ;клавиша нажата, R0 содержит адрес ячейки
clr c
subb a,# map-start
mov row_n, a
mov a,@r0 ;содержимое ячейки КС для определения № колонки
mov col_n, #0
dloop1: rrc a
jnc end1
inc col_n
mov r1, col_n
cjne r1,#2. dloop1
end1: lcall get_num
pop 1
pop 0
pop a
pop psw
ret
get_num: push a
mov a, row_n
cjne a,#8, gn_end
mov N,#0
pop a
ret
gn_end: clr c
rlc a ;умножить row_n на два
add a, col_n
inc a
mov N,a
pop a
ret
Примечание: при практической реализации ввести с помощью псевдокодов equ адреса для символьных имен переменных, используемых в примере.
1.2 Сопряжение мк с жки. Вывод заголовков.
В большинстве встраиваемых систем управления необходимо организовать связь с оператором для вывода информации о параметрах работы системы.
Рассмотрим задачу вывода информации на алфавитно-цифровой жидкокристаллический индикатор (ЖКИ) модели DM2021 фирмы Sanyo. Данная модель ЖКИ имеет поле вывода информации размером две строки по двадцать символов в каждой. ЖКИ содержит видеопамять, в которой хранятся отображаемые символы, а также обладает собственной системой управления жидкокристаллической панелью. Наличие указанных узлов существенно упрощает работу с ЖКИ, так как собственно управление отображением точек - элементов изображения – производится автоматически в соответствии с поданной на ЖКИ командой.
Пример подключения ЖКИ к МК показан в левой части на рис.1.
ЖКИ содержит восьмиразрядную шину команд-данных, которая подключена к порту Р4, и шину управления, в состав которой входят одноразрядные линия разрешения программирования (E), выбора типа посылки “команда данные” (RS) и выбора направления передачи данных “чтение-запись” (RW). Эти линии подключены к старшим трем разрядам порта Р1 (Р1.7, Р1.5 и Р1.6 соответственно). Переменный резистор необходим для регулировки контрастности изображения. Он позволяет плавно менять напряжение питания драйвера ЖКИ, что приводит к изменению угла поворота жидких кристаллов. Этим резистором можно отрегулировать фактическую контрастность при некотором преимущественном угле наблюдения (снизу-вверх или сверху - вниз). Последовательность действий, которые необходимо выполнить, управляющей системе при совершении операций записи для 8-ми разрядной шины приведена ниже:
1. установить значение линий RS;
2. вывести значение байта данных на линии шины DB0…DB7;
3. установить линию Е = 1;
4. установить линию Е = 0;
5. установить линии DB0…DB7=HI в состояние высокого импеданса ( Е=1).
Процедура записи в ЖКИ выполняется в три этапа: на шине DB устанавливается информация, отражающая подаваемые в ЖКИ команды-данные, затем устанавливаются необходимые значения RW и RS и, наконец на выходе Е формируется переход от высокого логического уровня к низкому. Для возврата системы управления ЖКИ в исходное состояние следует перевести вход Е в состояние логической единицы.
Не приводя всей системы команд ЖКИ, остановимся на следующих из них:
38h-установка восьмибитного режима обмена с ЖКИ, использование для вывода обеих строк символов размером 7×5 точек;
0Ch –активизация всех знакомест :RB в режиме погашенного курсора;
80h- установка адреса, начиная с которого записываемые в ЖКИ данные будут последовательно располагаться в видеопамяти;
06H- устанавливает режим автоматического перемещения курсора слева – направо после вывода каждого символа.
Примеры программирования.
а) вывод команды
mov switch, #0
mov byte, #38h
lcall indic_wr
б) Вывод байта данных - символа
mov switch, #1
mov byte, #symbol
lcall indic_wr
Графическая схема алгоритма и текст программы, осуществляющей вывод на ЖКИ сорока символов, коды которых расположены во внешней памяти данных микроконтроллера, начиная с адреса 0FFD0h, приведены ниже


инициализировать
ЖКИ

настроить адрес
1-ой строки ЖКИ


считать очередной
код из памяти МК и выдать на ЖКИ


ДА
НЕТ
настроить адрес
2-ой строки ЖКИ

считать очередной
код из памяти МК и выдать на ЖКИ


ДА
НЕТ

Текст программы вывода заголовков на ЖКИ.
(RS:=0)
indic: ;инициализация ЖКИ
indic_init: switch,#0 ;переключить на команду
mov byte,#38h ;определить передаваемый байт (команда - данных )
lcall indic_wr
mov byte,#0ch
lcall indic_wr
mov byte,#06h ;режим автоматического перемещения курсора слева
направо после вывода каждого символа
lcall indic_wr
mov byte,#80h ;установка адреса первого символа
lcall indic_wr ;первой строки
mov switch,#1 ;переключить на данные (RS=1)
mov dptr,#0FFD0h
indic_data_wr1: movx a,@dptr ; вывод символов первой строки
ind_row1: mov byte,a ;передаваемый байт → в буфер
lcall indic_wr
inc dptr
mov a, dpl
cjne a,#0E4h, indic_data_wr1 ;
mov switch,#0 ;RS=0-команда
mov byte,#0C0h ;установка адреса первого символа
lcall indic_wr ;второй строки
mov switch,#1 ;RS=1 - данные
indic_data_wr2: movx a,@dptr ; вывод символов второй строки
ind_row2: mov byte,a
lcall indic_wr
inc dptr
mov a,dpl
cjne a,#0F8h, indic_data_wr2 ;E4h+14h=F8h – адрес конца второй строки
indic_exit: ret
indic_wr: mov 0e8h, byte ; передаваемый байт в Р4, процедура записи в ЖКИ
setb p1.7 ;E:=1
clr p1.6 ;RW:=0(запись)
mov a, switch
mov c,acc.0
mov p1.5,c ;RS:=0 (команда - данные; )
lcall indic_delay
clr p1.7 ;E:=0
lcall indic_delay
setb p1.7 ;E:=1 (установка DB0…DB7 в состояние HI)
indic_delay: nop ; процедура программной задержки
nop
nop
nop
nop
nop
nop
nop
ret
org 0FFD0h
data: db “it is test example.” ; пример организации выводимых данных
db “0123456789ABCDFI@#$”
