REKLAMA

5022_bas.txt

Poszukiwany kod źródłowy w Bascomie do AVT 5022 (zegar z DCF)

Nie wiem czy jeszcze potrzeba, ale dołączam. To jest chyba oryginalny wsad z tego co znalazłem u siebie. Wymaga dość dużo poprawek w kwestii dekodowania DCF. Pozdrawiam Piotr


Pobierz plik - link do postu

$crystal = 8000000
Config Clock = Soft , Gosub = Sectic
Config Sda = Portd.1
Config Scl = Portd.0
Config Timer1 = Timer , Prescale = 64
Config Timer0 = Timer , Prescale = 64
On Timer1 Dcf_start
On Timer0 Multiplexing

Dim Reset_seconds_flag As Bit
Dim Temp3 As Byte
Dim Disp1 As Byte
Dim Disp2 As Byte
Dim Disp3 As Byte
Dim Temp As Byte
Dim Digit_number As Byte
Dim Dcf_receiving_flag As Bit
Dim Dcf_bit As Bit
Dim Dcf_counter As Byte
Dim Dcf_min As Byte
Dim Dcf_hour As Byte
Dim Dcf_month As Byte
Dim Dcf_day As Byte
Dim Dcf_temp As Byte
Dim Week_day As Byte
Dim Dcf_flag As Byte
Dim Start_dcf_flag As Bit
Dim Pause_counter As Byte
Dim Alarm_hours As Byte
Dim Alarm_minutes As Byte
Dim Week_alarm_hours As Byte
Dim Week_alarm_minutes As Byte
Dim Timer_minutes As Byte
Dim Timer_seconds As Byte
Dim Timer_hours As Byte
Dim Meas_hours As Byte
Dim Meas_minutes As Byte
Dim Meas_seconds As Byte
Dim Meas_flag As Bit
Dim Display_type As Byte
Dim Eeprom_address As Word
Dim Time_set_flag As Bit
Dim Alarm_set_flag As Bit
Dim Week_alarm_set_flag As Bit
Dim Timer_set_flag As Bit
Dim Date_set_flag As Bit
Dim Alarm_on_flag As Bit
Dim Week_alarm_on_flag As Bit
Dim Timer_on_flag As Bit
Dim Flash_flag As Bit
Dim R As Byte
Dim Temp2 As Byte
Dim X As Byte
Dim Alarm_counter As Byte
Dim Week_alarm_counter As Byte
Dim Alarm_counter_flag As Bit
Declare Sub Display_time
Declare Sub Display_date
Declare Sub Display_timer
Declare Sub Display_alarm
Declare Sub Display_week_alarm
Declare Sub Beep
Declare Sub Short_beep
Declare Sub Time_meas

Declare Sub Temperature
Declare Sub Read1820

Config Portc = Output
Config Porta = Output
Config Pind.4 = Output
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.4 = Output
Config Pinb.5 = Output
Config Pind.5 = Output
Config Pind.6 = Output

Config Int0 = Falling
Enable Int0
On Int0 Dcf
Enable Timer0
Enable Timer1
Enable Interrupts
Start Timer0
Start Timer1
Digit_number = 1
Dcf_receiving_flag = 1

'DCF - PORTD.2
' klawisze - PORTB.0 ... PORTB.5
Set Portd.4
Set Portd.5 : Set Portd.6
Wait 1
Reset Portd.5 : Reset Portd.6
Time_set_flag = 0
Date_set_flag = 0
Timer_on_flag = 0

'KLAWIATURA
' CHANGE FUNCTION START/ENTER ON/+
' STOP RESET OFF/-
Display_time

Sub Display_time
Display_type = 1
Short_beep
Do
Disp1 = _sec
Disp2 = _min
Disp3 = _hour
Reset Portb.0
If Pinb.0 = 1 Then Display_date
Reset Portb.2 : Reset Portb.5
If Pinb.2 = 1 And Pinb.5 = 1 And Time_set_flag = 0 Then
For R = 1 To 3
Beep
Next R
Time_set_flag = 1
End If
Reset Portb.2
If Pinb.2 = 1 And Time_set_flag = 1 Then
Incr _min
If _min = 60 Then _min = 0
Short_beep
End If
Reset Portb.5
If Pinb.5 = 1 And Time_set_flag = 1 Then
Incr _hour
If _hour = 24 Then _hour = 0
Short_beep
End If
Reset Portb.1
If Pinb.1 = 1 And Time_set_flag = 1 Then
_sec = 0
Time_set_flag = 0
Beep
End If
X = Makebcd(_hour)
I2csend 112 , X
X = Makebcd(_min)
I2csend 114 , X
X = Makebcd(_sec)
I2csend 116 , X
Loop
End Sub

Sub Display_date
Display_type = 2
Short_beep
Do
Disp1 = _year
Disp2 = _month
Disp3 = _day
Reset Portb.0
If Pinb.0 = 1 Then Display_alarm

Reset Portb.2 : Reset Portb.5
If Pinb.2 = 1 And Pinb.5 = 1 And Date_set_flag = 0 Then
For R = 1 To 3
Beep
Next R
Date_set_flag = 1
End If
Reset Portb.2
If Pinb.2 = 1 And Date_set_flag = 1 Then
Incr _day
If _day = 32 Then _day = 1
Short_beep
End If
Reset Portb.5
If Pinb.5 = 1 And Date_set_flag = 1 Then
Incr _month
If _month = 13 Then _month = 1
Short_beep
End If
Reset Portb.1
If Pinb.1 = 1 And Date_set_flag = 1 Then
Date_set_flag = 0
Beep
End If
X = Makebcd(_day)
I2csend 112 , X
X = Makebcd(_month)
I2csend 114 , X
X = Makebcd(_sec)
I2csend 116 , X
Loop
End Sub

Sub Display_alarm
Readeeprom Alarm_hours , 3
If Alarm_hours & gt; 23 Then Alarm_hours = 0
Readeeprom Alarm_minutes , 4
If Alarm_minutes & gt; 59 Then Alarm_minutes = 0
Display_type = 3
Short_beep
Do
Disp1 = Alarm_minutes
Disp2 = Alarm_hours
Reset Portb.0
If Pinb.0 = 1 Then Display_week_alarm
Reset Portb.2 : Reset Portb.5
If Pinb.2 = 1 And Pinb.5 = 1 And Alarm_set_flag = 0 Then
For R = 1 To 3
Beep
Next R
Alarm_set_flag = 1
End If
Reset Portb.2
If Pinb.2 = 1 And Alarm_set_flag = 1 Then
Incr Alarm_minutes
If Alarm_minutes = 60 Then Alarm_minutes = 0
Short_beep
End If
Reset Portb.5
If Pinb.5 = 1 And Alarm_set_flag = 1 Then
Incr Alarm_hours
If Alarm_hours = 24 Then Alarm_hours = 0
Short_beep
End If
Reset Portb.1
If Pinb.1 = 1 And Alarm_set_flag = 1 Then
Alarm_set_flag = 0
Writeeeprom Alarm_hours , 3
Writeeeprom Alarm_minutes , 4
Beep
End If
Reset Portb.1
If Pinb.1 = 1 Then
Alarm_on_flag = Not Alarm_on_flag
Short_beep
End If
Loop
End Sub

Sub Display_week_alarm
Readeeprom Week_alarm_hours , 1
If Week_alarm_hours & gt; 23 Then Week_alarm_hours = 0
Readeeprom Week_alarm_minutes , 2
If Week_alarm_minutes & gt; 59 Then Week_alarm_minutes = 0
Display_type = 4
Short_beep
Do
Disp1 = Week_alarm_minutes
Disp2 = Week_alarm_hours
Reset Portb.0
If Pinb.0 = 1 Then Display_timer
Reset Portb.2 : Reset Portb.5
If Pinb.2 = 1 And Pinb.5 = 1 And Week_alarm_set_flag = 0 Then
For R = 1 To 3
Beep
Next R
Week_alarm_set_flag = 1
End If
Reset Portb.2
If Pinb.2 = 1 And Week_alarm_set_flag = 1 Then
Short_beep
Incr Week_alarm_minutes
If Week_alarm_minutes = 60 Then Week_alarm_minutes = 0
End If
Reset Portb.5
If Pinb.5 = 1 And Week_alarm_set_flag = 1 Then
Short_beep
Incr Week_alarm_hours
If Week_alarm_hours = 24 Then Week_alarm_hours = 0
End If
Reset Portb.1
If Pinb.1 = 1 And Week_alarm_set_flag = 1 Then
Week_alarm_set_flag = 0
Writeeeprom Week_alarm_hours , 1
Writeeeprom Week_alarm_minutes , 2
Beep
End If
Reset Portb.1
If Pinb.1 = 1 Then
Week_alarm_on_flag = Not Week_alarm_on_flag
Short_beep
End If
Loop
End Sub

Sub Display_timer
If Timer_on_flag = 0 Then
Readeeprom Timer_minutes , 6
If Timer_minutes & gt; 59 Then Timer_minutes = 0
Readeeprom Timer_seconds , 7
If Timer_seconds & gt; 59 Then Timer_seconds = 0
Readeeprom Timer_hours , 5
If Timer_hours & gt; 99 Then Timer_hours = 0
End If
Display_type = 5
Short_beep
Do
Disp3 = Timer_hours
Disp2 = Timer_minutes
Disp1 = Timer_seconds
Reset Portb.0
If Pinb.0 = 1 Then Call Time_meas
Reset Portb.2 : Reset Portb.5
If Pinb.2 = 1 And Pinb.5 = 1 And Timer_set_flag = 0 Then
For R = 1 To 3
Beep
Next R
Timer_set_flag = 1
End If
Reset Portb.2
If Pinb.2 = 1 And Timer_set_flag = 1 Then
Short_beep
Incr Timer_minutes
If Timer_minutes = 60 Then Timer_minutes = 0
End If
Reset Portb.5
If Pinb.5 = 1 And Timer_set_flag = 1 Then
Short_beep
Incr Timer_hours
If Timer_hours = 99 Then Timer_hours = 0
End If
Reset Portb.4
If Pinb.4 = 1 And Timer_set_flag = 1 Then
Short_beep
Incr Timer_seconds
If Timer_seconds = 60 Then Timer_seconds = 0
End If
Reset Portb.1
If Pinb.1 = 1 And Timer_set_flag = 1 Then
Timer_set_flag = 0
Writeeeprom Timer_hours , 5
Writeeeprom Timer_minutes , 6
Writeeeprom Timer_seconds , 7
Beep
End If
Reset Portb.1
If Pinb.1 = 1 And Timer_set_flag = 0 Then
Timer_on_flag = 1
Short_beep
End If
Reset Portb.3
If Pinb.3 = 1 Then
Timer_on_flag = 0
Short_beep
End If
Reset Portb.4
If Pinb.4 = 1 And Timer_set_flag = 0 Then
Timer_on_flag = 0
Display_timer
End If
Portd.5 = Timer_on_flag
Loop
End Sub

Sub Time_meas
Display_type = 6
Short_beep
Do
Disp3 = Meas_hours
Disp2 = Meas_minutes
Disp1 = Meas_seconds
Reset Portb.1
If Pinb.1 = 1 Then
Meas_flag = 1
Short_beep
End If
Reset Portb.3
If Pinb.3 = 1 Then
Meas_flag = 0
Short_beep
End If
Reset Portb.4
If Pinb.4 = 1 Then
Meas_hours = 0
Meas_minutes = 0
Meas_seconds = 0
Short_beep
End If
Reset Portb.0
If Pinb.0 = 1 Then Display_time
Loop
End Sub



Multiplexing:
Porta = 0
Portc = 255
Incr Digit_number
If Digit_number = 7 Then Digit_number = 1
Select Case Digit_number
Case 1:
'dziesi¹tki sekund
Temp = Disp1 / 10
Porta = Lookup(temp , 7segment)
If Display_type = 6 Then Set Porta.0

Reset Portc.1
Case 2:
'sekundy
Temp = Disp1 / 10
Temp = Temp * 10
Temp = Disp1 - Temp
Porta = Lookup(temp , 7segment)
If Display_type = 4 And Week_alarm_on_flag = 1 And Flash_flag = 1 Then Set Porta.0
If Display_type = 3 And Alarm_on_flag = 1 And Flash_flag = 1 Then Set Porta.0
Reset Portc.0
Case 3:
'Dziesi¹tki Minut
Temp = Disp2 / 10
Porta = Lookup(temp , 7segment)
If Display_type = 2 Then Set Porta.0
Reset Portc.3
Case 4:
'minuty
Temp = Disp2 / 10
Temp = Temp * 10
Temp = Disp2 - Temp

Porta = Lookup(temp , 7segment)
If Display_type = 5 Then Set Porta.0
Reset Portc.2
Case 5:
'dziesi¹tki godzin
Temp = Disp3 / 10

Porta = Lookup(temp , 7segment)
If Display_type = 3 Then Porta = 238
If Display_type = 4 Then Porta = 238
If Dcf_receiving_flag = 1 Then Porta = Porta + 1

Reset Portc.5
Case 6:
'godziny
Temp = Disp3 / 10
Temp = Temp * 10
Temp = Disp3 - Temp
If Display_type = 3 Then Temp = 1
If Display_type = 4 Then Temp = 2
Porta = Lookup(temp , 7segment)
If Display_type = 1 Then Set Porta.0
Reset Portc.4
End Select
Portd.5 = Timer_on_flag
Reset Portb.4
If Pinb.4 = 1 Then Reset Portd.6
Return

Sectic:
If Temp2 & lt; & gt; _min Then
Readeeprom Alarm_hours , 3
Readeeprom Alarm_minutes , 4
If Alarm_hours = _hour And Alarm_minutes = _min And Alarm_on_flag = 1 Then
Alarm_counter = 30
Alarm_counter_flag = 1
Set Portd.6
End If
Readeeprom Week_alarm_hours , 1
Readeeprom Week_alarm_minutes , 2
If Week_alarm_hours = _hour And Week_alarm_minutes = _min And Week_alarm_on_flag = 1 And Week_day & lt; 6 Then
Alarm_counter = 15
Alarm_counter_flag = 1
Set Portd.6
End If
End If
If Meas_flag = 1 Then Incr Meas_seconds
If Meas_seconds = 60 Then
Meas_seconds = 0
Incr Meas_minutes
If Meas_minutes = 60 Then
Meas_minutes = 0
Incr Meas_hours
End If : End If
Flash_flag = Not Flash_flag
If Timer_on_flag = 1 Then
Decr Timer_seconds
If Timer_seconds = 255 Then
Decr Timer_minutes
Timer_seconds = 59
If Timer_minutes = 255 Then
Decr Timer_hours
Timer_minutes = 59
If Timer_hours = 255 Then
Timer_on_flag = 0
Readeeprom Timer_minutes , 6
If Timer_minutes & gt; 59 Then Timer_minutes = 0
Readeeprom Timer_seconds , 7
If Timer_seconds & gt; 59 Then Timer_seconds = 0
Readeeprom Timer_hours , 5
If Timer_hours & gt; 99 Then Timer_hours = 0
Beep
End If : End If : End If : End If
Temp2 = _min
If Alarm_counter_flag = 1 Then Decr Alarm_counter
If Alarm_counter = 0 Then Alarm_counter_flag = 0
If Alarm_counter_flag = 1 And Flash_flag = 1 Then
Reset Portd.4
Else
Set Portd.4
End If
Return

7segment:
Data 252 , 96 , 218 , 242 , 102 , 182 , 190 , 224 , 254 , 246

Dcf:
Pause_counter = 0
Dcf_flag = Not Dcf_flag
If Dcf_flag = 0 Then
Config Int0 = Rising
Dcf_receiving_flag = 1
Counter1 = 0
Start Timer1
Else
Stop Timer1
Config Int0 = Falling
Dcf_receiving_flag = 0
If Timer1 & lt; 15000 And Timer1 & gt; 10000 Then
Dcf_bit = 0
End If
If Timer1 & gt; 20000 And Timer1 & lt; 30000 Then
Dcf_bit = 1
End If
If Timer1 & lt; 10000 Then Start_dcf_flag = 0
If Timer1 & lt; 20000 And Timer1 & gt; 15000 Then Start_dcf_flag = 0
Select Case Dcf_counter
Case 0:
If Reset_seconds_flag = 1 Then
Reset_seconds_flag = 0
_sec = 0
End If
Case 21 :
Dcf_temp = 0
If Dcf_bit = 1 Then Dcf_temp = 1
Case 22 : If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 2
Case 23 : If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 4
Case 24 : If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 8
Dcf_min = Dcf_temp
Dcf_temp = 0
Case 25 : If Dcf_bit = 1 Then Dcf_temp = 1
Case 26 : If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 2
Case 27 :
If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 4
Dcf_temp = Dcf_temp * 10
Dcf_temp = Dcf_temp + Dcf_min
Decr Dcf_temp
If Start_dcf_flag = 1 And Dcf_temp & lt; 60 Then _min = Dcf_temp
Dcf_temp = 0
Case 29 : If Dcf_bit = 1 Then Dcf_temp = 1
Case 30 : If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 2
Case 31 : If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 4
Case 32 :
If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 8
Dcf_hour = Dcf_temp
Dcf_temp = 0
Case 33 : If Dcf_bit = 1 Then Dcf_temp = 1
Case 34 :
If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 2
Dcf_temp = Dcf_temp * 10
Dcf_temp = Dcf_temp + Dcf_hour
If Start_dcf_flag = 1 And Dcf_temp & lt; 24 Then _hour = Dcf_temp
Dcf_temp = 0
Case 36 : If Dcf_bit = 1 Then Dcf_temp = 1
Case 37 : If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 2
Case 38 : If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 4
Case 39 :
If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 8
Dcf_day = Dcf_temp
Dcf_temp = 0
Case 40 : If Dcf_bit = 1 Then Dcf_temp = 1
Case 41 :
If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 2
Dcf_temp = Dcf_temp * 10
Dcf_temp = Dcf_temp + Dcf_day
If Start_dcf_flag = 1 And Dcf_temp & lt; 31 Then _day = Dcf_temp
Dcf_temp = 0
Case 42 : If Dcf_bit = 1 Then Dcf_temp = 1
Case 43 : If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 2
Case 44 :
If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 4
If Start_dcf_flag = 1 Then Week_day = Dcf_temp
Dcf_temp = 0
Case 45 : If Dcf_bit = 1 Then Dcf_temp = 1
Case 46 : If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 2
Case 47 : If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 4
Case 48 :
If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 8
Dcf_month = Dcf_temp
Dcf_temp = 0
Case 49 :
If Dcf_bit = 1 Then Dcf_temp = 10
If Start_dcf_flag = 1 Then _month = Dcf_temp + Dcf_month
Dcf_temp = 0
Case 50 : If Dcf_bit = 1 Then Dcf_temp = 1
Case 51 : If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 2
Case 52 : If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 4
Case 53 :
If Dcf_bit = 1 Then Dcf_temp = Dcf_temp + 8
If Start_dcf_flag = 1 Then _year = Dcf_temp
Dcf_temp = 0

Case 58 :
Start_dcf_flag = 0
Reset_seconds_flag = 1
End Select
Incr Dcf_counter
Counter1 = 0
Start Timer1
End If
Return

Dcf_start:
Incr Pause_counter
If Pause_counter = 2 Then
Pause_counter = 0
Dcf_counter = 0
Start_dcf_flag = 1
End If
Return

Sub Beep
Reset Portd.4
Waitms 100
Set Portd.4
Waitms 100
End Sub

Sub Short_beep
Reset Portd.4
Waitms 10
Set Portd.4
Waitms 255
End Sub