1 | #include <p18F4620.h>
|
2 | #include <stdio.h>
|
3 |
|
4 | void main(void)
|
5 |
|
6 | {
|
7 | #define E_PIN LATAbits.LATA1 /* PORT for D */
|
8 | #define TRIS_E TRISAbits.TRISA1 /* TRIS for E */
|
9 |
|
10 | #define RW_PIN PORTAbits.LATA2 /* PORT for RW */
|
11 | #define TRIS_RW TRISAbits.TRISA2 /* TRIS for RW */
|
12 |
|
13 | #define RS_PIN LATAbits.LATA3 /* PORT for RS */
|
14 | #define TRIS_RS TRISAbits.TRISA3 /* TRIS for RS */
|
15 |
|
16 |
|
17 | #define DATA_PORT PORTD /* PORT for Data */
|
18 | #define TRIS_DATA_PORT TRISD /* TRIS for Data */
|
19 |
|
20 | #define Delay1TCY() Nop() ;
|
21 |
|
22 |
|
23 | /*Start der Initialisierung*************/
|
24 | TRIS_RW = 0;
|
25 | TRIS_RS = 0;
|
26 | TRIS_E = 0;
|
27 | TRIS_DATA_PORT = 0;
|
28 | ADCON1 = 0x0F; //als digitale Ein und ausgänge schalten
|
29 |
|
30 |
|
31 |
|
32 | //Initialisierung des LCD-Displays
|
33 | Delay10KTCYx (25); // wait 250ms nach dem Einschalten
|
34 |
|
35 |
|
36 | /*Schritt 1 : Zuerst das Obere Display initialisieren */
|
37 | DATA_PORT = 0x03; //Das ist nötig, weil Port D0..D3 => LCD_Display D4..D7
|
38 | E_PIN = 1; // E-Leitung Pulsen lassen
|
39 | Delay1TCY();
|
40 | E_PIN = 0 ;
|
41 |
|
42 |
|
43 | /*2. Schritt nochmal 0x30 senden*/
|
44 | Delay1KTCYx(50); // wait 50ms
|
45 | DATA_PORT = 0x03;
|
46 | E_PIN = 1; // E-Leitung Pulsen lassen
|
47 | Delay1TCY();
|
48 | E_PIN = 0 ;
|
49 | Delay1KTCYx(25); // wait 25ms
|
50 |
|
51 | // 3. Schritt nochmal 0x30 senden ohne Pause zwischen Schritt 2 und 3
|
52 | Delay1KTCYx(25); // wait 25ms
|
53 | DATA_PORT = 0x03;
|
54 | E_PIN = 1; // E-Leitung Pulsen lassen
|
55 | Delay1TCY();
|
56 | E_PIN = 0 ;
|
57 | Delay1KTCYx(25); // wait 25ms
|
58 |
|
59 | /****4-BIT Initialisierung****/
|
60 | //4. Schritt diesmal 0x20 senden, damit wird umgeschaltet in den 4 bit Modus
|
61 | DATA_PORT = 0x02;
|
62 | E_PIN = 1; // E-Leitung Pulsen lassen
|
63 | Delay1TCY();
|
64 | E_PIN = 0 ;
|
65 | Delay1KTCYx(25); // wait 25ms
|
66 |
|
67 | /*5. Schritt nun müssen alle Bytes in zwei Blöcken übertragen werden
|
68 | zuerst das Obere Nibble dann das untere Nibble
|
69 | im simpel LCD-Initaialisierungs Programm sortiere ich die Nibbles selber
|
70 | möchte ich den Wert b'abcdefgh' übertragen dann schicke ich zuersz
|
71 | movlw B'0000abcd' und dann movlw b'0000efgh'
|
72 | das ist zum ersten Verständnis hilfreich, und sollte später verbessert werden.
|
73 |
|
74 | zuerst muss der Befehl Function Set erfolgen. Hierzu das RS-Bit
|
75 | muss 0 sein, weil ein Systembyte übertragen wird Das ist es aber immer noch denn PORTA =0
|
76 | Das Byte für Systemset 0x28 function set, 4-bit 2-zeilig, 5x7 heißt
|
77 | B'00101000' also zuerst B'00000010' und dann B'00001000' schicken
|
78 | */
|
79 | Delay10KTCYx(10); // wait 100ms, pauschale Wartezeit ist einfacher als das Busyflag abzufragen
|
80 | DATA_PORT = 0x02;
|
81 |
|
82 | E_PIN = 1; // E-Leitung Pulsen lassen
|
83 | Delay1TCY();
|
84 | E_PIN = 0 ;
|
85 |
|
86 | Delay10KTCYx(10); // wait 100ms, pauschale Wartezeit ist einfacher als das Busyflag abzufragen
|
87 | DATA_PORT = 0x08;
|
88 |
|
89 | E_PIN = 1; // E-Leitung Pulsen lassen
|
90 | Delay1TCY();
|
91 | E_PIN = 0 ;
|
92 |
|
93 |
|
94 | /* so jetzt schalten wir mal das Display ein und lassen den Cursor Blinken.
|
95 | dazu brauchen wir den Befehl B'00001111' ; 0xF display on, cursor on, cursor flash on
|
96 | wie oben zwerlegen in B'00000000' und B'00001111' !
|
97 | */
|
98 | DATA_PORT = 0x00;
|
99 | Delay10KTCYx(10); // wait 100ms, pauschale Wartezeit ist einfacher als das Busyflag abzufragen
|
100 | E_PIN = 1; // E-Leitung Pulsen lassen
|
101 | Delay1TCY();
|
102 | E_PIN = 0 ;
|
103 |
|
104 |
|
105 | DATA_PORT = 0x01;
|
106 | Delay10KTCYx(10); // wait 100ms, pauschale Wartezeit ist einfacher als das Busyflag abzufragen
|
107 | E_PIN = 1; // E-Leitung Pulsen lassen
|
108 | Delay1TCY();
|
109 | E_PIN = 0 ;
|
110 |
|
111 |
|
112 |
|
113 |
|
114 | DATA_PORT = 0x00;
|
115 | Delay10KTCYx(10); // wait 100ms, pauschale Wartezeit ist einfacher als das Busyflag abzufragen
|
116 | E_PIN = 1; // E-Leitung Pulsen lassen
|
117 | Delay1TCY();
|
118 | E_PIN = 0 ;
|
119 |
|
120 |
|
121 | DATA_PORT = 0x0F;
|
122 | Delay10KTCYx(10); // wait 100ms, pauschale Wartezeit ist einfacher als das Busyflag abzufragen
|
123 | E_PIN = 1; // E-Leitung Pulsen lassen
|
124 | Delay1TCY();
|
125 | E_PIN = 0 ;
|
126 |
|
127 | /*
|
128 | wenn wir jetzt hier stoppen würden mit den Befehl
|
129 | dann müssste der Cursor des LCD_Displays jetzt blinken
|
130 | Blinkt der Cursor ein der Ecke, dann ist das LCD richtig initialisiert und nun kann man darangehen es mit Text zu füttern
|
131 | Neu ist jetzt, dass die RS-Leitung immer 1 sein muss,
|
132 | weil wir ab jetzt nicht mehr das LCD-Systembeeinflussen wollen sondern
|
133 | den Textspeicher.
|
134 | */
|
135 |
|
136 |
|
137 | // Buchstaben H schreiben
|
138 | RS_PIN = 1;
|
139 |
|
140 |
|
141 |
|
142 | DATA_PORT = 0x04;
|
143 | Delay10KTCYx(10); // wait 100ms, pauschale Wartezeit ist einfacher als das Busyflag abzufragen
|
144 | E_PIN = 1; // E-Leitung Pulsen lassen
|
145 | Delay1TCY();
|
146 | E_PIN = 0 ;
|
147 |
|
148 | DATA_PORT = 0x08;
|
149 | Delay10KTCYx(10); // wait 100ms, pauschale Wartezeit ist einfacher als das Busyflag abzufragen
|
150 | E_PIN = 1; // E-Leitung Pulsen lassen
|
151 | Delay1TCY();
|
152 | E_PIN = 0 ;
|
153 |
|
154 |
|
155 |
|
156 |
|
157 | RS_PIN = 0;
|
158 |
|
159 |
|
160 |
|
161 | while(1);
|
162 | {}
|
163 |
|
164 | }
|