Hallo Zusammen,
ich habe hier mal ein Programm geschrieben, welches Simuliert, wie ein
Zeichen im 4-Bit Modus an mein HD44780 kompatibles LCD (EA W204B-NLW)
von Electronic Assembly übertragen wird. Zur Hilfe habe ich hier die
Routine von der Seite genommen
(http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung).
Ich habe halt versucht zu verstehen, wie der Kontroller angesteuert
wird. Betrachtet habe ich hierbei erst mal nur die Datenübertragung an
sich.
Mit der Funktion „lcd_data()“ wird hier ein Datenwert (253) an den
Kontroller geschickt. Dies passiert wie folgt. Zuerst wird das gesamte
Byte an die Funktion „lcd_out()“ geschickt. Dabei werden die oberen Bits
mit 1111 und die unteren mit 0000 maskiert. So das mit „data &= 0xF0“
dafür gesorgt wird, dass nur noch die Daten an sich (4 oben Bits)
vorhanden sind. Dann wird in der eigentlichen Funktion mit „Port &=
~(0xF0>>(4-0))“ dafür gesorgt, dass erst mal die Pins am Port, welche
zur Übertragung genutzt werden auf 0000 gesetzt werden. Dann wird mit
„LCD_PORT |= (data>>(4-LCD_DB)“ dafür gesorgt, dass nur noch die 4
Bit-Daten an die Pins gelegt werden. Der restliche Port bleibt also wie
es ist.
Dann kommen auf die gleiche Weise die restlichen 4-Bits (unteren)
hinterher. Nur wurde vorher mit einem linksshift (data<<4) dafür
gesorgt, dass die untern 4-Bits jetzt an der Position der 4 oberen Bits
liegen und auf gleiche Art und Weise wie die eigentlichen oberen Bits
übertragen werden.
Wenn ich also von dem Zeichen 253 ausgehe (0b11111101), dann wird zuerst
die obere Hälfte (1111) und dann die untere Hälfte (1101) übertragen. So
das im gesamten Ergebnis die 253 (11111101) übertragen wurde. Man sieht
auch, dass zu jedem Zeitpunkt (T1 & T2) die 4 anderen (hier oberen) Pins
vom Port unverändert bleiben.
Ich hoffe ich habe es so richtig verstanden.
Gruß
Christian
1 | /*
|
2 | * LCD.c
|
3 | *
|
4 | * Created: 06.09.2014 17:45:44
|
5 | * Author: Christian
|
6 | */
|
7 |
|
8 | #include <avr/io.h>
|
9 | #include "lcd-routines.h"
|
10 | #include <util/delay.h>
|
11 |
|
12 | // Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
|
13 | // Simulation der lcd-routine von :
|
14 | // http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
|
15 |
|
16 | // Es wird das Zeichen 253 übertragen
|
17 |
|
18 | //Virtuelle Port (mit dem Zustand 0b10010000)
|
19 | static uint8_t Port = 0b10010000;
|
20 |
|
21 |
|
22 | // Sendet ein Datenbyte an das LCD (lcd_out( uint8_t data ))
|
23 |
|
24 | static uint8_t test(uint8_t daten)
|
25 | {
|
26 | //obere 4 Bit maskieren
|
27 | daten &= 0xF0;
|
28 |
|
29 | //Maske löschen
|
30 | Port &= ~(0xF0>>(4-0));
|
31 | //Bits setzen
|
32 | Port |= (daten>>(4-0));
|
33 | return(Port);
|
34 | };
|
35 |
|
36 |
|
37 | //Simulation lcd_data( uint8_t data )
|
38 | int main(void)
|
39 | {
|
40 |
|
41 | lcd_init();
|
42 |
|
43 |
|
44 |
|
45 | uint8_t test_daten = 0b11111101;
|
46 | uint8_t gesamt = 0;
|
47 | uint8_t test_Port = 0;
|
48 | char buffer[33];
|
49 |
|
50 |
|
51 | // Oberen 4 Bits
|
52 | //Ablauf in der Funktion (hier nur für Hilfszwecke)
|
53 | uint8_t D1 = test_daten;
|
54 | D1 &= 0xF0;
|
55 | D1 = (D1>>(4-0));
|
56 |
|
57 | //obern Bits an Funktion
|
58 | test_Port = test( test_daten );
|
59 | gesamt |= (test_Port<<4);
|
60 |
|
61 | //Zeitpunkt 1 am Port
|
62 | lcd_setcursor(0, 1);
|
63 | lcd_string("T1:");
|
64 |
|
65 | lcd_setcursor(5, 1);
|
66 | itoa(test_Port,buffer,2);
|
67 | lcd_string(buffer);
|
68 |
|
69 | //Übertragende Bits
|
70 | lcd_setcursor(14, 1);
|
71 | itoa(D1,buffer,2);
|
72 | lcd_string(buffer);
|
73 |
|
74 | //Unteren 4 Bits
|
75 | //Ablauf in der Funktion (hier nur für Hilfszwecke)
|
76 | uint8_t D2 = test_daten;
|
77 | D2 = ( D2<<4 );
|
78 | D2 &= 0xF0;
|
79 | D2 = (D2>>(4-0));
|
80 |
|
81 | //unteren Bits an Funktion
|
82 | test_Port = test( test_daten<<4 );
|
83 | gesamt |= (test_Port);
|
84 |
|
85 | //Zeitpunkt 2 am Port
|
86 | lcd_setcursor(0, 2);
|
87 | lcd_string("T2:");
|
88 |
|
89 | lcd_setcursor(5, 2);
|
90 | itoa(test_Port,buffer,2);
|
91 | lcd_string(buffer);
|
92 |
|
93 | //Übertragende Bits
|
94 | lcd_setcursor(14, 2);
|
95 | itoa(D2,buffer,2);
|
96 | lcd_string(buffer);
|
97 |
|
98 |
|
99 | lcd_setcursor(0, 3);
|
100 | lcd_string("-------------");
|
101 |
|
102 |
|
103 | //Gesamt übertragende Daten an HD44780
|
104 | lcd_setcursor(0, 4);
|
105 | lcd_string("Data:");
|
106 |
|
107 |
|
108 | lcd_setcursor(5, 4);
|
109 | itoa(gesamt,buffer,2);
|
110 | lcd_string(buffer);
|
111 |
|
112 | lcd_setcursor(14, 4);
|
113 | itoa(gesamt,buffer,10);
|
114 | lcd_string(buffer);
|
115 |
|
116 | lcd_setcursor(18, 4);
|
117 | lcd_data(gesamt);
|
118 |
|
119 |
|
120 |
|
121 | return 0;
|
122 | }
|