Forum: Projekte & Code LCD-Decoder mir ATMega32


von Ekkehard O. (ekkehard_o)


Lesenswert?

Hallo liebe Gemeinde,

ich war vor einiger Zeit auf der Suche nach der Möglichkeit, einen 
LCD-Bus als Datenquelle zu verwenden. Da ich seinerzeit nichts finden 
konnte, bin ich selber kreativ geworden.
Hintergrund war folgender:

Ich habe ein Systemtelefon (in diesem Fall ein Panasonic KX-DT321), dem 
ich Daten entlocken wollte. Der Einsatzzweck variiert, deshalb sollte es 
auch universal gehalten sein. Für die Bedienbarkeit schien es mir am 
einfachsten zu sein, den Display-Inhalt als String verfügbar zu machen 
und mit einer Match-Suche eine Aktion ausführen.
Der unten gezeigte Code ist ausgelegt für ein 16*1-Display im 
4-Bit-Betrieb.
Die Ausgabe des Displayinhalts erfolgt zur Demonstration über RS232 auf 
ein Terminalprogramm mit VT100-Emulation im UTF8-Zeichenformat.

Hier das Grundgerüst des Bascom-Codes, der gerne benutzt und angepasst 
werden darf. Ich würde mich freuen, dem ein oder anderen damit helfen zu 
können.
1
'----------------------------------------------------------------------------
2
'Name                      : LCD Bus-Wandler.bas
3
'Ersteller                  : Ekkehard Oetken
4
'Zweck                     : Displayinhalt auslesen
5
'PIC                          : Mega32
6
'----------------------------------------------------------------------------
7
8
'PortC.0 = Systel-Display D4
9
'PortC.1 = Systel-Display D5
10
'PortC.2 = Systel-Display D6
11
'PortC.3 = Systel-Display D7
12
'PortC.5 = Systel-Display RS
13
'PortD.2 = Systel-Display E
14
15
'Die Ausgabe erfolgt im UTF-8-Format, VT100-Emulation
16
'Ablaufdauer der Interruptroutine: 2us
17
'Verzögerung zwischen Interrupt und Start der Routine: 4us
18
19
20
$regfile = "m32def.dat"
21
$crystal = 16000000
22
$baud = 38400
23
24
Ddrc = &B00000000                     'Displayport als Eingang
25
Ddrd = &B11111011                     'Interrupt-Pin an Port D.2 als eingang konfigurieren
26
27
Portc = &B00000000                     'Pull-Up abschalten
28
Portd = &B00000100                     'Pull-Up an Port D.2 einschalten
29
30
On Int0 Lesen                                   'Interrupt wird bei jedem Display-Enable ausgelöst
31
Config Int0 = Rising                         'Interrupt bei steigender Flanke
32
Enable Int0                                        'Interrupt 0 einschalten
33
Enable Interrupts                              'Interrupts global einschalten
34
35
Dim Disp As String * 16                   'Gibt die Displayanzeige im UTF-8-Format aus
36
Dim Dispp1 As String * 8                 'Speichert die ersten 8 Stellen der Dsiplayanzeige
37
Dim Dispp2 As String * 8                 'Speichert die letzten 8 Stellen der Displayanzeige
38
39
Dim Stelle(17)as Byte                         'Array: Speichert Bytewerte der 16 Displaystellen
40
Dim Systel As Byte                              'Speichert die Bytewerte am Displayport
41
Dim Timeout As Long                         'Zur Erkennung des Ausbleibens der Daten am Displayport
42
Dim Intcounter As Byte                       'Zählt die Impulse am "Enable" PIN zum Überspringen
43
                                                                'des LN nach DDRAM Addresse 1000 0000
44
Dim Bytecounter As Byte                    'Speichert den Pointer vom Array "Stelle"
45
Dim Nibble As Bit                                 'Umschaltung zwischen HN=1 und LN=0
46
Dim N As Byte                                       'Schleifenzähler für die Stringbildung
47
48
Systel = 0
49
Timeout = 0
50
Intcounter = 0
51
Bytecounter = 1
52
Nibble = 1
53
N = 1
54
55
56
57
Do
58
59
   If Timeout >= 50 Then                                          'Timeout nicht durch Interrupt zurückgesetzt
60
      Print Chr(27) ; "[1;0f" ; "Check Connection"
61
      Timeout = 50
62
   Else
63
      For N = 1 To 17                                                    'Den String "Disp" für zusammenbauen
64
      Disp = Disp + Chr(stelle(n))
65
      Next N
66
67
      Dispp1 = Mid(disp , 1 , 8)                                     'Das neunte Zeichen entfernen
68
      Dispp2 = Mid(disp , 10 , 8)
69
      Disp = Dispp1 + Dispp2
70
71
      Print Chr(27) ; "[1;0f" ; Disp                                   'Ausgabe auf dem Bildschirm
72
      Disp = ""                                                                    'String zurücksetzen
73
   End If
74
75
   Incr Timeout
76
77
Loop
78
79
80
81
82
Lesen:                                                   'Interrupt ausgelöst
83
   If Pinc = 24 Then                              'Wenn das DDRAM auf Addresse 1000 0000 gesetzt wird
84
      Bytecounter = 1                             'Setzte den Pointer von Array "Stelle" zurück
85
      Intcounter = 0                                 'Setzt den Zähler zum Überspringen des LN nach 
86
                                                                'DDRAM-Addresse 1000 0000 zurück
87
      Nibble = 1                                        'Speichere im nächsten Durchgang das HN
88
   Else
89
      If Intcounter >= 2 Then                    'überspringe das erste Nibble
90
         If Nibble = 1 Then                          'Speichere das HN
91
            Systel.4 = Pinc.0                         'Schreibe die oberen vier Bit von "Systel"
92
            Systel.5 = Pinc.1
93
            Systel.6 = Pinc.2
94
            Systel.7 = Pinc.3
95
            Nibble = 0                                      'Sperre das HN für den nächsten Durchgang
96
         Else                                                    'Speichere das LN
97
            Systel.0 = Pinc.0                           'Schreibe die unteren vier Bits von "Systel"
98
            Systel.1 = Pinc.1
99
            Systel.2 = Pinc.2
100
            Systel.3 = Pinc.3
101
            Stelle(bytecounter) = Systel        'Schreibe das komplette Byte in
102
                                                                     'Position X von Bytearray "Stelle"
103
            Incr Bytecounter                            'Erhöhe den Pointer von Array "Stelle"
104
            Nibble = 1                                        'Sperre das LN für den nächsten Durchgang
105
         End If
106
      End If
107
   End If
108
109
   Timeout = 0                                              'Reset Zähler für fehlende Displaydaten
110
   Incr Intcounter                                         'Erhöhe den Zähler "Intcounter" um 1
111
Return
112
113
114
115
End

--

Quelltext bitte in [ c ] [ /c ] bzw. [ pre ] [ /pre ] - Tags 
einschließen, damit die Formatierung erhalten bleibt.

-rufus

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.