Wyświetlenie 4 liczb na LCD 4x16, fullTEXT

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
lukashb
-
Posty: 1
Rejestracja: 03 paź 2009, 21:01
Lokalizacja: Lublin

Wyświetlenie 4 liczb na LCD 4x16, fullTEXT

Post autor: lukashb » 03 paź 2009, 21:10

Witam! Przyszedłem do Was po pomoc po raz 1, i mówię dzień dobry (dobry wieczór? :) )ale do rzeczy, mam urządzenie, któro dekoduje mi liczby, i je otrzymuję na LCD w wyniku operacji LCD Sequnce oto kod

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 
i chciałbym teraz ten wynik zamienić na duże liczby wykorzystując do tego LCD 4x16
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 
i pytanie, dlaczego ten program nie wyświetla sequence, przecież ten kawałek kodu

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 
ma za zadanie przekształcić dane na taki format wywołując odpowiednio procedury Drukujcyfre itp, teoretycznie powinno działać, a niechce, wszelkie zmienne są na początku, amoże ktoś ma sprawdzony pomysł i pomógł by przerobić ponieważ siedzę nad tym już 3 dzień i 0 efektów, a bardzo mi zależy. Pozdrawiam Łukasz

Edit: poprawiłem znaczniki Code. Ddevil
Ostatnio zmieniony 04 paź 2009, 14:13 przez lukashb, łącznie zmieniany 1 raz.

ODPOWIEDZ