Устройство управления светофором, страница 5

; защита от дребезга на нажатие и отпускание

zader3:         in     portc          ; опрос клавиатуры, w31

                   ani    kodkl1       

                   jz      zader2       ; дребезг или помеха – продолжаем отработку

; временной задержки, w32

                   dcr    c

                   jnz    zader3       ; w33

                   in      portc

                   mov  b,a

zader4:        mvi   c,povdr      ; защита от дребезга на отпускание, w34

zader5:        in      portc          ; w35

                  ana    a                

                  jnz     zader4        ; w36

                  dcr     c

                  jnz     zader5        ;конец защиты от дребезга, w37

; т.к. нажато что то нужное и это не помеха и не дребезг, то надо

; остановиться или сменить режим, а значит необходимо срочно выйти из

; подпрограммы временной  задержки. Это можно осуществить с помощью

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

; программы. Но тогда в стеке останется адрес возврата и стек

; приблизится к программе. Если это повторится несколько раз, то стек     ;может стереть программу, и она перестанет функционировать. Для

; предотвращения этого перед «аварийным» выходом из подпрограммы

; надо скорректировать указатель стека, т.е. извлечь из него уже ненужный

; адрес возврата. Это можно сделать выполнив команду POP, которая

; берет из стека 2 байта и помещает их в указанную пару, изменяя

; при этом указатель стека.       

                  pop   h           ; коррекция указателя стека перед «аварийным»

; выходом из подпрограммы

                  mov   a,b        ; что нажато?

                  cpi     02h       ; нажата клавиша «1» (стоп)

                  jz       circl      ; переход к метке circl, w38

                  cpi     08h        ; нажата клавиша «3» (ночной режим)

                  jz       noch       ; переход к выполнению «ночного» режима, w39

                  jmp    jestk       ; переход к «жесткому режиму», w40

zader2:        dcx   h              ; ** 5 уменьшение на 1 пост. времени, w41  

                  mov   a,h           ; ** 5 проверка на рав-во «0» содерж. регис-й пары 

                  ora     l               ; ** 4

                  jnz     zader1    ; ** 10  нет, пост-я времени еще не равна «0»,

 ; переход к след. циклу врем. задер. на 1 сек., w42

                  ret                     ; *10 Возврат из подпрограммы задержки, w43  

; таблица кодов для вывода на индикаторы необходимых сегментов

base:           db     80h             ; код сегмента «А» (красный свет)

                   db     02h             ; код сегмента «G» (желтый свет)

                   db     10h             ; код сегмента «D» (зеленый свет)

                   end                       ; директива ассемблера, означающая конец ;текста программы.

Расчет временной задержки

Од+Мн+ Pov =2000000, где Од – суммарное количество тактов команд, выполняющихся однократно при формировании временной задержки (помечены знаком *); Мн – суммарное количество тактов команд, выполняющихся в цикле (помечены знаком **); Pov – количество повторений цикла; 2220000 – количество тактов в 1 с. (для тактовой частоты 2,22 МГц).

Од=17+10=27

Мн=10+7+10+5+5+4+10=51 такт

Pov=(2220000-Од)/Мн

Pov=(2220000-27)/51=43528,8823529

В качестве Pov берем целое число проходов  43528.

Листинг программы

Кросс-асемблер 80/85 ### Файл листинга SVET.lst

Входной файл   > SVET.asm

Объектный файл > SVET.obj

1 проход