Разработка и исследование управляющих программ для микроконтроллеров PIC16F84. Принципиальная схема лабораторного макета, страница 4

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”