Kod: Zaznacz cały
$regfile = "m8def.dat"
$crystal = 14318000
Ddrd = &B00000000
Portd.2 = 1
' Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 ,
Cursor Off
Config Timer1 = Timer , Prescale = 1 , Capture Edge = Rising , Noise Cancel = 1
Config Aci = On , Compare = On , Trigger = Rising
On Icp1 Oncapture
Enable Icp1
On Int0 Ontaster
Config Int0 = Falling
Enable Int0
Enable Interrupts
Deflcdchar 0 , 7 , 7 , 7 , 7 , 7 , 7 , 7 , 7 ' | prawy
Deflcdchar 1 , 28 , 28 , 28 , 28 , 28 , 28 , 28 , 28 ' | lewy
Deflcdchar 2 , 31 , 31 , 31 , 32 , 32 , 32 , 32 , 32 ' - góra
Deflcdchar 3 , 32 , 32 , 32 , 32 , 32 , 31 , 31 , 31 '- dół
Deflcdchar 4 , 3 , 7 , 7 , 14 , 14 , 28 , 28 , 28 ' /góra
Deflcdchar 5 , 7 , 7 , 7 , 14 , 14 , 28 , 28 , 24 ' /dół
Deflcdchar 6 , 24 , 28 , 28 , 14 , 14 , 7 , 7 , 7 ' \góra
Deflcdchar 7 , 28 , 28 , 28 , 14 , 14 , 7 , 7 , 3 '\dół
Declare Sub Drukujcyfre(byval Pozycja As Byte , Byval Cyfra As Byte)
Dim A As Byte
Dim B As Byte
Dim C As Word
Dim D As Byte
Dim E As Word
Dim I As Byte
Dim J As Byte
Dim K As Byte
Dim L As Byte
Dim M As Byte
Dim N As Byte
Dim Count1 As Word
Dim Icr_new As Word
Dim Icr_old As Word
Dim Freqlong As Long
Dim Freq As Word
Dim Timesample(10) As Word
Dim Freqsum As Word
Dim Samplenr As Integer
Dim Freqaverage As Word
Dim Frequpper As Word
Dim Freqlower As Word
Dim Tone As String * 1
Dim Toneeold As String * 1
Dim Sequence As String * 15
Dim Message As String * 15
Dim Timeout As Word
Locate 4 , 1
Cls
Main:
Portb.1 = 0
Portb.2 = 0
Waitms 0.6
Freqlong = 14318000 / Icr_new
Icr_new = 0
Freq = Freqlong
Incr Timeout
If Timeout = 60 Then
Sequence = ""
Toneeold = ""
Message = ""
Timeout = 0
End If
Timesample(10) = Timesample(9)
Timesample(9) = Timesample(8)
Timesample(8) = Timesample(7)
Timesample(7) = Timesample(6)
Timesample(6) = Timesample(5)
Timesample(5) = Timesample(4)
Timesample(4) = Timesample(3)
Timesample(3) = Timesample(2)
Timesample(2) = Timesample(1)
Timesample(1) = Freq
Freqsum = 0
For Samplenr = 1 To 10
Freqsum = Freqsum + Timesample(samplenr)
Next
Freqaverage = Freqsum / 10
Frequpper = Timesample(1) + 20
Freqlower = Timesample(1) - 20
If Freqaverage > Freqlower And Freqaverage < Frequpper Then
Select Case Freqaverage
Case 1109 To 1139 : Tone = "1"
Case 1182 To 1212 : Tone = "2"
Case 1260 To 1290 : Tone = "3"
Case 1343 To 1373 : Tone = "4"
Case 1431 To 1461 : Tone = "5"
Case 1525 To 1555 : Tone = "6"
Case 1625 To 1655 : Tone = "7"
Case 1732 To 1760 : Tone = "8"
Case 1845 To 1875 : Tone = "9"
Case 1961 To 1991 : Tone = "0"
Case 2090 To 2130 : Tone = "E"
Case Else : Goto Main
End Select
Else : Goto Main
End If
If Tone = Toneeold Then Goto Main
Timeout = 0
If Tone = "E" Then
Sequence = Sequence + Toneeold
Else
Sequence = Sequence + Tone
End If
Toneeold = Tone
If Len(sequence) >= 5 Then
cls
LCD Sequence
Portd.4 = 1
End If
Goto Main
Ontaster:
Portb.1 = 0
Portb.2 = 0
Cls
Lcd "CCIR-dekoder"
End Sub
Oncapture:
Count1 = Timer1
Icr_new = Count1 - Icr_old
Icr_old = Count1
Portb.1 = 1
Portb.2 = 1
Return
dostałem od kolegi z forum działający program który pokazuje zliczanie od 1999 do 9999 właśnie w takim formacie, przerobiliśmy go trochę, i efekt jest taki, że u mnie są same zeraz albo nie pełne zera, lecz wyniku brak, oto efekt przeróbki
Kod: Zaznacz cały
$regfile = "m8def.dat"
$crystal = 14318000
Ddrd = &B00000000
Portd.2 = 1
' Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 ,
Cursor Off
Config Timer1 = Timer , Prescale = 1 , Capture Edge = Rising , Noise Cancel = 1
Config Aci = On , Compare = On , Trigger = Rising
On Icp1 Oncapture
Enable Icp1
On Int0 Ontaster
Config Int0 = Falling
Enable Int0
Enable Interrupts
Deflcdchar 0 , 7 , 7 , 7 , 7 , 7 , 7 , 7 , 7 ' | prawy
Deflcdchar 1 , 28 , 28 , 28 , 28 , 28 , 28 , 28 , 28 ' | lewy
Deflcdchar 2 , 31 , 31 , 31 , 32 , 32 , 32 , 32 , 32 ' - góra
Deflcdchar 3 , 32 , 32 , 32 , 32 , 32 , 31 , 31 , 31 '- dół
Deflcdchar 4 , 3 , 7 , 7 , 14 , 14 , 28 , 28 , 28 ' /góra
Deflcdchar 5 , 7 , 7 , 7 , 14 , 14 , 28 , 28 , 24 ' /dół
Deflcdchar 6 , 24 , 28 , 28 , 14 , 14 , 7 , 7 , 7 ' \góra
Deflcdchar 7 , 28 , 28 , 28 , 14 , 14 , 7 , 7 , 3 '\dół
Declare Sub Drukujcyfre(byval Pozycja As Byte , Byval Cyfra As Byte)
Dim A As Byte
Dim B As Byte
Dim C As Word
Dim D As Byte
Dim E As Word
Dim I As Byte
Dim J As Byte
Dim K As Byte
Dim L As Byte
Dim M As Byte
Dim N As Byte
Dim Count1 As Word
Dim Icr_new As Word
Dim Icr_old As Word
Dim Freqlong As Long
Dim Freq As Word
Dim Timesample(10) As Word
Dim Freqsum As Word
Dim Samplenr As Integer
Dim Freqaverage As Word
Dim Frequpper As Word
Dim Freqlower As Word
Dim Tone As String * 1
Dim Toneeold As String * 1
Dim Sequence As String * 15
Dim Message As String * 15
Dim Timeout As Word
Locate 4 , 1
Cls
Main:
Portb.1 = 0
Portb.2 = 0
Waitms 0.6
Freqlong = 14318000 / Icr_new
Icr_new = 0
Freq = Freqlong
Incr Timeout
If Timeout = 60 Then
Sequence = ""
Toneeold = ""
Message = ""
Timeout = 0
End If
Timesample(10) = Timesample(9)
Timesample(9) = Timesample(8)
Timesample(8) = Timesample(7)
Timesample(7) = Timesample(6)
Timesample(6) = Timesample(5)
Timesample(5) = Timesample(4)
Timesample(4) = Timesample(3)
Timesample(3) = Timesample(2)
Timesample(2) = Timesample(1)
Timesample(1) = Freq
Freqsum = 0
For Samplenr = 1 To 10
Freqsum = Freqsum + Timesample(samplenr)
Next
Freqaverage = Freqsum / 10
Frequpper = Timesample(1) + 20
Freqlower = Timesample(1) - 20
If Freqaverage > Freqlower And Freqaverage < Frequpper Then
Select Case Freqaverage
Case 1109 To 1139 : Tone = "1"
Case 1182 To 1212 : Tone = "2"
Case 1260 To 1290 : Tone = "3"
Case 1343 To 1373 : Tone = "4"
Case 1431 To 1461 : Tone = "5"
Case 1525 To 1555 : Tone = "6"
Case 1625 To 1655 : Tone = "7"
Case 1732 To 1760 : Tone = "8"
Case 1845 To 1875 : Tone = "9"
Case 1961 To 1991 : Tone = "0"
Case 2090 To 2130 : Tone = "E"
Case Else : Goto Main
End Select
Else : Goto Main
End If
If Tone = Toneeold Then Goto Main
Timeout = 0
If Tone = "E" Then
Sequence = Sequence + Toneeold
Else
Sequence = Sequence + Tone
End If
Toneeold = Tone
If Len(sequence) >= 5 Then
C = Val(sequence )
For B = 1 To 4
Select Case B
Case 1 :
E = C / 1000
D = E
Case 2 :
E = C Mod 1000
E = E / 100
D = E
Case 3 :
E = C Mod 100
D = E / 10
Case 4 :
E = C Mod 10
D = E
End Select
Call Drukujcyfre(b , D)
Next B
Portd.4 = 1
End If
Goto Main
Ontaster:
Portb.1 = 0
Portb.2 = 0
Cls
Lcd "CCIR-dekoder"
Sub Drukujcyfre(byval Pozycja As Byte , Byval Cyfra As Byte)
M = Pozycja - 1
M = M * 4
M = M + 1
For I = 1 To 4
Locate I , M
For J = 0 To 3
N = Cyfra * 16
K = I - 1
K = K * 4
K = K + J
K = K + N
L = Lookup(k , Cyfry)
Lcd Chr(l)
Next J
Next I
End Sub
'kody cyfr
'0 to znak wczytany wcześniej do wyświetlacza z użyciem deflcdchar
'32 to znak pusty znajdujący się w ROM wyświetlacza
Cyfry:
'0
Data 32 , 4 , 2 , 6
Data 32 , 1 , 32 , 0
Data 32 , 1 , 32 , 0
Data 32 , 7 , 3 , 5
'1
Data 32 , 32 , 4 , 1
Data 32 , 4 , 32 , 1
Data 32 , 32 , 32 , 1
Data 32 , 32 , 32 , 1
'2
Data 32 , 4 , 2 , 6
Data 32 , 32 , 32 , 5
Data 32 , 32 , 4 , 32
Data 32 , 4 , 3 , 3
'3
Data 32 , 4 , 2 , 6
Data 32 , 32 , 3 , 5
Data 32 , 32 , 32 , 6
Data 32 , 7 , 3 , 5
'4
Data 32 , 32 , 4 , 1
Data 32 , 4 , 32 , 1
Data 32 , 2 , 2 , 1
Data 32 , 32 , 32 , 1
'5
Data 32 , 0 , 2 , 2
Data 32 , 0 , 3 , 32
Data 32 , 32 , 32 , 6
Data 32 , 7 , 3 , 5
'6
Data 32 , 4 , 2 , 6
Data 32 , 1 , 32 , 32
Data 32 , 4 , 2 , 6
Data 32 , 7 , 3 , 5
'7
Data 32 , 2 , 2 , 4
Data 32 , 32 , 4 , 32
Data 32 , 4 , 32 , 32
Data 32 , 1 , 32 , 32
'8
Data 32 , 4 , 2 , 6
Data 32 , 7 , 3 , 5
Data 32 , 4 , 32 , 6
Data 32 , 7 , 3 , 5
'9
Data 32 , 4 , 2 , 6
Data 32 , 7 , 3 , 5
Data 32 , 32 , 32 , 0
Data 32 , 7 , 3 , 5
Return
Oncapture:
Count1 = Timer1
Icr_new = Count1 - Icr_old
Icr_old = Count1
Portb.1 = 1
Portb.2 = 1
Return
Kod: Zaznacz cały
C = Val(sequence )
For B = 1 To 4
Select Case B
Case 1 :
E = C / 1000
D = E
Case 2 :
E = C Mod 1000
E = E / 100
D = E
Case 3 :
E = C Mod 100
D = E / 10
Case 4 :
E = C Mod 10
D = E
End Select
Call Drukujcyfre(b , D)
Next B
Edit: poprawiłem znaczniki Code. Ddevil