еревірки умов;
(3) - оператор початку (кінця);
(4) - оператор розриву схеми;
(5) - оператор введення/виведення даних.
Рис.4.1 Види операторів
Застосуємо у нашому випадку розгалужений алгоритм (див. додаток A).
Робота нашої програми починається з ініціалізації використовуваних регістрів. Потім проводиться настройка портів, очищення осередків пам'яті, задаються часові цикли, використовувані для формування необхідних величин затримок при роботі. Відбувається звукова індикація, час затримки, в перебігу якої подається сигнал на динамік, одно 829мкс., Тобто з частотою близько 1,2 кГц, чутною людиною. Підключаються підпрограми INDIKATOR і KOD, необхідні для виведення підрахованих секунд на семисегментні індикатори. p> 5.Розробка керуючої програми
Програма, яка забезпечує роботу нашого секундоміра, написана мовою Assembler і побудована у вигляді основної програми та підпрограм. p> Основна програма виконує початкові установки режимів роботи і регістрів. Порти RA0-RA3 і RB0-RB6 налаштовані на виведення інформації, порти RB0-RB6 відповідають за відповідні сегменти індикатора. Порт RB7 зчитує значення з кнопки. Порт RA4 виробляє висновок логічної одиниці, для звукової індикації, яка здійснюється за допомогою підпрограми ZVUK, по першому натискання кнопки. Підпрограми INDIKATOR і KOD, необхідні для вироблення сигналів, які управляють семисегментними індикаторами. Підпрограма DELAY формує основну затримку на 0,1 с., затримка формується одним внутрішнім і одним зовнішнім циклами. Підпрограма INCTIM міняємо, відповідно з відображеними цифрами, значення регістрів temp0-temp3, для індикації.
Робота програми здійснюється за циклом. Спочатку виробляється ініціалізація портів, очищення робочих регістрів. Запуск програми здійснюється натисканням кнопки "Пуск/Стоп/Скидання". Всередині циклу здійснюється перевірка на переповнення секундоміра (якщо воно сталося, то відбувається обнуління всіх регістрів і програма очікує натискання кнопки "Пуск/Стоп/Скидання"). При натисканні кнопки "Пуск/Стоп/Скидання" відбувається зупинка підрахунку секунд, і програма чекає обнулення. Текст програми наведено нижче. br/>
LIST P = 16F628
# include
temp0 EQU H'20 ' p> temp1 EQU H'21 ' p> temp2 EQU H'22 ' p> temp3 EQU H'23 ' p> temp4 EQU H'24 '
temp5 EQU H'25 '
temp6 EQU H'26 ' p> temp7 EQU H'27 '
temp8 EQU H'28 '
i EQU H'29 '
t EQU H'30 '
k EQU H'31 '
N0 EQU H'32 '
N1 EQU H'33 '
В
org 0
goto Start
Start
clrf PORTA
bsf STATUS, RP0 p> movlw B'10000000 '
movwf TRISB ; Налаштувати RB7 на введення, RB0-RB6 на виведення
clrf TRISA p> bcf STATUS, RP0 p> clrf PORTB
В
k1
clrf temp0
clrf temp1
clrf temp2
clrf temp3
clrf temp4
clrf temp5
clrf temp6
clrf temp7
clrf temp8
clrf i
clrf t
В
call INDIKATOR
btfss PORTB, 7 p> goto k1
MOVLW 1 p> MOVWF i
В
MOVLW 1
MOVWF temp0
call ZVUK
goto c1
k2
call DELAY br/>
c1
call INDIKATOR
btfsc PORTB, 7
goto k3 br/>
c2
btfss i, 0
goto c1
k7
call INCTIM
goto k2
k3
btfsc PORTB, 7
goto k3
movf i, 0
movwf t p> incf i
btfss t, 0
goto k1
goto c2
В
INCTIM
movlw 0xe6 ; 230 разів
movwf temp4
k8 decfsz temp4, 1
goto k8
; збільшення до 0,9 сек
incf temp0
movf temp0, 0; інкрементіровать на 0,1 сек
sublw 9; перевірка: якщо> 9, то перейти
btfsc STATUS, 0; був позику - так, то clrf temp0 і на наступне збільшення
goto I0; інакше на IO
clrf temp0; очищення значення останнього розряду
; збільшення до 9 сек
В
incf temp1
movf temp1, 0
sublw 9
btfsc STATUS, 0
goto I1
clrf temp1
; збільшення до 59 сек
В
incf temp2
movf temp2, 0
sublw 5 p> btfsc STATUS, 0
goto I2
clrf temp2
; збільшення 10 хв
В
incf temp3
movf temp3, 0
sublw 9
btfsc STATUS, 0
goto I3 p> clrf temp3
return
I0
nop
nop
nop
nop
nop
I1
nop
nop
nop
nop
nop
I2 nop
nop
nop
nop
nop
I3 nop
...