Всем привет!
Ребята, имеется код собственной разработки. Нужна помощь, чтобы довести до ума. В частности - температура почему-то показывает по нулям

, потом надо расставить по индикатору точки (не соображу как). Когда-то делал, а теперь что-то подзабыл... (только не надо шуток по поводу того, что "не знал, да еще забыл") - знал, просто старые проекты все потерялись и все наработки тоже. Данное и так по памяти написано!
И еще правильно организовать цикл в прерывании TIMER1 (обработчик называется Vr), чтобы 10 секунд показывало время, 3 секунды-первый датчик, 3 секунды-второй датчик.
Вот собственно код:
Код: Выделить всё
$regfile = "m48def.dat"
$crystal = 8000000
$lib "ds1307clock.lib"
'-------------------------------------
Config 1wire = Portd.4
Config Sda = Portc.4
Config Scl = Portc.5
Config Clock = User
Config Portc.0 = Output , Portc.1 = Output , Portc.2 = Output , Portc.3 = Output
Config Portd.0 = Output , Portd.1 = Output
Config Portb = Output
Config Timer0 = Timer , Prescale = 8 'таймер индикации
Config Timer1 = Timer , Prescale = 1024
Config Watchdog = 2048
'-------------------------------------
Declare Sub Ds18b20()
Const Ds1307w = &HD0
Const Ds1307r = &HD1
'**************************************
Time$ = "12:00:00"
Date$ = "01/01/11" 'метка подпрограммы индикации
Razr1 Alias Portc.0 : Razr2 Alias Portc.1 : Razr3 Alias Portc.2
Razr4 Alias Portc.3 : Razr5 Alias Portd.0 : Razr6 Alias Portd.1
'**************************************
Dim Chas As Byte , Minut As Byte , Sekund As Byte
Dim I1 As Integer
Dim I2 As Integer
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim B As Byte
Dim Weekday As Byte
Dim Flag As Bit
Dim X As Byte , Count As Byte , I As Byte
Dim Number(6) As Byte
Dim Ttt As Byte
'**************************************
For X = 1 To 2
Portb = &HFF
Reset Razr1 : Reset Razr2
Reset Razr3 : Reset Razr4
Reset Razr5 : Reset Razr6
Waitms 500
Set Razr1 : Set Razr2
Set Razr3 : Set Razr4
Set Razr5 : Set Razr6
Waitms 500
Next X
Portb = &B01000000
Reset Razr1 : Reset Razr3 : Reset Razr5
Reset Razr2 : Reset Razr4 : Reset Razr6
Wait 1
Set Razr2 : Set Razr4 : Set Razr6
Set Razr1 : Set Razr3 : Set Razr5
Dsid1(1) = 1wsearchfirst()
Dsid2(1) = 1wsearchnext()
'**************************************
On Ovf0 Refresh
On Ovf1 Vr
On Int0 But1 Nosave
On Int1 But2 Nosave
Enable Interrupts
Enable Int0
Enable Int1
Enable Ovf0
Enable Ovf1
'**************************************
Main:
Do
Gosub Getdatetime
Number(1) = _hour / 10
Number(2) = _hour Mod 10
Number(3) = _min / 10
Number(4) = _min Mod 10
Number(5) = _sec / 10
Number(6) = _sec Mod 10
Wait 1
Loop Until Ttt >= 10
Do
For I = 1 To 6
Number(i) = 10
Next I
Call Ds18b20()
Reset Watchdog
Number(2) = I1 / 10 : Number(3) = I1 Mod 10 : Number(4) = I1 Mod 100
Number(1) = 11 : Number(5) = 12 : Number(6) = 13
Reset Watchdog
Wait 3
For I = 1 To 6
Number(i) = 10
Next I
Number(2) = I2 / 10 : Number(3) = I2 Mod 10 : Number(4) = I2 Mod 100
Number(1) = 11 : Number(5) = 12 : Number(6) = 13
Reset Watchdog
Wait 3
For I = 1 To 6
Number(i) = 10
Next I
Loop Until Ttt >= 6
Goto Main
End
'************************[Процедуры обработки подпрограмм и прерываний]************************
Refresh: ' прерывание таймера Т0 (индикация)
Set Razr1 : Set Razr2 : Set Razr3 ' гасим индикатор
Set Razr4 : Set Razr5 : Set Razr6
Incr Count : If Count > 6 Then Count = 1 ' выбираем разряд для загрузки
Portb = Lookup(number(count) , Digits) ' закидываем в порт код цифры
Select Case Count ' и включаем соответствующий разряд индикатора
Case 1 : Reset Razr1
Case 2 : Reset Razr2
Case 3 : Reset Razr3
Case 4 : Reset Razr4
Case 5 : Reset Razr5
Case 6 : Reset Razr6
End Select
Return ' выход из обработчика прерывания
Vr:
Incr Ttt
Return
But1:
Waitms 100
Gosub Getdatetime
Sekund = _sec
Minut = _min
Chas = _hour
Incr Chas
If Chas > 23 Then Chas = 0
_hour = Chas
_min = Minut
_sec = Sekund
Gosub Settime
Return
But2:
Waitms 100
Gosub Getdatetime
Sekund = _sec
Minut = _min
Chas = _hour
Incr Minut
If Minut > 59 Then Minut = 0
_hour = Chas
_min = Minut
_sec = Sekund
Gosub Settime
Return
Sub Ds18b20()
1wreset
1wwrite &H55
1wverify Dsid1(1)
1wwrite &HBE
I1 = 1wread(2)
'---------------------------------
1wreset
1wwrite &H55
1wverify Dsid2(1)
1wwrite &HBE
I2 = 1wread(2)
'---------------------------------
1wreset
1wwrite &HCC ' Выдаем команду чтения ПЗУ
1wwrite &H44 ' Запуск измерения
Waitms 750 ' Ждем окончания преобразования
I1 = I1 * 10
I1 = I1 / 16
I2 = I2 * 10
I2 = I2 / 16
End Sub
Getdatetime:
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307
I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte _sec , Ack
I2crbyte _min , Ack ' MINUTES
I2crbyte _hour , Ack ' Hours
I2crbyte Weekday , Ack ' Day of Week
I2crbyte _day , Ack ' Day of Month
I2crbyte _month , Ack ' Month of Year
I2crbyte _year , Nack ' Year
I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return
Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 4 ' starting address in 1307
I2cwbyte _day ' Send Data to SECONDS
I2cwbyte _month ' MINUTES
I2cwbyte _year ' Hours
I2cstop
Return
Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' starting address in 1307
I2cwbyte _sec ' Send Data to SECONDS
I2cwbyte _min ' MINUTES
I2cwbyte _hour ' Hours
I2cstop
Return
'********************************************************[DATA]*************************
Digits: ' цифры
Data &B00111111 , &B00000110 , &B01011011 , &B01001111 , &B01100110 ' 0 1 2 3 4
Data &B01101101 , &B01111101 , &B00000111 , &B01111111 , &B01101111 ' 5 6 7 8 9
Data &B00000000 , &B01111000 , &B01100011 , &B00111001 ' space , t, grad ,C
'***************************************************************************************
Гляньте, пожалуйста, кому не лень. Может еще чего по оптимизации подскажете!?
Проект в Протеусе прилепил.