5
.2.pdf1. |
Цель работы: |
∙ |
знакомство с организацией взаимодействия МК с внешними устройствами (цифровыми и |
|
аналоговыми), подключаемыми с помощью портов МК; |
∙ |
овладение приемами программирования периферийных устройств, входящих в состав |
|
лабораторного стенда. |
2. |
Программа работы: |
Реализовать структуры информационных связей МК с периферийными устройствами в соответствии с заданным вариантом, а так же:
∙Разработать и выполнить программу, выводящую на ЖКИ двухстрочного текста
∙Разработать и выполнить программу, реализующую опрос клавиатуры и запись кодов состояния клавиш в ячейки памяти с адресами 30h…33h
∙Модифицировать программу «опрос клавиатуры», дополнив ее модулем определения номера нажатой клавиши.
∙Разработать программу, выводящую на ЖКИ номер нажатой клавиши.
∙Разработать и выполнить программу реализующую вывод на ЖКИ цифровых кодов (эквивалентов) аналоговых сигналов от двух источников.
∙На основе предыдущей программы разработать программу, выводящую на ЖКИ не только
цифровые эквиваленты аналоговых сигналов, но и скорость изменения сигналов. Вариант задания №4:
ЭЙ, ЁПТА, ВСТАВИТЬ КАРТИНКУ!!!!!!!!!!!!
3.Теоретические сведения:
Входе данном цикле работ исследуются портами микроконтроллера, а так же исследуется работа аналогоцифрового преобразователя, встроенного в микроконтроллер.
У микроконтроллера SAB 80C515 имеется 6 двунаправленных портов ввода-вывода параллельной информации P0-P5. Все эти порты 8-ми разрядные. Порты используются для обмена информацией с внешними устройствами, каждый из них можно по отдельности настроить на вход или на выход. Причем каждый из выводов каждого из портов можно отдельно настроить на ввод или на вывод. Так же у микроконтроллера имеется седьмой порт P6, который используется для ввода в микроконтроллер аналоговой информации для АЦП.
Помимо прочего порты P0-P3 могут использоваться для реализации специальных функций. Порты P0 и P2 могут использоваться для подключения к микроконтроллеру внешней памяти. Порт P0 может использоваться либо в качестве 8-мибитной шины данных, либо для задания младшего байта адреса внешней памяти. Порт P3 может использоваться для задания старшего байта адреса внешней памяти.
Порты P1 и P3 могут использоваться при работе последовательного порта. Кроме того они могут использоваться как выводы для подключения источников внешний прерываний. Так же выводы порта P1 могут использоваться для организации линий быстрого ввода-вывода.
В микроконтроллере SAB 80C515 имеется встроенный аналого-цифровой преобразователь. В зависимости от инициализации АЦП можно преобразовывать аналоговые сигналы с 8-ми различных выводов порта P6. АЦП позволяет преобразовывать входные аналоговые сигналы в диапазоне от 0 до 5В в восьмиразрядный двоичный код с точностью от 5 до 20мВ. В зависимости от априорной информации о диапазоне изменения входного аналогового сигнала можно задавать различные диапазоны преобразования для АЦП, что позволяет увеличить точность преобразования.
Кроме встроенных в микроконтроллер периферийных устройств в данной работе используются и внешние периферийные устройства: 16-тикнопочная клавиатуры, жидкокристаллический индикатор на 2 строки по 20 символов, так же используются два источника аналоговых сигналов: потенциометр и интегратор прямоугольных импульсов.
Для определения, нажатой кнопки используется опрос клавиатуры. У клавиатуры имеются четыре входа, на которые подается сигнал опроса клавиатуры и четыре выхода, с которых считывается состояние клавиатуры.
Для управления ЖКИ используется восьмиразрядная шина, по которой могут передаваться как управляющие команды, так и данные, которые отображаются на экране. Для управления ЖКИ используются три линии управления: E, RS и RW. Линия E используется для стробирования и синхронизации. Сигнал RS
используется для указания, что передается в ЖКИ: команда или данные. RW указывает на направление передачи: из микроконтроллера в ЖКИ или наоборот.
Принципиальная схема и схема соединений:
Рис.. Схема соединений.
4.Выполнение заданий
4.1.Вывод на экран ЖКИ двухстрочного текста
По заданию необходимо вывести на экран ЖКИ текст:
Microcontrollers2011
Бойцев и Скирёв
|
|
Рис.. Схема программы |
Текст программы: |
|
|
org 8400h |
|
|
w1: |
equ 20h |
|
w0: |
equ 21h |
|
indic: |
mov w1,#0 |
; Подготовка к вводу команд (R/S=0) |
|
mov w0,#38h |
; Установка 8-битного режима обмена с ЖКИ с выводом обеих строк |
|
lcall ind_wr |
|
|
mov w0,#0Ch |
; Отображение экрана без курсоров |
|
lcall ind_wr |
|
|
mov w0,#80h |
; Загрузка в счетчик АС адреса нулевой ячейки 1-й строки памяти ЖКИ |
|
lcall ind_wr |
|
|
mov w1,#1 |
; Подготовка к вводу данных (R/S=1) |
|
mov dptr,#FFD0h |
: Адрес внешней памяти, где хранится выводимые строки |
wr_str1: movx a,@dptr |
|
|
|
mov w0,a |
|
|
lcall ind_wr |
; Запись данных в ЖКИ |
|
inc dptr |
|
|
mov a,dpl |
|
|
cjne a,#0E4h,wr_str1 |
; проверка окончания 1-й строки |
|
mov w1,#0 |
|
|
mov w0,#C0h |
; Команда для адресации 1-й ячейки второй строки |
|
lcall ind_wr |
|
|
mov w1,#1 |
; Подготовка к вводу данных |
wr_str2: movx a,@dptr mov w0,a lcall ind_wr inc dptr
mov a,dpl
cjne a,#0F8h,wr_str2 ret
ind_wr: |
mov F8h,w0 |
; Загрузка в порт P5 записываемой в ЖКИ информации |
|
setb p1.7 |
; Установка сигнала E |
|
clr p1.6 |
; R/W=0 (запись) |
|
mov a,w1 |
; формируем R/S |
|
mov c,acc.0 |
|
|
mov p1.4,c |
;Установка R/S |
|
lcall delay |
|
|
clr p1.7 |
; Сброс сигнала E |
|
lcall delay |
|
|
setb p1.7 |
; Установка сигнала E |
|
ret |
|
delay: |
nop |
|
|
nop |
|
|
nop |
|
|
nop |
|
|
nop |
|
|
nop |
|
|
nop |
|
|
nop |
|
|
ret |
|
|
org FFD0h |
|
str1: |
db 'Microcontrollers2011' |
|
str2: |
db 20h, 20h, A0h, EFh, A6h, E5h, 65h, B3h, 20h, B8h, 20h, 43h, BAh, B8h, 70h, A2h, B3h, 20h, 20h, 20h |
Описание программы:
В данной программе происходит взаимодействие с ЖКИ. С помощью сигнала R/S определяется режим взаимодействия с ЖКИ (посылка команды или посылка данных). Отображение надписи на ЖКИ осуществляется посимвольно. Программа подключается к выделенному участку внешней памяти. В результате, начиная с адреса FFD0h, в памяти выделяется 40 ячеек, под видеобуфер, в который помещаются НЕХ-коды символов, которые необходимо вывести на экран. Затем из этого буфера данные пересылаются в ЖКИ.
Использование оператора org FFD0h является нежелательным, поскольку есть риск возникновения конфликта ресурсов и программа может оказаться нерабочей. Для решения такой проблемы следует переместить объявление str1 и str2 до оператора ret.
Для вывода символов на экран ЖКИ используются HEX-коды. Их значения для латинского алфавита, десятичных цифр и знаков препинания совпадают с их ASCII-кодами. Однако, это не выполняется для букв русского алфавита, поэтому для вывода наших фамилий на русском языке необходимо указывать HEX-коды. HEX-коды для надписи «Бойцев и Скирёв»: 20h, 20h, A0h, EFh, A6h, E5h, 65h, B3h, 20h, B8h, 20h, 43h, BAh, B8h, 70h, A2h, B3h, 20h, 20h, 20h.
В итоге на экране ЖКИ отображается текст, занесённый во внешнюю память.
4.2. Опрос клавиатуры
По заданию необходимо разработать программу, реализующую опрос клавиатуры и запись кодов состояний клавиш в ячейки памяти с адресами 30h..33h (карты памяти клавиатуры).
Вход клавиатуры: выводы P4.3 – P4.0
Выход клавиатуры: выводы P4.7 – P4.4
Схема программы:
|
|
Рис.. Схема программы |
Текст программы: |
|
|
|
org 8100h |
|
p4: |
equ 0E8h |
|
klav: |
mov r0,#30h |
; инициализация карты памяти клавиатуры |
|
mov p4,#f7h |
|
|
orl p4, #F0h |
; настройка порта P4 на вход |
|
mov a,#F7h |
; загрузка "бегущего нуля" |
; Циклическое сканирование клавиатуры |
||
m1: |
mov p4,a |
|
mov r2,a |
|
mov a,p4 |
; чтение состояния клавиатуры |
anl a,#F0h |
; получение выходного кода |
mov @r0,a |
; заполнение карты памяти |
inc r0 |
|
mov a,r2 |
|
rr a |
; формирование следующего значения "бегущего нуля" |
cjne a,#7fh,m1 |
; продолжение опроса в цикле, если сканирование не завершено |
ret |
|
Описание программы:
Порт P4 одновременно используется для ввода и вывода информации с клавиатуры.
В начале программы происходит настройка порта. На вход загружается код «бегущего нуля», а на выход «1111» (не нажата ни одна клавиша). Входные воздействия и выходная реакция при нажатии на клавиши показаны в таблице №.
Затем в цикле происходит считывание состояния клавиатуры с порта. В разрядах 7 – 4 записан выходной код, определяющий столбец нажатой клавиши. Далее происходит заполнение карты памяти.
Карта памяти полностью описывает состояние клавиатуры. Она состоит из четырех ячеек памяти, в каждой из которых хранится информация о соответствующей строке клавиатуры (30h – первая строка, 33h – четвертая строка). Младшие четыре разряда в ячейках памяти всегда нули – эти разряды не хранят в себе никакой информации. Все информация о состоянии столбца хранится в старших четырех разрядах ячейки. Были проверены состояния карты памяти клавиатуры для каждой из кнопок.
Результаты:
№ |
|
Состояние карты памяти |
|
|||
клавиши |
30h |
|
31h |
32h |
|
33h |
|
|
|
|
|
|
|
1 |
70 |
|
F0 |
F0 |
|
F0 |
|
|
|
|
|
|
|
2 |
B0 |
|
F0 |
F0 |
|
F0 |
|
|
|
|
|
|
|
3 |
D0 |
|
F0 |
F0 |
|
F0 |
|
|
|
|
|
|
|
4 |
E0 |
|
F0 |
F0 |
|
F0 |
|
|
|
|
|
|
|
5 |
F0 |
|
70 |
F0 |
|
F0 |
|
|
|
|
|
|
|
6 |
F0 |
|
B0 |
F0 |
|
F0 |
|
|
|
|
|
|
|
7 |
F0 |
|
D0 |
F0 |
|
F0 |
|
|
|
|
|
|
|
8 |
F0 |
|
E0 |
F0 |
|
F0 |
|
|
|
|
|
|
|
9 |
F0 |
|
F0 |
70 |
|
F0 |
|
|
|
|
|
|
|
10 |
F0 |
|
F0 |
B0 |
|
F0 |
|
|
|
|
|
|
|
11 |
F0 |
|
F0 |
D0 |
|
F0 |
|
|
|
|
|
|
|
12 |
F0 |
|
F0 |
E0 |
|
F0 |
|
|
|
|
|
|
|
13 |
F0 |
|
F0 |
F0 |
|
70 |
|
|
|
|
|
|
|
14 |
F0 |
|
F0 |
F0 |
|
B0 |
|
|
|
|
|
|
|
15 |
F0 |
|
F0 |
F0 |
|
D0 |
|
|
|
|
|
|
|
16 |
F0 |
|
F0 |
F0 |
|
E0 |
|
|
|
|
|
|
|
не нажата |
F0 |
|
F0 |
F0 |
|
F0 |
ни одна |
|
|
||||
|
|
|
|
|
|
4.3. Определение номера нажатой клавиши
По заданию необходимо модифицировать программу «опроса клавиатуры», дополнив ее модулем формирующим номер нажатой клавиши.
Номер нажатой клавиши сохраняться в ячейке памяти 34h.
В случае если не нажата ни одна из клавиш, в ячейку записывается число 00h, а если нажато больше одной клавиши, то записывается число FFh.
Рис.. Схема программы
Текст программы:
org 8400h
include asms\4081_4\Bs\5.2\2.asm
|
mov r1, #34h |
; выходное состояние клавиатуры |
|
mov r0, #30h |
; карта памяти клавиатуры |
|
; определние нажатой клавиши |
|
cols: |
cjne @r0, #70h, cols1 |
; клавиша нажата из крайнего левого столбца? |
|
mov a,#01h |
|
|
jmp end |
|
cols1: |
cjne @r0, #b0h, cols2 |
; клавиша нажата из среднего левого столбца? |
|
mov a,#02h |
|
|
jmp end |
|
cols2: |
cjne @r0, #d0h, cols3 |
; клавиша нажата из среднего правого столбца? |
|
mov a,#03h |
|
|
jmp end |
|
cols3: |
cjne @r0, #e0h, cols0 |
; клавиша нажата из правого столбца? |
|
mov a,#04h |
|
|
jmp end |
|
end: |
mov r3,a |
; сохранение номера столбца |
|
mov a,r0 |
|
|
subb a,#30h |
; получение номера строки |
|
rl a |
|
|
rl a |
; домножаем на 4 |
|
add a,r3 |
; прибавление номера столбца |
|
mov @r1, a |
; запись номера клавиши |
|
ret |
|
cols0: |
cjne @r0, #f0h,colsF |
; клавиша не нажата |
n1: |
inc r0 |
|
|
cjne r0,#34h,cols |
; если опрос не закончен, то переходим в его начало |
|
mov a,#00h |
|
|
mov @r1, a |
|
|
jmp endend |
|
colsF: |
mov a,#ffh |
; нажато несколько клавиш |
|
mov @r1, a |
|
endend: ret
Описание программы:
Программа 2.asm реализует опрос клавиатуры и формирует карту памяти, которую записывает в ячейки 30h..33h. Эту программа подключается к модулю формирования номера нажатой клавиши.
Далее в цикле и условных переходах определяется номер столбца, в котором была нажата клавиша (не нажата ни одна, нажато несколько).
Зная номер столбца и номер строки определяется номер нажатой клавиши по формуле:
Номер = Номер строки * 4 + Номер столбца
В ходе тестирования программы были проверены случаи нажатия одной клавиши, двух клавиш, а так же случай когда не было нажато ни одной из клавиш.
Результаты выполнения программ наблюдались в «Окне памяти» в ячейке 34h.
Из приведённых ниже рисунков (рисунки 5 – 7) видно, что программа работает корректно.
Вариант 1. Не нажато ни одной клавиши
Рис.. На клавиатуре нажато ни одной клавиши.
Вариант 2. Нажата четвёртая клавиша:
Рис.6. Нажата четвёртая клавиша. Вариант 3. Нажато две клавиши (третья и седьмая):
Рис.. Нажаты две клавиши.
4.4. Вывод на экран ЖКИ номера нажатой клавиши
Необходимо дополнить программу из предыдущего задания модулем, выводящим на экран ЖКИ номер нажатой клавиши. Для непосредственного отображения текста на экране нужно использовать программу из первого задания.
Для вывода на экран номера нажатой клавиши следует преобразовать её номер в HEX-код. В результате выполнения программы на экране ЖКИ будет отображена следующая надпись:
Number of button Nx где Nx – номер нажатой клавиши.
Рис.. Схема программы klav_jki_main