raf65 писал(а):вот так она и вызывается
Угу.
raf65 писал(а):вот так она и вызывается
raf65 писал(а):периодическое нажатие на копку, в конце концов приведет к срабатыванию
edm2007 писал(а):Лично я вижу не кусок кода а законченую подпрограмму Knoblong, о чем явно говорит Sub. Покажите мне вызов этой подпрограммы. Проверка If .. Then позволяет проверить условие только в один проход. Это же не While .. Wend, которое проверяет "до тех пор пока..."
Код: Выделить всё
If Pind.2 = 0 Then
Goto Startknoblong
End If
Goto Endknoblong
Startknoblong:
Nlock1 = 1
Startknoblong2:
Nlock1 = Nlock1 + 1
Waitms 100
If Nlock1 = 20 Then
If Pind.0 = 1 Then
Reset Portd.0
Else
Set Portd.0
End If
End If
Goto Startknoblong2
End If
Endknoblong:
Да ради бога, кто запрещает-то. Я и более смешные способы знаю.
vanyap1 писал(а):Может есть примеры работы с tda7313?
vitalkalm писал(а):Тут где-то рядом коты обсуждали.
amv2000 писал(а):vitalkalm писал(а):Тут где-то рядом коты обсуждали.
http://radiokot.ru/circuit/audio/amplifier/31/ здесь
http://radiokot.ru/circuit/audio/filter/05/ здесь
http://radiokot.ru/circuit/audio/amplifier/27/ и здесь
Бит 6 регистра часов отвечает за
выбор 12- или 24-часового режима. Когда он установлен в 1, выбран 12-часовой режим.
Код: Выделить всё
I2cstart
I2cwbyte Ds1307w
I2cwbyte 2
I2cwbyte Hour
I2cstop
Код: Выделить всё
bcd
makebcd
makedec Код: Выделить всё
$regfile = "m16def.dat"
$crystal = 8000000
$baud = 9600
$lib "mcsbyte.lbx" ' for smaller code
$lib "ds1307clock.lib" ' modified lib
$framesize = 16
$hwstack = 24
$swstack = 16
Config Lcd = 16 * 2
Config Lcdpin = Pin , Rs = Porta.0 , E = Porta.1 , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5
Cls
Cursor Off
'* * * настройка пинов для подключния lcd
'* * * подключаем библиотеку ds1307
$lib "ds1307clock.lib"
Config Clock = User
'* * * конфигурируем scl и sda пины
Config Sda = Portd.6 ' I2C Data
Config Scl = Portd.5 ' I2C Clock
Config 1wire = Portd.4
'* * * заводим константы на биты чтения и записи ds1307
Const Ds1307w = &HD0 ' бит записи
Const Ds1307r = &HD1 ' бит чтения
'* * * заводим и разрешаем прерывания от UART
On Urxc Getchar
Enable Interrupts
Enable Urxc
'* * * заводим переменные для своих нужд
Dim C As Word
Dim Seco As Byte
Dim Mine As Byte
Dim Hour As Byte
Dim Day As Byte
Dim Dat As Byte
Dim Month As Byte
Dim Year As Byte
Dim S As String * 5 ' переменная для работы UART
Dim Byte0 As Byte
Dim Byte1 As Byte
Dim Signtemperatura As String * 1
Dim T1 As Single
Dim T2 As Integer
Dim Ttemp As Byte
Dim Hh As Byte
Dim Mm As Byte
Deflcdchar 0 , 28 , 20 , 28 , 32 , 32 , 32 , 32 , 32
Locate 1 , 4
Lcd "२§OMH®¦"
Locate 2 , 6
Lcd "ЁPOEKT"
Wait 2
Cls
Locate 1 , 1
Lcd "----ᥪPOBO¦---- "
Locate 2 , 1
Lcd "----TEPMOMETP---"
Wait 2
Cls
'* * * * * * основной цикл программы
Do
Gosub Ds1307 'уходим на выполнение подпрограммы чтобы узнать время и дату
Gosub Ds18b20
Gosub Displey 'выполняем подпрограмму вывода на дисплей
Loop
'----------
'* * * узнаем время и дату
Ds1307:
I2cstart ' даем часам понять что сейчас будем с ними работать
I2cwbyte Ds1307w ' отправляем
I2cwbyte &H00 ' адрес откуда начачинаем читать данные
I2cstart ' даем сигнал старт
I2cwbyte Ds1307r ' на прочтение данных
I2crbyte Seco , Ack ' ловим секунды
I2crbyte Mine , Ack ' минуты
I2crbyte Hour , Ack ' часы
I2crbyte Day , Ack ' день недели
I2crbyte Dat , Ack ' число месяца
I2crbyte Month , Ack ' месяц
I2crbyte Year , Nack ' год
I2cstop
Seco = Makedec(seco)
Mine = Makedec(mine)
Hour = Makedec(hour)
Day = Makedec(day)
Dat = Makedec(dat)
Month = Makedec(month)
Year = Makedec(year)
Return
'_____
'*** измеряем температуру
Ds18b20:
1wreset
If Err = 1 Then 'если при опросе появился флаг ошибки
Cls
Locate 1 , 12
Lcd "Ѕeї" 'нет
Locate 2 , 10
Lcd "гaїАёєa" ' датчика
Wait 1
Else
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 700 ' задержка
1wreset
1wwrite &HCC
1wwrite &HBE ' Команда чтения ОЗУ датчика
Byte0 = 1wread() ' Читаем нулевой байт
Byte1 = 1wread() ' Читаем первый байт
End If
If Byte1 >= 248 Then ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Signtemperatura = "-"
Else
Signtemperatura = "+"
End If
T1 = Byte0 / 16 ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 16 ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
T1 = T1 + T2
Hh = Fix(t1) 'отсекаем от температуры все после запятой
Ttemp = T1 * 10 '
Mm = Ttemp Mod 10 'берем десятичную часть температуры
Return
'----------
'* * * подпрограмма вывода на дисплей
Displey:
Locate 1 , 1
If Hour < 10 Then
Lcd "0" ; Hour ; ":"
Else ' выводим время
Lcd Hour ; ":" ;
End If
If Mine < 10 Then
Lcd "0" ; Mine ; ":" ;
Else
Lcd Mine ; ":" ;
End If
If Seco < 10 Then
Lcd "0" ; Seco
Else
Lcd Seco
End If
Locate 2 , 1 ' выводим дату
Lcd Dat
Locate 2 , 3
Lcd "/"
Locate 2 , 4
If Month < 10 Then
Lcd "0" ; Month
Else
Lcd Month
End If
Locate 2 , 12
'обзываем каждый месяц
If Day = 1 Then
Lcd "ѕoЅeг" 'январь
End If
If Day = 2 Then
Lcd "іїopЅ" 'февраль
End If
If Day = 3 Then
Lcd "cpeгa" 'март и так далее
End If
If Day = 4 Then
Lcd "Аeїі"
End If
If Day = 5 Then
Lcd "ѕЗїЅ"
End If
If Day = 6 Then
Lcd "cyІoї"
End If
If Day = 7 Then
Lcd "іocєp"
End If
Locate 2 , 6
Lcd "/" ; "20" ; Year
Locate 1 , 10
Lcd Signtemperatura ; Hh ; "." ; Mm 'выводим целую часть потом рисуем точку потом десятую часть температуры
Locate 1 , 15
Lcd Chr(0) ; "C"
Return
'----------
'* * * обработчик прерывания UART
Getchar:
Input S 'то что пришло по UART
If S = "сек" Then 'настроим секунды
Print "введите секунды"
Input C
Seco = C
Seco = Makebcd(seco)
I2cstart ' подаем сигнал старт
I2cwbyte Ds1307w ' отправляем команду записи
I2cwbyte 0 ' отправляем адрес куда пишем - &H00
I2cwbyte Seco ' записываем значение переменной по этому адресу
I2cstop ' закончили работать с I2C
Cls
End If
If S = "min" Then 'настроим минуты
Print "input min..."
Input C
Mine = C
Mine = Makebcd(mine)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 1 'адрес хранения минут &H01
I2cwbyte Mine
I2cstop
Cls
End If
If S = "hour" Then 'настроим часы
Print "input hour..."
Input C
Hour = C
Hour = Makebcd(hour)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 2 'адрес хранения часов
I2cwbyte Hour
I2cstop
Cls
End If
If S = "day" Then 'настроим дату
Print "input day..."
Input C
Day = C
Day = Makebcd(day)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 3 'адрес хранения дня недели
I2cwbyte Day
I2cstop
Cls
End If
If S = "dat" Then 'настроим дату
Print "input dat..."
Input C
Dat = C
Dat = Makebcd(dat)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 4 'адрес хранения даты
I2cwbyte Dat
I2cstop
Cls
End If
If S = "month" Then 'настроим месяц
Print "input month..."
Input C
Month = C
Month = Makebcd(month)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 5 'адрес хранения месяца
I2cwbyte Month
I2cstop
Cls
End If
If S = "year" Then 'настроим год
Print "input year..."
Input C
Year = C
Year = Makebcd(year)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 6 'адрес хранения года
I2cwbyte Year
I2cstop
Cls
End If
Return
End