Изучение программы “секундомер”, страница 3

      rrc

      rrc

      call  tabcn      ; вызов подпрограммы табличного преобразования

      out   porta      ; вывод на индикацию старшей цифры числа

                       ;

                       ; подготовка к индикации младшей цифры числа

      mov   a,b        ; восстанавливаем текущее время

      ani   0fh        ; стираем старшую цифру (ст. 4 разряда)

      call  tabcn      ; вызов подпрограммы табличного преобразования

      out   portb      ; вывод на индикацию младшей цифры числа

                       ;    

      jmp   pusk1      ; зацикливание программы (переход на начало)

                            ;

                            ; подпрограмма задержки на 1 сек. с опросом клавиатуры.

zader:     lxi   h,pov      ; * 10 загрузка в пару h постоянной времени для ; ;

; реализации

                            ; задержки на 1 сек.

zader1:    in    portc      ; ** 10 опрос клавиатуры

            ani   kodkl1     ; ** 7 нажаты кл. “останов” (“1”) или кл. “смена режима”

                            ;(“2”) (код маски 00000110)

           jz    zader2     ; ** 10 нет нажатия - продолжаем выполнять временную

; задержку

      mvi   c,povdr    ; нажато что-то нужное переходим к защите от дребезга

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

                            ; аналогична описанным ранее

zader3:    in    portc

      ani   kodkl1            

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

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

      dcr   c

      jnz   zader3

      push  h          ; сохранение кода наж. клавиши

      in    portc

      lxi   h,klav

      mov   m,a

      pop   h

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

zader5:    in    portc           

      ana   a

      jnz   zader4

      dcr   c

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

                       ; так как нажато что-то нужное и это не помеха и не ; ;дребезг, то необходимо сменить режим счета, или остановиться, а значт необходимо ;срочно выйти из подпрограммы временной задержки. Это можно осуществить с помощью ;команды безусловного или условного перехода в любое место основной программы. Но в ;этом случае в стеке останется адрес возврата и стек приблизится к программе. Если ;так произойдет несколько раз, то стек может стереть программу, и она перестанет ;функционировать. Чтобы этого не произошло перед “аварийным” выходом из подпрограммы ;необходимо скорректировать указатель стека, - извлечь из него уже ненужный адрес ;возврата. Это можно сделать выполнив команду POP, которая берет из стека 2 байта и ;помещает их в указанную пару, изменяя при этом указатель стека.

      pop   h          ; коррекция указ. стека перед “аврийным” выходом из ПП

           lxi   h,klav     ; определение номера нажатой клавиши

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

      ani   2

      jnz   ost        ; нажат останов

           jmp   reg        ; нажата “смена режима” переход на смену реж.     

ost:       lxi   h,rab      ; установка режима "останов"

           mvi   m,0       

           jmp   circl      ; переход на начало

                            ;

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

                            ; постояная времени равна “0” ? (содержимое пары h)

            mov   a,h        ; ** 5 проверка на равенство 0 содержимого регистровой пары