Проектирование устройства состоящего из 15 микросхем, страница 2


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;                          уходим на ввод в нужную позицию