Разработка микропроцессорного устройства управления двухтактным двигателем внутреннего сгорания, страница 4


Рис.1. Алгоритм решения поставленной задачи.

;программа для устройства управления двухтактным двигателем внутреннего сгорания

; функции :        0 –пуск (установлен по умолчанию), 1 –стоп

; регистры:        b,de–сч. применяемые соотв. при защите от дребезга и врем. задержке

;                  h-содержит код текущего режима  (01h- стоп, 02h- пуск)

;                  стек - хранит коды символов выводимых на индикаторы

;                  (3ah- нижнее положение поршня,c7h-верхнее положение поршня)

d1  equ  80h      ; адрес первого индикатора

d2  equ  81h      ; адрес второго индикатора

kb  equ  82h      ; адрес клавиатуры

rl  equ  83h      ; адрес порта управления внешними устройствами

l1  equ  44848    ; постоянная времени задержки программы

l2  equ  00h      ; постоянная времени защиты от дребезга (256 повторов)

    org  800h     ; стартовый адрес программы в ОЗУ стенда 

    mvi  a,89h    ; загрузка управляющего байта внешних устройств

    out  rl       ; вывод управляющего байта в порт управления

    lxi  sp,900h  ; инициализация указателя стека

    mvi  h,01h    ;установка режима «стоп» по умолчанию

    lxi  d,3ac7h  ;загрузка кодов выводимых на индикаторы символов

    push d        ;коды выводимых символов будут храниться на стеке

r2: pop  d        ;10\загружаем в пару d коды символов

    mov  a,e      ;5\*регистры d и e обмениваются содержимым (наступает новая фаза) 

    mov  e,d      ;5\*

    mov  d,a      ;5\*

    push d        ;11\сохранение на стеке новой фазы работы двигателя

    out  d1       ;10\вывод на индикацию положения первого поршня

    mov  a,e      ;5\загрузка кода символа второго поршня    

    out  d2       ;10\ вывод на индикацию положения второго поршня  

    lxi  d,l1     ;10\ загрузка в пару d постоянной времени задержки

r1: call tm       ;17\вызов программы задержки и опроса клавиатуры

    mvi  a,02h    ;(7)\загр. в регистр a кода режима «пуск» для сравнения с тек. режимом

    cmp  h        ;(7)\текущий режим это «пуск»?

    jnz  r1       ;(10)\если нет то переход (пара d не изменяется- задержка бесконечна) 

    dcx  d        ;(5)\уменьшение счетчика цикла задержки

    mov  a,d      ;(5)\*проверка содержимого счетчика цикла задержки на 0

    ora  e        ;(4)\*  

    jnz  r1       ;(10)\если не 0 то цикл временной задержки  продолжается 

    jmp  r2       ;10\цикл задержки окончен, приступаем к выводу на инд. новой фазы

tm: mvi  b,l2     ;(7)загрузка количества повторов при защите от дребезга на нажатие

r3: in   kb       ;(10)опрос клавиатуры

    mov  c,a      ;(5)сохранение текущего состояния клавиатуры

    ana  h        ;(4)маскируем ненужные биты

    rz             ;(11)выход, если не нажата клавиша не соответствующая текущему режиму

    dcr  b        ;уменьшение счетчика повторов при защите от дребезга

    jnz  r3       ;переход если цикл защиты дребезга на нажатие еще не окончен

    mov  a,c      ;найдем код нового режима по сохраненному состоянию  клавиатуры

    cma            ;*нахождение кода нового режима

    ani  03h      ;*

    mov  h,a      ;сохранение  кода нового режима

r4: mvi  b,l2     ;загрузка количества повторов при защите от дребезга на отпускание

r5: in   kb       ;опрос клавиатуры

    ana  a        ;проверка на то что все клавиши отжаты

    jnz  r4       ;если какая то клавиша нажата то переход

    dcr  b        ;ничего не нажато, уменьшение сч. повторов при защите от дребезга

    jnz  r5       ;переход если дребезг еще не окончен

    ret            ;обработка нажатий клавиш окончена, выход в основную программу