'******************************************************************
'* Name : TIMER_164_i_R.BAS *
'* Автор : Лобзанюк К.П. *
'* : *
'* : *
'* Дата : 06.02.2021 *
'* Версия : 2.00 *
'* : *
'* : *
'*****************************************************************
Device 16F676
Xtal 4
'----------------------------Предустановки----------------------------------------------------------
Config CP_OFF, CPD_OFF, MCLRE_OFF ,BODEN_OFF, PWRTE_ON, WDT_OFF , INTRC_OSC_NOCLKOUT
OPTION_REG = %00100110 'бит 5: T0CS: Выбор тактового сигнала для TMR0
'1 = внешний тактовый сигнал с вывода T0CKI (32.768k )
'0 = внутренний тактовый сигнал CLKOUT
INTCON = %10100000 'TMR0 активизирован
'----------------------------------Настройки портов-------------------------------------------------
Declare All_Digital = On ;Установить все порты цифровыми входами/выходами
TRISA = %00001100
TRISC = %00000110
'-----------------------------------Конфигурация переменных-----------------------------------------
Symbol ZBUK PORTA.0
Symbol Clock PORTA.4 'Вывод для тактовых импульсов для сдвигового регистра
Symbol DTA PORTA.5 'Вывод для передачи данных для сдвигового регистра
Symbol KH PORTA.3
Symbol RELE PORTA.1
Symbol TOIF INTCON.2 ' TOIF - cимвол флага прерывания по переполнению таймера TMRO
Dim Value As Byte 'Переменная для осуществления табличного конвертирования числа
Dim n As Byte 'Переменная для выделения из числа нужного разряда
Dim Sec As Byte 'Переменная для секунд
Dim minut As Byte 'Переменная для минут
Dim chas As Byte 'Переменная для часов
Dim flag As Bit
Dim x As Bit
'-------------------Инициирование прерываний-------------------
On_Interrupt GoTo EvriSec ' Включить обработку програмных прерываний
'-------------------------------------Главная программа---------------------------------------------
flag = 0
main:
RELE = 0
Sec = 0
minut = Pot PORTC.1, 23 ' Считываем значение на выводе PORTC.1 10 это24ч 23это 60мин
chas = Pot PORTC.2, 10
If minut > 59 Then minut = 59
If chas > 99 Then chas = 99 '
GoSub DI
If KH = 0 And flag = 0 Then DelayMS 150 : flag = 1 : GoTo triger : EndIf ; пуск
GoTo main
triger:
If KH = 1 And flag = 1 Then DelayMS 150 :GoTo Label1 : EndIf
GoTo triger
Label1:
RELE = 1
' minut = Pot PORTC.1, 23 ' Считываем значение на выводе PORTC.1 10 это24ч 23это 60мин
' chas = Pot PORTC.2, 10 '
' GoSub DI
Label2:
GoSub Stop1
GoSub DI
If flag = 0 Then GoTo Label3
If Sec > 59 Then Sec = 0: Dec minut : EndIf
If minut = 0 And chas > 0 Then minut = 60: Dec chas : EndIf
If chas > 0 Then GoTo Label2
If minut > 0 Then GoTo Label2
Label3:
RELE = 0
GoSub DI
Sound ZBUK,[125,20,0,10]
If KH = 0 Then GoTo triger2
GoTo Label3
triger2:
DelayMS 150
If KH = 1 Then DelayMS 150: flag = 0 :GoTo main : EndIf
GoTo triger2:
Stop1:
If KH = 0 And flag = 1 Then GoTo triger1 : EndIf
GoTo tr
triger1:
DelayMS 150
If KH = 1 And flag = 1 Then DelayMS 150: flag = 0 :GoTo tr : EndIf
GoTo triger1
tr:
Return
'------------------------прерывание----------------------------------------
EvriSec:
Context Save
Inc Sec ' увеличение Sec
x = ~ x ' Переключить в противоположное состояние
' If Sec = 60 Then Sec = 0 :Inc minut
TOIF = 0 ' сбросить флаг прерываний TOIF регистра TMRO
Context Restore ' Восстановить регистры и выйти из обработки прерываний
;------------------------------Подпрограмма динамической индикации----------------------------------
DI:
n = Dig minut, 0 'Выделяем из числа единицы
GoSub Convert 'и отправляем на табличную конвертацию
SHOut DTA, Clock, MsbFirst, [Value] 'Проталкиваем в регистр сконвертированный код для единиц
PORTC.0 = 0
DelayMS 1 'Задержка для отображения разряда 4
PORTC.0 = 1
n = Dig minut, 1 'Выделяем из числа десятки
GoSub Convert 'и отправляем на табличную конвертацию
SHOut DTA, Clock, MsbFirst, [Value] 'Проталкиваем в верхний регистр сконвертированный код для десятков
PORTC.3 = 0
DelayMS 1 'Задержка для отображения разряда 3
PORTC.3 = 1
n = Dig chas, 0
If x = 0 And RELE = 1 Then GoSub Convert1 :GoTo Label4
GoSub Convert
Label4:
SHOut DTA, Clock, MsbFirst, [Value] '
PORTC.4 = 0
DelayMS 1 'Задержка для отображения разряда 2
PORTC.4 = 1
n = Dig chas, 1
GoSub Convert '
SHOut DTA, Clock, MsbFirst, [Value]
PORTC.5 = 0
DelayMS 1 'Задержка для отображения разряда 1
PORTC.5 = 1
'-------------------------------Подпрограмма табличной конвертации числа----------------------------
Convert:
Value = LookUpL n, [192,249,164,176,153,146,130,248,128,144]
Return
Convert1:
Value = LookUpL n, [64,121,36,48,25,18,2,120,128,16]
Return
|