
Программа написана на асемблере
Спойлер
Код: Выделить всё
;программа управления светодиодным фонариком
;на контроллере 12F675
LIST P=12F675, R=DEC
include "P12F675.INC"
__CONFIG (_CPD_OFF&_CP_OFF&_BODEN_ON&_MCLRE_OFF&_PWRTE_ON&_WDT_ON&_INTRC_OSC_NOCLKOUT)
; cpd_ защита пам данных выкл
; cp_ защита пам програм выкл
; boden_ разр сброса по снижению питания вкл
; mclre_ gp3 как порт, -mclre подключен к vdd
; pwrte_ таймер включения питания вкл
; wdt_ сторожевой таймер вкл
; intrc_ вутренний rc, gp4 gp5 как порт
errorlevel 0,-305,-302
;*******************************************************************************
; ПЕРЕМЕННЫЕ
;*******************************************************************************
cblock 20h ; Начальный адрес блока пользовательской памяти
P_Err ; Счётчик периодов в цикле
STATBAT ; Статус батареи
;7- 0-заряжено 1-разряжено
;6- разрешение на включение фонаря 1-можно 0-нельзя
FLAGIZM ;0-флаг сравнения
; если U> UMAX, UMIN то выставляем флаг =1
; если U< UMAX, UMIN то выставляем флаг =0
;1-флаг нажатия кнопки
; кнопка нажималась флаг =1
; кнопка не нажималась флаг =0
;2- разрешение на включение фонаря 1-можно 0-нельзя
;3-флаг не нажатия кнопки
; кнопка не нажималась флаг =1
; кнопка нажималась флаг =0
var01 ; Временный регистр
var02 ; Временный регистр
var03 ; Временный регистр
var04 ; Временный регистр
U_H ; напряжение старший разряд
U_L ; напряжение младший разряд
UMAX_H ; максимальное напряжение старший разряд
UMAX_L ; максимальное напряжение младший разряд
UMIN_H ; минимальное напряжение старший разряд
UMIN_L ; минимальное напряжение младший разряд
endc
;*******************************************************************************
; ПРОГРАММА
;*******************************************************************************
ORG 0 ; Начало
goto start ; Переход на основную программу
ORG 4 ; Вектор прерывания
; далее код обработчика которого нет
RETFIE ; Возврат из прерывания
;*******************************************************************************
; ИНИЦИАЛИЗАЦИЯ
;*******************************************************************************
start
;******** КОНФИГУРИРОВАНИЕ КОНТРОЛЛЕРА ********************************************************
;*** Необходимо помнить, что калибровочные константы стираются при программировании, **********
;****** Калибровка Генератора *****************************************************************
bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
Call 3FFh ; калибровочная константа внутреннего RC генератора в w
movwf OSCCAL ; Загрузить калибровочную константу
;****** Калибровка предделителя ****************************************************************
bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
clrwdt ; сброс сторожевго таймера и прдделителя
bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
movlw b'11001111' ;7-1 подтягивающие резисторы выключены,
;5-0 внутренний тактовый сигнал
;3-1 предделитель WDT
;2,1,0-111 ккоэффициент 1:128 2.3сек
movwf OPTION_REG ; запись управляющего слова
;****** Калибровка прерывания ******************************************************************
bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
movlw b'00000000' ;7,0 все прерывания запрещены
movwf INTCON ; запись управляющего слова
;******** Установка направления работы ног *****************************************************
;GP0 -вход аналоговый измерение напряжения аккумулятора
;GP1 -выход цыфровой управление светом фонаря 1-включено
;GP2 -выход цыфровой управление питанием контроллера 1-включено
;GP3 -вход цыфровой кнопка 1-включено
;GP4 -выход цыфровой индикация 0-зелёный 1-красный 3-е ссостояние потушить
;GP5 -выход цыфровой управление зарядом 0-включить 3-е состояние выключить
clrf GPIO ; инициализация защелок (все выходы равны нулю)
movlw b'00000111' ;2,1,0-111 выключить компаратор
movwf CMCON ; компаратор выключен, GP0, GP1, GP2 - цифровые вх/вых
bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
movlw b'00000000' ; выключить опорное напряжение
movwf VRCON ; компаратор выключен
movlw b'00001001' ; настройка входов/выходов (Порт направления: 1=вход 0=выход)
movwf TRISIO ; запись управляющего слова
clrf WPU ; подтягивающие резисторы выключены
clrf IOCB ; прерывания по измненению сигнвла на входвх запрещены
movlw b'01110001' ; настройка входов АЦП
;6,5,4-Х11 отдельнфй внутренний RC генератор
;3,2,1,0-0001 GP3,2,1-выход цыфровой GP0-вход аналоговый
movwf ANSEL ; запись управляющего слова
;******** Управление АЦП ***********************************************************************
bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
movlw b'10000001' ;7-1 правое выравнивание
;6-0 опорное напряжение от питания контроллера Vdd
;3,2-00 выбор 0-го аналогового канала, GP0-вход аналоговый
;1-0 бит статуса модуля АЦП 1-начать преобразование 0-преобразование завершено
;0-1 бит включения модуля АЦП 1-модуль включен, 0-модуль выключен и не потребляет ток
movwf ADCON0 ; запись управляющего слова
;******** Начало логики работы *****************************************************************
bsf GPIO,GP2 ; включение питания контроллера 1-включено
prodprov
clrwdt ; сброс сторожевго таймера и прдделителя
clrf FLAGIZM ; обнулить все флаги измерения
Call knop1 ;подпрограмма проверка нажатия кнопки
Call knop2 ;подпрограмма проверка не нажатия кнопки
;проверка вариантов запуска
btfsc FLAGIZM,1 ;проверка в регистрe FLAGIZM,1 бит=0 то следующее пропустить
goto provml11 ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
btfss FLAGIZM,1 ;проверка в регистрe FLAGIZM,1 бит=1 то следующее пропустить
goto provml12 ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml12 ;если FLAGIZM,1=0
btfsc FLAGIZM,3 ;проверка в регистрe FLAGIZM,3 бит=0 то следующее пропустить
goto xod11 ;если бит FLAGIZM,3=0 то выполнится код внутри
goto prodprov ;не корректное поведение кнопки порверить снова
xod11 ;
btfss FLAGIZM,3 ;проверка в регистрe FLAGIZM,3 бит=1 то следующее пропустить
goto xod12 ;если бит FLAGIZM,3=1 то выполнится код внутри
goto ciklzar ; начало основного цикла заряда**************
xod12 ;
goto oconizm11 ;
provml11 ;если FLAGIZM,1=1
btfsc FLAGIZM,3 ;проверка в регистрe FLAGIZM,3 бит=0 то следующее пропустить
goto xod13 ;если бит FLAGIZM,3=0 то выполнится код внутри
goto ciklfon ; начало основного цикла фонарика************
xod13 ;
btfss FLAGIZM,3 ;проверка в регистрe FLAGIZM,3 бит=1 то следующее пропустить
goto xod14 ;если бит FLAGIZM,3=1 то выполнится код внутри
goto ciklfon ; начало основного цикла фонарика************ пофиг всёравно включить
; goto prodprov ;не корректное поведение кнопки порверить снова
xod14 ;
oconizm11
;****************************************************************************************************************************************
ciklzar ; начало основного цикла заряда
clrwdt ; сброс сторожевго таймера и прдделителя
clrf FLAGIZM ; обнулить все флаги измерения
bcf GPIO,GP2 ; выключение питания контроллера 0-включено т.к питание от зарядника
;программа включить заряд
bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
bcf TRISIO,GP5 ; GP5 на выход
bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
bcf GPIO,GP5 ;включить заряд 0-включено
;число 866 4.1в это число при котором устонавливается порог заряда батареи
;выше него выключится заряд
movlw b'00000011' ;;;;;
movwf UMAX_H ; максимальное напряжение старший разряд
movlw b'01100010'
movwf UMAX_L ; максимальное напряжение младший разряд
clrwdt
Call DELAY_ADC ;чтение результата преобразования АЦП
Call srav_napr ;подпрограмма сравнения
;индикация результата сравнения
btfsc FLAGIZM,0 ;проверка в регистрe FLAGIZM бит=0 то следующее пропустить
goto jamp07 ;если бит =0 то выполнится код внутри
Call gp4_kr ;0-й бит =0
;программа включить заряд
bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
bcf TRISIO,GP5 ; GP5 на выход
bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
bcf GPIO,GP5 ;включить заряд 0-включено
jamp07 ;
btfss FLAGIZM,0 ;проверка в регистрe FLAGIZM бит=1 то следующее пропустить
goto jamp08 ;если бит =1 то выполнится код внутри
Call gp4_zel ;0-й бит =1
;программа выключить заряд
bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
bsf TRISIO,GP5 ; GP5 на вход
bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
;эта часть кода на сучай если зарядное осталоси поделюченым
podzarad
clrwdt ; сброс сторожевго таймера и прдделителя
clrf FLAGIZM ; обнулить все флаги измерения
;число 846 4.01в это число при котором устонавливается порог заряда батареи
;ниже него включится заряд
movlw b'00000011' ;;;;;
movwf UMAX_H ; максимальное напряжение старший разряд
movlw b'01100010'
movwf UMAX_L ; максимальное напряжение младший разряд
clrwdt
Call DELAY_ADC ;чтение результата преобразования АЦП
Call srav_napr ;подпрограмма сравнения
;результат сравнения
btfsc FLAGIZM,0 ;проверка в регистрe FLAGIZM бит=0 то следующее пропустить
goto jamp09 ;если бит =0 то выполнится код внутри
goto ciklzar ; начало основного цикла заряда**************
jamp09 ;
btfss FLAGIZM,0 ;проверка в регистрe FLAGIZM бит=1 то следующее пропустить
goto jamp10 ;если бит =1 то выполнится код внутри
;моргнём зелёным
Call pause
Call gp4_0
Call pause
Call gp4_zel
goto podzarad
jamp10
jamp08
goto ciklzar ; и переходить обратно для зацикливания
;****************************************************************************************************************************************
ciklfon ; начало основного цикла фонарика
clrwdt ; сброс сторожевго таймера и прдделителя
clrf FLAGIZM ; обнулить все флаги измерения
Call knop2 ;подпрограмма проверка не нажатия кнопки
btfss FLAGIZM,3 ;проверка в регистрe FLAGIZM,3 бит=1 то следующее пропустить
goto ciklfon ; кнопка не отпущена
ciklfonrab
clrf FLAGIZM ; обнулить все флаги измерения
clrwdt ; сброс сторожевго таймера и прдделителя
;программа выключить заряд
bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
bsf TRISIO,GP5 ; GP5 на вход
bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
;обьявить переменные
clrf FLAGIZM ; обнулить все флаги измерения
;число 612 3в это число при котором устонавливается порог разряда батареи
;ниже него фонарик просто выключится
movlw b'00000010' ;;;;;
movwf UMAX_H ; максимальное напряжение старший разряд
movlw b'01100110'
movwf UMAX_L ; максимальное напряжение младший разряд
clrwdt
Call DELAY_ADC ;чтение результата преобразования АЦП
Call srav_napr ;подпрограмма сравнения
bsf FLAGIZM,2 ;2-й бит в 1 разрешение на включение фонаря
;индикация результата сравнения
btfsc FLAGIZM,0 ;проверка в регистрe FLAGIZM бит=0 то следующее пропустить
goto jamp03 ;если бит =0 то выполнится код внутри
Call gp4_kr ;0-й бит =0
bcf FLAGIZM,2 ;2-й бит в 0 разрешение на выключение фонаря
jamp03 ;
btfss FLAGIZM,0 ;проверка в регистрe FLAGIZM бит=1 то следующее пропустить
goto jamp04 ;если бит =1 то выполнится код внутри
Call gp4_zel ;0-й бит =1
bsf FLAGIZM,2 ;2-й бит в 1 разрешение на включение фонаря
jamp04 ;
;управление светом фонаря
btfsc FLAGIZM,2 ;проверка в регистрe FLAGIZM бит=0 то следующее пропустить
goto jamp05 ;если бит =0 то выполнится код внутри
bcf GPIO,GP1 ;управление светом фонаря 0-выключено
bcf GPIO,GP2 ; включение питания контроллера 0-выключено
jamp05 ;
btfss FLAGIZM,2 ;проверка в регистрe FLAGIZM бит=1 то следующее пропустить
goto jamp06 ;если бит =1 то выполнится код внутри
bsf GPIO,GP1 ;управление светом фонаря 1-включено
jamp06
Call knop1 ;подпрограмма проверка нажатия кнопки
;команда на выключение
btfsc FLAGIZM,1 ;проверка нажатия кнопки бит=0 то следующее пропустить
goto log01 ;если 1-й бит =0 выполняется это условие ниже
nop
log01
btfss FLAGIZM,1 ;проверка нажатия кнопки бит=1 то следующее пропустить
goto log02 ;если 1-й бит =1 выполняется это условие ниже
bcf GPIO,GP2 ; включение питания контроллера 0-выключено, кнопка нажималась
bcf FLAGIZM,1 ;1-й бит в 0 сброс флага нажатия кнопки
bcf GPIO,GP1 ;управление светом фонаря 0-выключено
bcf FLAGIZM,2 ;2-й бит в 0 выключение фонаря
goto $-1 ;отступить на шаг назад зависнуть навсегда
log02
clrwdt ; сброс сторожевго таймера и прдделителя
goto ciklfonrab ; и переходить обратно для зацикливания
;****************************************************************************************************************************************
;ПОДПРОГРАММЫ
;подпрограмма проверка нажатия кнопки
knop1 clrwdt ; сброс сторожевго таймера и прдделителя
movlw 0ffh ;загрузить 0ffh в регистр w
movwf var03 ;загрузить регистр w в var03
loop3 movlw 0ffh ;загрузить 0ffh в регистр w
movwf var04 ;загрузить регистр w в var04
loop4 btfsc GPIO,GP3 ;проверка нажатия кнопки бит=0 то следующее пропустить
goto next1 ;кнопка удерживается
btfss GPIO,GP3 ;проверка нажатия кнопки бит=1 то следующее пропустить
goto bad1 ;проверка удержанмя провал
next1 decfsz var04,1 ;уменьшить на 1
goto loop4 ;и переходить обратно пока не станет =0
decfsz var03,1 ;уменьшить на 1
goto loop3 ;и переходить обратно пока не станет =0
bsf FLAGIZM,1 ;1-й бит в 1 флаг нажатия кнопки
goto endprov1 ;проверка удержанмя успешна
bad1 bcf FLAGIZM,1 ;1-й бит в 0 флаг нажатия кнопки
endprov1
return
;подпрограмма проверка не нажатия кнопки
knop2 clrwdt ; сброс сторожевго таймера и прдделителя
movlw 0ffh ;загрузить 0ffh в регистр w
movwf var03 ;загрузить регистр w в var03
loop5 movlw 0ffh ;загрузить 0ffh в регистр w
movwf var04 ;загрузить регистр w в var04
loop6 btfss GPIO,GP3 ;проверка нажатия кнопки бит=1 то следующее пропустить
goto next2 ;кнопка не нажималась
btfsc GPIO,GP3 ;проверка нажатия кнопки бит=0 то следующее пропустить
goto bad2 ;проверка нажатия провал
next2 decfsz var04,1 ;уменьшить на 1
goto loop6 ;и переходить обратно пока не станет =0
decfsz var03,1 ;уменьшить на 1
goto loop5 ;и переходить обратно пока не станет =0
bsf FLAGIZM,3 ;3-й бит в 1 флаг не нажатия кнопки
goto endprov2 ;проверка удержанмя успешна
bad2 bcf FLAGIZM,3 ;3-й бит в 0 флаг нажатия кнопки
endprov2
return
;подпрограмма сравнения
srav_napr
;сравним два бита
clrwdt ; сброс сторожевго таймера и прдделителя
;проверка в регистра 1 в _H
btfsc UMAX_H,1 ;проверка в регистрe UMAX_H ст разр бит=0 то следующее пропустить
goto provml11_H ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
btfss UMAX_H,1 ;проверка в регистрe UMAX_H ст разр бит=1 то следующее пропустить
goto provml12_H ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml12_H ;если UMAX_H=0
btfsc U_H,1 ;проверка в регистрe U_H мл разр бит=0 то следующее пропустить
goto xod11_H ;если бит =0 то выполнится код внутри
goto per0_H ;переход при условии биты равны если U_H=0
xod11_H ;
btfss U_H,1 ;проверка в регистрe U_H мл разр бит=1 то следующее пропустить
goto xod12_H ;если бит =1 то выполнится код внутри
bsf FLAGIZM,0 ;0-й бит в 1 если U_H=1
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod12_H ;
goto oconizm11_H ;
provml11_H ;если UMAX_H=1
btfsc U_H,1 ;проверка в регистрe U_H мл разр бит=0 то следующее пропустить
goto xod13_H ;если бит =0 то выполнится код внутри
bcf FLAGIZM,0 ;0-й бит в 0 если U_H=0
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod13_H ;
btfss U_H,1 ;проверка в регистрe U_H мл разр бит=1 то следующее пропустить
goto xod14_H ;если бит =1 то выполнится код внутри
goto per0_H ;переход при условии биты равны если U_H=1
xod14_H ;
oconizm11_H
;проверка в регистра 0 в _H
per0_H
btfsc UMAX_H,0 ;проверка в регистрe UMAX_H ст разр бит=0 то следующее пропустить
goto provml01_H ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
btfss UMAX_H,0 ;проверка в регистрe UMAX_H ст разр бит=1 то следующее пропустить
goto provml02_H ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml02_H ;если UMAX_H=0
btfsc U_H,0 ;проверка в регистрe U_H мл разр бит=0 то следующее пропустить
goto xod01_H ;если бит =0 то выполнится код внутри
goto per7_L ;переход при условии биты равны если U_H=0
xod01_H ;
btfss U_H,0 ;проверка в регистрe U_H мл разр бит=1 то следующее пропустить
goto xod02_H ;если бит =1 то выполнится код внутри
bsf FLAGIZM,0 ;0-й бит в 1 если U_H=1
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod02_H ;
goto oconizm01_H ;
provml01_H ;если UMAX_H=1
btfsc U_H,0 ;проверка в регистрe U_H мл разр бит=0 то следующее пропустить
goto xod03_H ;если бит =0 то выполнится код внутри
bcf FLAGIZM,0 ;0-й бит в 0 если U_H=0
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod03_H ;
btfss U_H,0 ;проверка в регистрe U_H мл разр бит=1 то следующее пропустить
goto xod04_H ;если бит =1 то выполнится код внутри
goto per7_L ;переход при условии биты равны если U_H=1
xod04_H ;
oconizm01_H
;проверка в регистра 7 в _L
per7_L
btfsc UMAX_L,7 ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить
goto provml71_L ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
btfss UMAX_L,7 ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить
goto provml72_L ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml72_L ;если UMAX_H=0
btfsc U_L,7 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
goto xod71_L ;если бит =0 то выполнится код внутри
goto per6_L ;переход при условии биты равны если U_L=0
xod71_L ;
btfss U_L,7 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
goto xod72_L ;если бит =1 то выполнится код внутри
bsf FLAGIZM,0 ;0-й бит в 1 если U_L=1
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod72_L ;
goto oconizm71_L ;
provml71_L ;если UMAX_L=1
btfsc U_L,7 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
goto xod73_L ;если бит =0 то выполнится код внутри
bcf FLAGIZM,0 ;0-й бит в 0 если U_L=0
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod73_L ;
btfss U_L,7 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
goto xod74_L ;если бит =1 то выполнится код внутри
goto per6_L ;переход при условии биты равны если U_L=1
xod74_L ;
oconizm71_L
;проверка в регистра 6 в _L
per6_L
btfsc UMAX_L,6 ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить
goto provml61_L ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
btfss UMAX_L,6 ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить
goto provml62_L ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml62_L ;если UMAX_H=0
btfsc U_L,6 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
goto xod61_L ;если бит =0 то выполнится код внутри
goto per5_L ;переход при условии биты равны если U_L=0
xod61_L ;
btfss U_L,6 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
goto xod62_L ;если бит =1 то выполнится код внутри
bsf FLAGIZM,0 ;0-й бит в 1 если U_L=1
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod62_L ;
goto oconizm61_L ;
provml61_L ;если UMAX_L=1
btfsc U_L,6 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
goto xod63_L ;если бит =0 то выполнится код внутри
bcf FLAGIZM,0 ;0-й бит в 0 если U_L=0
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod63_L ;
btfss U_L,6 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
goto xod64_L ;если бит =1 то выполнится код внутри
goto per5_L ;переход при условии биты равны если U_L=1
xod64_L ;
oconizm61_L
;проверка в регистра 5 в _L
per5_L
btfsc UMAX_L,5 ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить
goto provml51_L ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
btfss UMAX_L,5 ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить
goto provml52_L ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml52_L ;если UMAX_H=0
btfsc U_L,5 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
goto xod51_L ;если бит =0 то выполнится код внутри
goto per4_L ;переход при условии биты равны если U_L=0
xod51_L ;
btfss U_L,5 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
goto xod52_L ;если бит =1 то выполнится код внутри
bsf FLAGIZM,0 ;0-й бит в 1 если U_L=1
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod52_L ;
goto oconizm51_L ;
provml51_L ;если UMAX_L=1
btfsc U_L,5 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
goto xod53_L ;если бит =0 то выполнится код внутри
bcf FLAGIZM,0 ;0-й бит в 0 если U_L=0
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod53_L ;
btfss U_L,5 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
goto xod54_L ;если бит =1 то выполнится код внутри
goto per4_L ;переход при условии биты равны если U_L=1
xod54_L ;
oconizm51_L
;проверка в регистра 4 в _L
per4_L
btfsc UMAX_L,4 ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить
goto provml41_L ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
btfss UMAX_L,4 ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить
goto provml42_L ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml42_L ;если UMAX_H=0
btfsc U_L,4 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
goto xod41_L ;если бит =0 то выполнится код внутри
goto per3_L ;переход при условии биты равны если U_L=0
xod41_L ;
btfss U_L,4 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
goto xod42_L ;если бит =1 то выполнится код внутри
bsf FLAGIZM,0 ;0-й бит в 1 если U_L=1
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod42_L ;
goto oconizm41_L ;
provml41_L ;если UMAX_L=1
btfsc U_L,4 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
goto xod43_L ;если бит =0 то выполнится код внутри
bcf FLAGIZM,0 ;0-й бит в 0 если U_L=0
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod43_L ;
btfss U_L,4 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
goto xod44_L ;если бит =1 то выполнится код внутри
goto per3_L ;переход при условии биты равны если U_L=1
xod44_L ;
oconizm41_L
;проверка в регистра 3 в _L
per3_L
btfsc UMAX_L,3 ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить
goto provml31_L ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
btfss UMAX_L,3 ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить
goto provml32_L ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml32_L ;если UMAX_H=0
btfsc U_L,3 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
goto xod31_L ;если бит =0 то выполнится код внутри
goto per2_L ;переход при условии биты равны если U_L=0
xod31_L ;
btfss U_L,3 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
goto xod32_L ;если бит =1 то выполнится код внутри
bsf FLAGIZM,0 ;0-й бит в 1 если U_L=1
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod32_L ;
goto oconizm31_L ;
provml31_L ;если UMAX_L=1
btfsc U_L,3 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
goto xod33_L ;если бит =0 то выполнится код внутри
bcf FLAGIZM,0 ;0-й бит в 0 если U_L=0
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod33_L ;
btfss U_L,3 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
goto xod34_L ;если бит =1 то выполнится код внутри
goto per2_L ;переход при условии биты равны если U_L=1
xod34_L ;
oconizm31_L
;проверка в регистра 2 в _L
per2_L
btfsc UMAX_L,2 ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить
goto provml21_L ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
btfss UMAX_L,2 ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить
goto provml22_L ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml22_L ;если UMAX_H=0
btfsc U_L,2 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
goto xod21_L ;если бит =0 то выполнится код внутри
goto per1_L ;переход при условии биты равны если U_L=0
xod21_L ;
btfss U_L,2 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
goto xod22_L ;если бит =1 то выполнится код внутри
bsf FLAGIZM,0 ;0-й бит в 1 если U_L=1
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod22_L ;
goto oconizm21_L ;
provml21_L ;если UMAX_L=1
btfsc U_L,2 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
goto xod23_L ;если бит =0 то выполнится код внутри
bcf FLAGIZM,0 ;0-й бит в 0 если U_L=0
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod23_L ;
btfss U_L,2 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
goto xod24_L ;если бит =1 то выполнится код внутри
goto per1_L ;переход при условии биты равны если U_L=1
xod24_L ;
oconizm21_L
;проверка в регистра 1 в _L
per1_L
btfsc UMAX_L,1 ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить
goto provml11_L ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
btfss UMAX_L,1 ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить
goto provml12_L ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml12_L ;если UMAX_H=0
btfsc U_L,1 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
goto xod11_L ;если бит =0 то выполнится код внутри
goto per0_L ;переход при условии биты равны если U_L=0
xod11_L ;
btfss U_L,1 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
goto xod12_L ;если бит =1 то выполнится код внутри
bsf FLAGIZM,0 ;0-й бит в 1 если U_L=1
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod12_L ;
goto oconizm11_L ;
provml11_L ;если UMAX_L=1
btfsc U_L,1 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
goto xod13_L ;если бит =0 то выполнится код внутри
bcf FLAGIZM,0 ;0-й бит в 0 если U_L=0
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod13_L ;
btfss U_L,1 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
goto xod14_L ;если бит =1 то выполнится код внутри
goto per0_L ;переход при условии биты равны если U_L=1
xod14_L ;
oconizm11_L
;проверка в регистра 0 в _L
per0_L
btfsc UMAX_L,0 ;проверка в регистрe UMAX_L ст разр бит=0 то следующее пропустить
goto provml01_L ;если 0-й бит =1 выполняется это условие т.к. разряд старшем байте еденица проверим младший разряд
btfss UMAX_L,0 ;проверка в регистрe UMAX_L ст разр бит=1 то следующее пропустить
goto provml02_L ;если 0-й бит =0 выполняется это условие т.к. разряд старшем байте нулевой проверим младший разряд
provml02_L ;если UMAX_H=0
btfsc U_L,0 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
goto xod01_L ;если бит =0 то выполнится код внутри
bcf FLAGIZM,0 ;0-й бит в 0 если U_L=0
goto oconizm ;переход при условии биты равны
xod01_L ;
btfss U_L,0 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
goto xod02_L ;если бит =1 то выполнится код внутри
bsf FLAGIZM,0 ;0-й бит в 1 если U_L=1
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod02_L ;
goto oconizm01_L ;
provml01_L ;если UMAX_L=1
btfsc U_L,0 ;проверка в регистрe U_L мл разр бит=0 то следующее пропустить
goto xod03_L ;если бит =0 то выполнится код внутри
bcf FLAGIZM,0 ;0-й бит в 0 если U_L=0
goto oconizm ;запомнить результат сравнения и закончить сравнивание
xod03_L ;
btfss U_L,0 ;проверка в регистрe U_L мл разр бит=1 то следующее пропустить
goto xod04_L ;если бит =1 то выполнится код внутри
bcf FLAGIZM,0 ;0-й бит в 0 если U_L=1
goto oconizm ;переход при условии биты равны
xod04_L ;
oconizm01_L
oconizm
return
;подпрограмма ожидания результата преобразования АЦП
DELAY_ADC
goto $+1 ;задержка после выбора канала ацп, + два шага
goto $+1
goto $+1
bsf ADCON0,GO_DONE ;разрешить преобразование АЦП (установить в 1 1-й бит регистра adcono)
btfsc ADCON0,GO_DONE ;проверка окончания преобразование АЦП если GO=0 то следующее пропустить
goto $-1 ;отступить на шаг назад
bcf INTCON,GIE ;запретить прерывания (установить в 0 7-й бит регистра intcon)
bsf STATUS, RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
movf ADRESL,W ;содержимое младшего разряда резултата АЦП в регистр w
bcf STATUS, RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
bsf INTCON,GIE ;разрешить прерывания (установить в 1 7-й бит регистра intcon)
movwf U_L ;загрузить регистр w в U_L (напряжение младший разряд)
movf ADRESH,W ;содержимое старшего разряда резултата АЦП в регистр w
movwf U_H ;загрузить регистр w в U_H (напряжение старший разряд)
return
;подпрограмма индикации зажеч зелёный GP4 - 1 направление выход
gp4_zel
bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
bcf TRISIO,GP4 ; GP4 на выход
bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
bcf GPIO,GP4 ; включение диода индикации 0-зелёный
return
;подпрограмма индикации зажеч красный GP4 - 0 направление выход
gp4_kr
bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
bcf TRISIO,GP4 ; GP4 на выход
bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
bsf GPIO,GP4 ; включение диода индикации 1-красный
return
;подпрограмма индикации потушить индикацию GP4 направление вход
gp4_0
bsf STATUS,RP0 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status)
bsf TRISIO,GP4 ; GP4 на вход
bcf STATUS,RP0 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status)
return
;подпорограмма паузы
pause clrwdt ; сброс сторожевго таймера и прдделителя
movlw 0ffh ;загрузить 0ffh в регистр w
movwf var01 ;загрузить регистр w в var01
loop2 movlw 0ffh ;загрузить 0ffh в регистр w
movwf var02 ;загрузить регистр w в var02
loop1 decfsz var02,1 ;уменьшить на 1
goto loop1 ;и переходить обратно пока не станет =0
decfsz var01,1 ;уменьшить на 1
goto loop2 ;и переходить обратно пока не станет =0
return ;выход из подпрограммы
;конец программы
END

