SB1_VD1M
BTFSC TEMPA,4 ; пропустить команду, если TEMPA,4 = 0 (кнопка нажата)
goto met0
BSF PORTA,1 ; зажечь светодиод VD1
call del05ms ; вызов подпрограммы задержки на 0,5 с
BCF PORTA,1 ; погасить светодиод VD1
call del05ms ; вызов подпрограммы задержки на 0,5 с
met0
BTFSS TEMPA,4 ; пропустить команду, если TEMPA,4 = 1
goto met1
BCF PORTA,1 ; погасить светодиод VD1
met1
return
del05ms ; подпрограмма задержки на 0,5 с
movlw .25
movlw COUNT3 ; загрузить константу d’25’ в регистр COUNT3
loop3
call del20ms ; вызов подпрограммы задержки на 20 мс
decfsz COUNT3,F ; декремент COUNT3 и проверка на нуль
goto loop3 ; повторение цикла 25 раз
return
#include "del20ms"
Задание 9.
Подпрограммы формирования задержки времени могут использоваться при работе с такими внешними источниками сигналов, как тумблеры, кнопки, переключатели и т.п. Дело в том, что все механические коммутаторы имеют одно негативное свойство, известное как «дребезг» контактов, которое обусловлено механическими колебаниями контактов при их замыкании и размыкании. Длительность колебаний составляет обычно несколько миллисекунд, в течении которых на вход МК может поступать пачка импульсов вместо идеального перепада.
Аппаратные способы борьбы с «дребезгом» контактов основаны на использовании RS-триггеров, одновибраторов или триггеров Шмитта. В микроконтроллерных устройствах подавление влияния «дребезга» контактов обычно осуществляется программными способами, которые основаны на повторном считывании состояния линии порта через определенное время.
В качестве примера рассмотрим «бездребезговый» вариант подпрограммы чтения состояния порта А.
get_RAD ; подпрограмма чтения состояния порта А в регистр
; TEMPA с подавлением «дребезжания»
movf PORTA,W ; чтение состояния порта А в регистр W
andlw 0x1c ; наложение маски b’00011100’ на
; неиспользуемые биты регистра W
movwf TEMPA ; пересылка W регистр TEMPA
call del20ms ; вызов подпрограммы задержки на 20 мс
movf PORTA,W ; чтение состояния порта А в регистр W
andlw 0x1c ; наложение маски b’00011100’
subwf TEMPA,W ;вычитание содержимого W из TEMPA
btfss STATUS,Z ; проверить результат вычитания на нуль
goto get_RAD ; возврат на начало, если не нуль
return ; возврат из подпрограммы, если нуль
Необходимо разработать программу, которая подсчитывает количество нажатий на кнопку SB1 с выводом результата на семисегментный индикатор HG1 в шестнадцатиричном коде. Для подсчета числа нажатий используем регистр с именем COUNT3. Основная программа может иметь следующий вид:
........................... ; сброс счетчика нажатий
loop
........................... ; вызов подпрограммы get_RAD
............................. ; проверка нажатия на кнопку SB1, если кнопка
goto loop ; не нажата, то возврат на метку loop
................................ ; инкремент счетчика COUNT3 и пересылка
................................. ; содержимого в рабочий регистр W
................................ ;вызов подпрограммы перекодировки sev_seg
................................ ; вывод результата на HG1
test
............................... ; вызов подпрограммы get_RAD и
............................... ; проверка нажатия кнопки SB1
goto test ; если еще нажата, то возврат на метку test
goto loop ; если не нажата, то идти на метку loop
#include “get_RAD”
#include “sev_seg”
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.