'*****************************************************************
'* Name : часы_вольтметр-676-1307-1.bas *
'* Автор : Лобзанюк К.П. *
'* : *
'* : *
'* Дата : 29.12.2021 *
'* Версия : 2.02 *
'* : *
'* : *
'*****************************************************************
Device 16F676
Xtal 4
Config CP_OFF, CPD_OFF, MCLRE_ON ,BODEN_OFF, PWRTE_ON, WDT_OFF , INTRC_OSC_NOCLKOUT
'Declare Optimiser_Level 1 ' Включить оптимизацию программы
Declare All_Digital = On ' Установить все порты цифровыми
Declare SDA_Pin PORTA.1 ' Канал данных для DS1307 (базовый адрес $D1)
Declare SCL_Pin PORTA.5 ' Канал строба для DS1307
'Declare 24AA01 ' AT24c32 базовый адрес $A1
'-------------------------- Настройки АЦП ------------------------------------
Declare Adin_Res 10 ' Разрядность результата преобразования АЦП
Declare Adin_Tad FRC ' Источник тактирования АЦП
Declare Adin_Stime 300 ' Время на подготовку АЦП к новому измерению 50
ADCON0 = %10000011 ' бит0 1 АЦП включен бит1 1 АЦП выполняет преобразование бит2-4 000 выбран канал AN0
' бит6 0 опорное напряжение Vdd бит7 1 правое выравнивание
ADCON1 = %01110000 ' выбираем тактовый сигнал, для внутреннего генератора поставил 111
ANSEL = %00000001 ' используем аналоговый вход AN0 ставим 1 на не используемых ставим 0
'=======================================================================
Symbol DIN PORTC.0 'Выход данных
Symbol CLK PORTC.2 'Выход синхро импульсов
Symbol LOAD PORTC.1 'Защелка
Symbol KH1 = PORTA.2 ' Кнопка 1 (установка время)
Symbol KH2 = PORTA.4 ' Кнопка 2 (часы)
Symbol KH3 = PORTC.4 ' Кнопка 3 (минуты) если нажата до включения питания то происходит инициализация DS1307
' Symbol TK = PORTC.3 ' вход 1Hz
'Symbol DQ = PORTB.1 ' Подключить DS18B20 к выводу PORT
'Symbol ZBUK PORTC.3 '
TRISA =%11111111 ' Порт на вход для кнопок
TRISC = %00011000 ' Порт А на выход для исполнительных устройств
Dim Sec As Byte
' Dim Sec1 As Byte
Dim Min As Byte
Dim Min1 As Byte
Dim Hr As Byte
Dim Hr1 As Byte
' Dim Day As Byte
' Dim Date As Byte
' Dim Date1 As Byte
' Dim Mon As Byte
' Dim Mon1 As Byte
' Dim Yr As Byte
' Dim Yr1 As Byte
Dim Tmp As Byte
Dim Tmp1 As Byte
Dim n As Byte
Dim Value As Byte 'Переменная адрес знакоместа
Dim Value1 As Byte 'Переменная для преобразования табличной конвертации
Dim flagK1 As Bit ' флаг кнопка нажата и уже отпущена
Dim flagK2 As Bit
Dim flagK3 As Bit
Dim Var1 As Word '
Dim TK As Bit
' Dim ZBUK1 As Bit
' Dim flagB As Bit ' флаг будильника.
' Dim Mins_B As Byte
' Dim Hr_B As Byte
' Dim Sec2 As Byte
' Dim VAR1 As Dword
' Dim Ctrl As Byte
If KH3 = 1 Then DelayMS 50 : GoTo ini_dis:
BStart
BusOut $D1 , 07h, [%00010000] ' управляюший регистр (на выходе SOUT 1Hz)
BusOut $D1 , 00h, [%00000000] ' Бит 7 регистра 0 – это бит останова часов если 1 счета нет
BusOut $D1 , 02h, [%00000000] ' Бит 6 регистра 2 – это бит 12\24 если1 то 12ч режим
BStop
'-------------------Настройка дисплея-------------------
ini_dis:
Value = %00001111
Value1 = %00000000
GoSub DI
Value = %00001100
Value1 = %00000001
GoSub DI
Value = %00001011
Value1 = %00000111
GoSub DI
Value = %00001001 '
Value1 = %00000000
GoSub DI
Value = %00001010
Value1 = %00001111
GoSub DI
Value = %00000100 ' погасить не задейственное четвертое знакоместо чтобы не высветилась кракозябра
Value1 = %00000000
GoSub DI
flagK1 = 0
flagK2 = 0
flagK3 = 0
Main:'====================== Основной цикл ===================================================
Var1 = ADIn 0 ' АЦП
DelayUS 1
Var1 = Var1 * 3
TK = PORTC.3 ' мигание точкой
Read_time: '---------------ситчывание времени--------------------------------------
BStart
BusIn $D0, 0, [Sec,Min,Hr]' BusIn $D0, 0, [Sec,Min,Hr,Day,Date,Mon,Yr]
BStop
'Tmp = Sec
'GoSub Fix_bcd_in
'Sec1 = Tmp
Tmp = Min
GoSub Fix_bcd_in ' На преобразование полубайтов
Min1 = Tmp
Tmp = Hr
GoSub Fix_bcd_in
Hr1 = Tmp
'Tmp = Date
'GoSub Fix_bcd_in
'Date1 = Tmp
'Tmp = Mon
'GoSub Fix_bcd_in
'Mon1 = Tmp
'Tmp = Yr
'GoSub Fix_bcd_in
'Yr1 = Tmp
DelayMS 500
GoSub Ind
GoSub KH_1
'
If flagK1 = 1 Then flagK1 = 0 : GoTo SETTIM
GoTo Main
Write_time: '================ запись времени =========================================================================
Tmp = Min1
GoSub Fix_bcd_out
Min = Tmp
Tmp = Hr1
GoSub Fix_bcd_out
Hr = Tmp
'Tmp = Date1
'GoSub Fix_bcd_out
'Date = Tmp
'Tmp = Mon1
'GoSub Fix_bcd_out
'Mon = Tmp
'Tmp = Yr1
'GoSub Fix_bcd_out
'Yr = Tmp
Sec = 0
BStart
BusOut $D1, 0, [Sec,Min,Hr] ' BusOut $D1, 0, [Sec,Min,Hr,Day,Date,Mon,Yr]
BStop
GoTo Read_time
'=================================== Установка времени ==========================
SETTIM:
GoSub KH_1
GoSub KH_2
GoSub KH_3
TK = 0
If flagK3 = 1 Then Min1 = Min1 + 1 : flagK3 = 0
If Min1 > 59 Then Min1 = 0
If flagK2 = 1 Then Hr1 = Hr1 + 1 : flagK2 = 0
If Hr1 > 23 Then Hr1 = 0
GoSub Ind
If flagK1 = 1 Then flagK1 = 0 : GoTo Write_time: EndIf '
GoTo SETTIM
Ind: ' индикация
n = Dig Min1, 0 'Выделяем из числа единицы
GoSub Convert 'и отправляем на табличную конвертацию
Value = %00000101
GoSub DI
n = Dig Min1, 1 'Выделяем из числа десятки
GoSub Convert 'и отправляем на табличную конвертацию
Value = %00000110
GoSub DI
n = Dig Hr1, 0
If TK = 1 Then GoSub Convert1 : GoTo Label4
GoSub Convert
Label4:
Value = %00000111
GoSub DI
n = Dig Hr1, 1
GoSub Convert '
Value = %00001000
GoSub DI
n = Dig Var1, 1 '
GoSub Convert
Value = %00000001
GoSub DI
n = Dig Var1, 2
GoSub Convert1
Value = %00000010
GoSub DI
n = Dig Var1, 3
GoSub Convert '
Value = %00000011
GoSub DI
Return
DI:
LOAD = 0
SHOut DIN, CLK, MsbFirst, [Value \8,Value1 \8 ]
LOAD = 1
Return
Convert:
Value1 = LookUpL n, [126,48,109,121,51,91,95,112,127,123]
' 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Return
Convert1:
Value1 = LookUpL n, [254,176,237,249,179,219,223,240,255,251] ' цифры с точкой
' 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Return
'----------------------------Подпрограмма нажатия кн1-------------------------------------
KH_1:
If KH1 = 0 Then DelayMS 50 : flagK1 = 1 : GoTo triger : EndIf ;
GoTo Label1
triger:
If KH1 = 1 And flagK1 = 1 Then DelayMS 50 : GoTo Label1 : EndIf
GoTo triger
Label1:
Return
'----------------------------Подпрограмма нажатия кн2-------------------------------------
KH_2:
If KH2 = 0 Then DelayMS 50 : flagK2 = 1 : GoTo triger2 : EndIf ;
GoTo Label12
triger2:
If KH2 = 1 And flagK2 = 1 Then DelayMS 50 : GoTo Label12 : EndIf
GoTo triger2
Label12:
Return
'----------------------------Подпрограмма нажатия кн3-------------------------------------
KH_3:
If KH3 = 0 Then DelayMS 50 : flagK3 = 1 : GoTo triger3 : EndIf ;
GoTo Label13
triger3:
If KH3 = 1 And flagK3 = 1 Then DelayMS 50 : GoTo Label13 : EndIf
GoTo triger3
Label13:
Return
Fix_bcd_in: '--------------------------------------------------------------------
Tmp1 = Tmp & 15 ' 15это 1111 '&' выполняет операцию побитового логического умножения
Tmp = Tmp >> 4 '
Tmp = Tmp1 + 10 * Tmp '
Return
Fix_bcd_out: '-------------------------------------------------------------------
Tmp1 = Tmp / $A ' $A это 1010
Tmp = Tmp - (Tmp1 * $A)
Tmp = Tmp + (Tmp1 << 4) '<<' выполняет побитовый сдвиг влево на 4 бит
Return
|