
Программирование учебных задач
Начнем программирование учебных задач с написания программы, которая считывает состояние кнопки SB1 и выводит его на светодиодный индикатор VD2 так, что не нажатому состоянию кнопки (высокому уровню сигнала на входе RA4) соответствует светящееся состояние светодиода, и наоборот.
;основная программа
LOOP
CLRWDT ;сброс сторожевого таймера
CALL GET_RA ;вызов подпрограммы GET_RA
CALL SB1_VD2 ;вызов подпрограммы SB1_VD2
GOTO LOOP ;переход к метке LOOP для повторения процесса
;
GET_RA ;подпрограмма чтения состояния порта A
MOVF PORTA,W ;чтение состояния порта A в W
MOVWF TEMPA ;пересылка W в TEMPA
RETURN ;возврат из подпрограммы
;
SB1_VD2 ;подпрограмма вывода на светодиод VD2
;состояния кнопки SB1 (разряда 4 регистра ;TEMPA)
BTFSS TEMPA,4 ;пропустить команду, если TEMPA,4=1
;(кнопка не нажата)
GOTO P0 ;перейти на P0
BSF VD2 ;зажечь светодиод VD2
P0
BTFSC TEMPA,4 ;пропустить команду, если TEMPA,4=0 (кнопка нажата)
GOTO P1 ;перейти на P1
BCF VD2 ;погасить светодиод
P1
RETURN
;
Основная программа содержит замкнутый цикл LOOP – GOTO LOOP, необходимый для периодического повторения цикла контроля состояния кнопки и вывода его на индикатор. Команда CLRWDT исключает влияние возможного сброса по переполнению сторожевого таймера на работу программы. Две следующие команды осуществляют вызов подпрограмм GET_RA и SB1_VD2. Первая из них (GET_RA) вначале считывает текущее состояние порта A, которое помещается в рабочий регистр W. Поскольку рабочий регистр может потребоваться при исполнении других команд, его состояние записывается в регистр TEMPA, используемый здесь для временного хранения состояния порта A. Таким образом, после возврата из подпрограммы GET_RA в разряде 4 регистра TEMPA содержится информация о состоянии кнопки SB1: “1” – не нажата, “0” – нажата.
Подпрограмма SB1_VD2 анализирует состояние разряда 4 регистра TEMPA и, в зависимости от его состояния, зажигает или гасит светодиод. В системе команд МК PIC16F84 нет команд условного перехода, поэтому для организации проверки того или иного условия используются команды, позволяющие пропустить выполнение следующей команды программы, в зависимости от состояния определенного бита в заданном регистре (BTFSS и BTFSC). В частности, команда BTFSS TEMP,4 пропускает исполнение команды GOTO P0, если TEMP,4 = 1 (кнопка не нажата). Тем самым реализуется команда BSF VD2, которая зажигает светодиод VD2. Затем анализируется условие TEMP,4 = 0 (кнопка нажата) и, если оно имеет место, светодиод гасится.
Один из примеров файла MPSIM.INI приведен ниже.
; MPSIM file for var1
P84 ;использование МК семейства PIC16C84
SR X ;представление данных в 16-ричном формате
AD RA4,B,1 ;вывод на экран линии 4 порта А (кнопка SB1) в двоичном формате
;на одно знакоместо
AD RA1,B,1 ;вывод на экран линии 1 порта А (светодиод VD2) в двоичном формате
;на одно знакоместо
LO VAR1
ST VAR1.STI
RE ;сброс времени выполнения команды и счетчика циклов
RS ;сброс МК
В качестве примера ниже приведен файл для стимуляции подачи нулей на вход 4 порта А (имитация нажатия кнопки SB1 макета).
! var1.STI
STEP RA4
1 1 !Установка на входе RA4 состояния “1”
500 0 !Поступление на вход RA4 сигнала “0”
1000 1 !Переход сигнала на входе RA4 в “1”
1500 0 !Повторная подача нулевого сигнала
1
3000 0