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

                       ; чтение кода нажатой клавиши                     

                       ; что нажато пуск или смена счета ?   

      lxi   h,klav     ; занесение в пару h адреса ячейки памяти в которой

                      ; ранее сохранен код нажатой клавиши

      mov   a,m        ; пересылка кода нажатой клавиши из ячейки памяти, адрес

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

           cpi   1h         ; число 1 соответствует нажатой клавише “0” (“пуск”)

           jz    pusk0      ; нажат пуск

                            ; нажата другая клавиша - т.е. нажата смена режима

reg:       mov   a,d        ; эталон количества секунд равен 1 ?

           cpi   1

           jnz   re1        ; нет, эталон кол. сек. равен 2, значит его надо

                            ; сделать равным 1

                            ; да, эталон кол. секунд равен 1

           mvi   d,2        ; установка режима счета 2

           jmp   prod

re1:       mvi   d,1        ; установка режима счета 1 

                            ;

                            ; проверка состояния секундомера стоит или считает

prod:      lxi   h,rab      ; берем состояние из ячейки памяти

           mov   a,m

           ana   a          ; в ячейке “0” (секундомер “стоит”)

           jz    circl      ; да, секундомер стоит, уходим на ожидание нажатия

                            ; клавиши “0” (“пуск”).

      jmp   pusk1      ; продолжение работы после смены режима

                            ;

pusk0:     lxi   h,rab      ; установка режима "работа", т.к. была нажата клавиша

                            ; “0” (“пуск”).

           mvi   m,1

                            ; работа секундомера - отсчет времени

pusk1:     mov   e,d        ; установка текущего количества секунд, через которые

                            ; надо изменить состояние секундомера (время задержки

                            ; в секундах), эталон хранится в регистре d

zad:       call  zader      ; * 17 вызов подпрограммы задержки на 1 сек.

      dcr   e          ; уменьшение на 1 текущего количества секунд (произошла

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

            jnz   zad        ; отработана задержка на заданное количество секунд ?

                            ; если нет, то надо повторить задержку на 1 сек,

                            ; если задержка отработана, то надо увеличить счетчик

                            ; времени

                       ; увеличение счетчика времени

      mov   a,b        ; пересылка в рег.а текущего времени,

                       ; которое хранится в рег. в

           add   d          ; сложение текущего времени с эталоном увеличения

                            ; секунд, который хранится в регистре d (там может быть

                            ; 1 или 2 в зависимости от режима счета (увеличение

                            ; текущего времени на 1 или на 2

      daa              ; превращение текущего времени в число в двоично-

                       ; десятичном коде

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

                       ; использования на следующем шаге счета

                       ; индикация

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

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

      rrc              ; перемещаем старшую цифру в младшие 4 разряда

      rrc