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

BSF PORTA,1          ; зажечь светодиод  VD1

goto         met1

met0

BCF PORTA,1          ; погасить светодиод VD1

met1

return

Задание 3.

Рассмотрим программу вывода на индикатор  HG1 лабораторного макета числа в шестнадцатиричном коде, например числа 6.

loop

movlw    0x06         ; загрузить константу  h’6’ в рабочий регистр W

call    sev_seg         ; вызов подпрограммы перекодировки  sev_seg

; в регистре W – семисегментный код числа

movwf  PORTB      ; пересылка содержимого W порт В (вывод на HG1)

goto      loop            ; переход на метку  loop

#include "sev_seg.asm"

sev_seg

andlw   0x0f         ; маскирование (обнуление) старшей тетрады

; содержимого регистра W

addwf   PCL,F      ; сложение W с PCL и пересылка результата в PCL

retlw     0x80        ; возврат из подпрограммы с W=0x80 (код числа ‘0’)

retlw     0xf2        ; возврат из подпрограммы с W=0xF2 (код числа ‘1’)

retlw     0x48        ; возврат из подпрограммы с W=0x48 (код числа ‘2’)

retlw     0x60        ; возврат из подпрограммы с W=0x60 (код числа ‘3’)

retlw     0x32        ; возврат из подпрограммы с W=0x32 (код числа ‘4’)

retlw     0x25        ; возврат из подпрограммы с W=0x25 (код числа ‘5’)

retlw     0x04        ; возврат из подпрограммы с W=0x04 (код числа ‘6’)

retlw     0xf0        ; возврат из подпрограммы с W=0xF0 (код числа ‘7’)

retlw     0x00        ; возврат из подпрограммы с W=0x00 (код числа ‘8’)

retlw     0x20        ; возврат из подпрограммы с W=0x20 (код числа ‘9’)

retlw     0x10        ; возврат из подпрограммы с W=0x10 (код числа ‘A’)

retlw     0x06        ; возврат из подпрограммы с W=0x06 (код числа ‘B’)

retlw     0x8c        ; возврат из подпрограммы с W=0x8C (код числа ‘C’)

retlw     0x42        ; возврат из подпрограммы с W=0x42 (код числа ‘D’)

retlw     0x0c       ; возврат из подпрограммы с W=0x0C (код числа ‘E’)

retlw     0x1c       ; возврат из подпрограммы с W=0x1C (код числа ‘F’)

Задание 4.

Используя подпрограмму перекодировки sev_seg, напишем программу, которая читает состояния переключателей SA1 и SA2 и выводит на индикатор HG1 соответствующее число.      

loop

call       get_RA           ; вызов подпрограммы GET_RA

get_RA                                      ; подпрограмма чтения состояния порта А

movf PORTA,W      ; Пересылка состояния порта A в регистр W

movwf TEMPA      ; Пересылка содержимого W в регистр TEMPA

return

RRF TEMPA                  ; сдвиг вправо через перенос

;  содержимого регистра  TEMPA

RRF TEMPA, W               ; сдвиг вправо через перенос содержимого

; регистра  TEMPA, результат в регистре  W

ANDWF 00000011B           ; выделить два младших разряда в регистре  W,

; остальные замаскировать

call     sev_seg        ; вызов подпрограммы перекодировки  sev_seg

MOVWF PORTB                    ; вывод на индикатор HG1

goto      loop           ; зацикливание программы

#include "sev_seg"

Задание 5.

Рассмотрим теперь программы, работающие в реальном масштабе времени, т.е. выдающие сигналы определенной длительности и частоты следования, либо учитывающие временные параметры входных сигналов. Основным элементом таких программ является подпрограмма формирования временной задержки. Рассмотрим один из возможных вариантов такой подпрограммы с использованием программных методов формирования задержки, т.е. без применения встроенного таймера.

Определим значение константы  L  для получения длительности задержки  0,5 мс. Эта задержка буде использоваться в дальнейших программах управления.                  TD = [4 + 3 * (L – 1) + 4]* Tц =(5 + 3 * L)* Tц, где  L – константа, загружаемая в рабочий регистр.

При тактовой частоте  Fosc = 2 МГц  длительность цикла равна  Tц = 2 мкс. Тогда

L= (TD  – 5 Tц)/3 Tц = (0,5мс-10мкс)/6мкс=82