2 Программная часть устройства
2.1 Алгоритм работы
Алгоритм работы устройства следующий:
1. при включении питания процессор инициализирует стек
2. настраивает контроллер ККД
3. очищает память и регистры AX, BX, CX, DX
4. переходит к бесконечному циклу на пустой операции, где он ждет возникновения прерывания
В случае возникновении прерывания:
1. процессор помещает адрес возврата в стек
2. переходит к процедуре обработки прерывания в которой:
- считывает код нажатой клавиши
- обрабатывает это событие в зависимости от назначения кнопки
- обновляет данные на индикаторе
3. восстанавливает счетчик команд из стека для возврата
3. возвращается в основную программу и ждет следующего прерывания
Блок-схема алгоритма приведена в приложении А.
2.2 Описание программы
Начальная инициализация осуществляется процедурами:
;#######################################################################
; Начальная установка по сбросу
;#######################################################################
Reset:
; задаем смщения
mov CS, 0000h; память программ ПЗУ
mov DS, 0100h; ОЗУ (до стека 1536 слов)
mov SS, 0160h; делаем стек в ОЗУ (512 слов)
Настройка ККД осуществляется записью в него определенных управляющих слов [2]:
;#######################################################################
; Настройка контроллера ККД
;#######################################################################
KKD_Init:
mov AL, 11000011b; сброс
mov KKD_RU, AL;
mov AL, 00111111b; коэффициент деления частоты = 31
mov KKD_RU, AL;
mov AL, 00000000b; кодир скан клав, обнаруж 2х наж клав, дисплей 8 разрядов
mov KKD_RU, AL;
Очистка памяти (запись в кадую ячейку FFh):
;#######################################################################
; Очистка ячеек ОЗУ записываем туда ФФ
;#######################################################################
OZU_clear:
mov AX, 0;
mov BX, FFh;
o_c:
mov DS:[AX], BX; в ОЗУ
inc AX;
cmp AX, 800h; цикл на всю память
jne o_c;
clr AX;
clr Bx;
clr CX;
clr DX;
Далее осуществляется переход к основному циклу программы:
;#######################################################################
; Основной цикл программы
;#######################################################################
Begin:
nop;
jmp Begin;
По адресу вектора прерывания 0008h находится процедура обработки прерывания:
;#######################################################################
; Немаскируемое прерывание (нажатие кнопки на клавиатуоре)
;#######################################################################
ORG 00008h; вектор входа в прерывание по входу NMI
push AX; можно не делать т.к. основной программы нет, все "висит" на прерывании
push BX;
push CX;
push DX;
call key_push; обработчик
pop DX;
pop CX;
pop BX;
pop AX;
iret; востановление всего из стека
В процедуре обработчике проверяется код нажатой клавиши (сравнивается с константой) и осуществляется переход к соответствующей процедуре-обработчику данной клавиши:
;#######################################################################
; Обработчик нажатия кнопки
;#######################################################################
key_push:
mov BL, 01000000b; команда чтение ОЗУ клавиатуры 0 адрес
mov KKD_RU, BL;
mov BL, KKD_D; читаем код нажатой клавиши
and BL,00111111b; обрезаем "шифт и контрол"
; cmp BL, 0h; 0
jne K_1;
mov BL, 00h; код кнопки - ее значени
jmp Input; уходим на ввод в нужную позицию
K_1: cmp BL, 00001000b; 1
je K_2;
mov BL, 01h; код кнопки - ее значени
jmp Input; уходим на ввод в нужную позицию
K_2: cmp BL, 00010000b; 2
jne K_3;
mov BL, 02h; код кнопки - ее значени
jmp Input; уходим на ввод в нужную позицию
K_3: cmp BL, 00011000b; 3
jne K_4;
mov BL, 03h; код кнопки - ее значени
jmp Input; уходим на ввод в нужную позицию
K_4: cmp BL, 00100000b;
jne K_5;
mov BL, 04h; код кнопки - ее значени
jmp Input; уходим на ввод в нужную позицию
K_5: cmp BL, 00101000b;
jne K_6;
mov BL, 05h; код кнопки - ее значени
jmp Input; уходим на ввод в нужную позицию
K_6: cmp BL, 00110000b;
jne K_7;
mov BL, 06h; код кнопки - ее значени
jmp Input; уходим на ввод в нужную позицию
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.