'****************************************************************
'* Name : TIMER ON.BAS *
'* Автор : Лобзанюк К.П. *
'* : *
'* : *
'* Дата : 18.04.2017 *
'* Версия : 2.00 *
'* : *
'* : *
'****************************************************************
' Declare Optimiser_Level 1 ' Включить оптимизацию программы
Device = 16F630
Config CP_OFF, CPD_OFF, MCLRE_OFF ,BODEN_OFF, PWRTE_ON, WDT_OFF , INTRC_OSC_NOCLKOUT
OPTION_REG = %00100110 'бит 5: T0CS: Выбор тактового сигнала для TMR0
'1 = внешний тактовый сигнал с вывода T0CKI
'0 = внутренний тактовый сигнал CLKOUT
INTCON = %10100000 'TMR0 активизирован
'--------------------Настройки портов-----------------------
Declare All_Digital = On ;Установить все порты цифровыми входами/выходами
TRISA = %00101111 ' RА0...RА4 вход
TRISC = %00000111 ' RC3,RC5 выход
' ;==========================================================================
Symbol TOIF INTCON.2 ' TOIF - cимвол флага прерывания по переполнению таймера TMRO
Symbol PIN = PORTA.4
Dim minut As Byte
Dim chas As Byte
Dim Sec As Byte
Dim min1 As Byte
Dim flag As Bit
Dim flag1 As Bit
Dim flag2 As Bit
Dim flag3 As Bit
Dim flag4 As Bit
Dim flag5 As Bit
Dim flag6 As Bit
Dim flag7 As Bit
Dim flag8 As Bit
Dim flag9 As Bit
Dim flag10 As Bit
Dim flag11 As Bit
Dim flag12 As Bit
'-------------------Инициирование прерываний-------------------
On_Interrupt GoTo EvriSec ' Включить аппаратную обработку прерывания
'--------------------------Главная программа--------------------------
main:
PORTC.4 = 1
PORTC.3 = 0 'опрос выключателей для звуковой сигнализации их включения
If PORTA.0 = 1 Then flag1 = 1 : EndIf
If PORTA.0 = 0 And flag1 = 1 Then GoSub Bee : flag1 = 0 : EndIf
If PORTA.1 = 1 Then flag2 = 1 : EndIf
If PORTA.1 = 0 And flag2 = 1 Then GoSub Bee : flag2 = 0 : EndIf
If PORTA.5 = 1 Then flag3 = 1 : EndIf
If PORTA.5 = 0 And flag3 = 1 Then GoSub Bee : flag3 = 0 : EndIf
If PORTA.3 = 1 Then flag4 = 1 : EndIf
If PORTA.3 = 0 And flag4 = 1 Then GoSub Bee : flag4 = 0 : EndIf
If PORTC.1 = 1 Then flag5 = 1 : EndIf
If PORTC.1 = 0 And flag5 = 1 Then GoSub Bee : flag5 = 0 : EndIf
If PORTC.2 = 1 Then flag6 = 1 : EndIf
If PORTC.2 = 0 And flag6 = 1 Then GoSub Bee : flag6 = 0 : EndIf
PORTC.3 = 1
PORTC.4 = 0
If PORTA.0 = 1 Then flag7 = 1 : EndIf
If PORTA.0 = 0 And flag7 = 1 Then GoSub Bee : flag7 = 0 : EndIf
If PORTA.1 = 1 Then flag8 = 1 : EndIf
If PORTA.1 = 0 And flag8 = 1 Then GoSub Bee : flag8 = 0 : EndIf
If PORTA.5 = 1 Then flag9 = 1 : EndIf
If PORTA.5 = 0 And flag9 = 1 Then GoSub Bee : flag9 = 0 : EndIf
If PORTA.3 = 1 Then flag10 = 1 : EndIf
If PORTA.3 = 0 And flag10 = 1 Then GoSub Bee : flag10 = 0 : EndIf
If PORTC.1 = 1 Then flag11 = 1 : EndIf
If PORTC.1 = 0 And flag11 = 1 Then GoSub Bee : flag11 = 0 : EndIf
If PORTC.2 = 1 Then flag12 = 1 : EndIf
If PORTC.2 = 0 And flag12 = 1 Then GoSub Bee : flag12 = 0 : EndIf
DelayMS 150
' Sec = 0
minut = 0
min1 = 0
chas = 0
PORTC.5 = 0
PORTC.3 = 0
PORTC.4 = 0
If PORTC.0 = 0 Then DelayMS 150 : flag = 1 : GoTo triger : EndIf ; пуск
GoTo main
triger:
If PORTC.0 = 1 And flag = 1 Then DelayMS 150 :GoTo Label1 : EndIf
GoTo triger
Label1:
PORTC.4 = 1
PORTC.3 = 0
If PORTA.0 = 0 Then DelayMS 50: minut = 1 : EndIf 'опрос выключателей
If PORTA.1 = 0 Then DelayMS 50: minut = minut+2 : EndIf
If PORTA.5 = 0 Then DelayMS 50: minut = minut+2 : EndIf
If PORTA.3 = 0 Then DelayMS 50: minut = minut+5 : EndIf
If PORTC.1 = 0 Then DelayMS 50: minut = minut+10 : EndIf
If PORTC.2 = 0 Then DelayMS 50: minut = minut+20 : EndIf
PORTC.3 = 1
PORTC.4 = 0
If PORTA.0 = 0 Then DelayMS 50: minut = minut+20 : EndIf
If PORTA.1 = 0 Then DelayMS 50: chas = 1 : EndIf
If PORTA.5 = 0 Then DelayMS 50: chas = chas+2 : EndIf
If PORTA.3 = 0 Then DelayMS 50: chas = chas+2 : EndIf
If PORTC.1 = 0 Then DelayMS 50:chas = chas+5 : EndIf
If PORTC.2 = 0 Then DelayMS 50: chas = chas+10 : EndIf
PORTC.4 = 1
PORTC.5 = 1
Sec = 0
Label2:
GoSub Stop1
If flag = 0 Then GoTo Label3 : EndIf
If Sec = 60 Then Sec = 0: Inc min1 : EndIf
If min1 = 60 Then min1 = 0: Dec chas : EndIf
If chas > 0 Then GoTo Label2 : EndIf
If min1 < minut Then GoTo Label2 : EndIf
Label3:
PORTC.5 = 0
GoTo main
'Pusk:
Stop1:
If PORTC.0 = 0 And flag = 1 Then GoTo triger1 : EndIf
GoTo tr
triger1:
DelayMS 150
If PORTC.0 = 1 And flag = 1 Then DelayMS 150: flag = 0 :GoTo tr : EndIf
GoTo triger1
tr:
Return
Bee:
Sound PIN, [98,20] ' звуковой сигнал
Return
'------------------------прерывание----------------------------------------
EvriSec:
Inc Sec ' увеличение Sec
Toggle PORTC.3 ' Переключить светодиод в противоположное состояние
TOIF = 0 ' сбросить флаг прерываний TOIF регистра TMRO
Context Restore ' Восстановить регистры и выйти из обработки прерываний
|