von
Verzweifelt an PIC (Gast)
04.02.2018 19:35
Hallo,
ich habe ein Problem mit meinem PIC16 F1829. Ich will ein I2C Display
ansteuern, aber irgendwie wird das nichts. Ich habe ein LCM015 -
Display, welches einen eingebauten PCF8574
(https://www.nxp.com/docs/en/data-sheet/PCF8574_PCF8574A.pdf ) hat, und
einen dahinter angeschlossenen HD44780.
Es sind folgende Verbindungen ausgeführt:
PCF8574 <-> HD44780
P0-P3 : DB4-DB7
P4 : RS
P5 : RW
P6 : E
P7 : Not Connected
Die Adresse vom PCF ist fix verdrahtet auf 0x4E. Jetzt habe ich aber
festgestellt, dass das MSB vom PIC als erstes auf die Leitung angelegt
wird, deshalb habe ich die Adresse gespiegelt. Liege ich damit richtig?
Deshalb habe ich auch sämtliche Daten die ich zum Display sende
gespiegelt.
Die Daten werden zwar auf die Leitung gelegt, aber es folgt keine
Reaktion
Noch eine kurze Anmerkung:
Pull Ups sind angeschlossen
Versorgung 5V
Habe ein Oszi da.
Könntet Ihr mir helfen?
Danke im Voraus!(Ich bin ein Anfänger)
1 void i2c_master_init (){
2 SSP1CON1 . SSPEN = 0 ;
3 SSP1STAT . SMP = 0 ;
4 SSP1STAT . CKE = 0 ;
5 SSP1CON1 = 0x0 ;
6 SSP1CON1 . WCOL = 0 ;
7 SSP1CON1 . SSPOV = 0 ;
8 // SSPEN NOCH EINSCHALTEN
9 SSP1ADD = 0x9 ;
10 SSP1CON1 . SSPM0 = 0 ;
11 SSP1CON1 . SSPM1 = 0 ;
12 SSP1CON1 . SSPM2 = 0 ;
13 SSP1CON1 . SSPM3 = 1 ;
14 SSP1CON2 = 0x0 ;
15 SSP1CON2 . RCEN = 0 ;
16 // PEN (STOP Condition setzen)
17 // RSEN (Repeat START Condition setzen)
18 // SEN(START Condition setzen)
19
20 SSP1CON3 = 0x9 ;
21 SSP1CON3 . PCIE = 0 ;
22 SSP1CON3 . SCIE = 0 ;
23 SSP1CON3 . SDAHT = 1 ;
24 SSPMSK = 0x0 ;
25 SSP1BUF = 0x00 ;
26 TRISB = 0xff ;
27 SSP1CON1 . SSPEN = 1 ;
28 }
29 void i2c_master_start (){
30 SSP1CON2 . SEN = 1 ;
31 //while(SSP1CON2.ACKEN == 0){}
32 }
33 void i2c_send_data ( unsigned short data_ ){
34 PORTC = 0 b00000001 ;
35 SSP1BUF = data_ ; //Adressierung
36 while ( SSP1STAT . BF == 1 ); //Warten bis der Buffer leer ist
37 PORTC = 0 b00000011 ;
38 Delay_10us ();
39 Delay_10us ();
40 Delay_10us ();
41 Delay_10us ();
42 Delay_10us ();
43 Delay_10us ();
44 Delay_10us ();
45 Delay_10us ();
46 Delay_10us ();
47 Delay_10us ();
48 Delay_10us ();
49 }
50 void i2c_master_stop (){
51 Delay_10us ();
52 SSP1CON2 . PEN = 1 ;
53 }
54 void main () {
55 ANSELC = 0x0 ;
56 TRISB = 0x0 ; // Configure PORTB as output
57 TRISC = 0 b00000000 ; // Configure PORTC as output
58 PORTC = 0x0 ;
59 i2c_master_init ();
60 Delay_100ms ();
61
62 i2c_master_start ();
63 i2c_send_data ( 0x72 );
64 i2c_send_data ( 0xC0 );
65 i2c_send_data ( 0xC2 );
66 i2c_master_stop ();
67 Delay_10ms ();
68
69 i2c_master_start ();
70 i2c_send_data ( 0x72 );
71 i2c_send_data ( 0xC0 );
72 i2c_send_data ( 0xC2 );
73 i2c_master_stop ();
74 Delay_10ms ();
75 //5ms
76 i2c_master_start ();
77 i2c_send_data ( 0x72 );
78 i2c_send_data ( 0xC0 );
79 i2c_send_data ( 0xC2 );
80 i2c_master_stop ();
81 Delay_100ms ();
82 //100us
83 i2c_master_start ();
84 i2c_send_data ( 0x72 );
85 i2c_send_data ( 0xC0 );
86 i2c_send_data ( 0xC2 );
87 i2c_master_stop ();
88 Delay_10ms ();
89 // ersten Init Befehle
90 i2c_master_start ();
91 i2c_send_data ( 0x72 );
92 i2c_send_data ( 0x40 );
93 i2c_send_data ( 0x42 );
94 i2c_master_stop ();
95 Delay_10ms ();
96 // zweiter Befehl
97 i2c_master_start ();
98 i2c_send_data ( 0x72 );
99 i2c_send_data ( 0x40 );
100 i2c_send_data ( 0x42 );
101 i2c_master_stop ();
102 Delay_10ms ();
103 // dritter Befehl
104 i2c_master_start ();
105 i2c_send_data ( 0x72 );
106 i2c_send_data ( 0x10 );
107 i2c_send_data ( 0x12 );
108 i2c_master_stop ();
109 Delay_10ms ();
110 // vierter Befehl
111 i2c_master_start ();
112 i2c_send_data ( 0x72 );
113 i2c_send_data ( 0x00 );
114 i2c_send_data ( 0x02 );
115 i2c_master_stop ();
116 Delay_10ms ();
117 // fuenfter Befehl
118 i2c_master_start ();
119 i2c_send_data ( 0x72 );
120 i2c_send_data ( 0x10 );
121 i2c_send_data ( 0x12 );
122 i2c_master_stop ();
123 Delay_10ms ();
124 // sechster Befehl
125 i2c_master_start ();
126 i2c_send_data ( 0x72 );
127 i2c_send_data ( 0x00 );
128 i2c_send_data ( 0x02 );
129 i2c_master_stop ();
130 Delay_10ms ();
131 // siebneter Befehl
132 i2c_master_start ();
133 i2c_send_data ( 0x72 );
134 i2c_send_data ( 0x80 );
135 i2c_send_data ( 0x82 );
136 i2c_master_stop ();
137 Delay_10ms ();
138 // achter Befehl
139 i2c_master_start ();
140 i2c_send_data ( 0x72 );
141 i2c_send_data ( 0x00 );
142 i2c_send_data ( 0x02 );
143 i2c_master_stop ();
144 Delay_10ms ();
145 // neunter Befehl
146 i2c_master_start ();
147 i2c_send_data ( 0x72 );
148 i2c_send_data ( 0xE0 );
149 i2c_send_data ( 0xE2 );
150 i2c_master_stop ();
151 Delay_10ms ();
152
153 // zehnter Befehl
154 i2c_master_start ();
155 i2c_send_data ( 0x72 );
156 i2c_send_data ( 0x60 );
157 i2c_send_data ( 0x62 );
158 i2c_master_stop ();
159 Delay_10ms ();
160
161 //Start schreib ein H
162 i2c_master_start ();
163 i2c_send_data ( 0x72 );
164 i2c_send_data ( 0x28 );
165 i2c_send_data ( 0x2A );
166 i2c_master_stop ();
167 Delay_10ms ();
168
169 i2c_master_start ();
170 i2c_send_data ( 0x72 );
171 i2c_send_data ( 0x18 );
172 i2c_send_data ( 0x1A );
173 i2c_master_stop ();
174 Delay_10ms ();
175
176
177 }
von
Lothar M.
(Firma: Titel)
(lkmiller )
(Moderator )
04.02.2018 19:44
Verzweifelt an PIC schrieb im Beitrag #5304087:
> Liege ich damit richtig?
Hast du ein digitales Oszi?
Oder einen Logic-Analyzer?
von
Verzweifelt an PIC (Gast)
04.02.2018 19:49
Digitales Oszi TDS2012 Tektronikx 2 Kanal 1GS/s 100Mhz
Verzweifelt an PIC schrieb im Beitrag #5304087:
> Jetzt habe ich aber
> festgestellt, dass das MSB vom PIC als erstes auf die Leitung angelegt
> wird, deshalb habe ich die Adresse gespiegelt.
Der PCF8574 erwartet doch auch das MSB zuerst.
von
Verzweifelt an PIC (Gast)
04.02.2018 19:58
Wie
Volker S. schrieb:
> Verzweifelt an PIC schrieb im Beitrag #5304087:
>> Jetzt habe ich aber
>> festgestellt, dass das MSB vom PIC als erstes auf die Leitung angelegt
>> wird, deshalb habe ich die Adresse gespiegelt.
>
> Der PCF8574 erwartet doch auch das MSB zuerst.
Ich habe aus dem Datenblatt daraus geschlossen, weil es auf Seite 8 so
dargestellt wird.
Verzweifelt an PIC schrieb im Beitrag #5304117:
> Ich habe aus dem Datenblatt daraus geschlossen, weil es auf Seite 8 so
> dargestellt wird.
Da kommt nach dem Startbit zuerst das MSB (A6)
von
Tuxpilot (Gast)
04.02.2018 20:04
Du brauchst nicht spiegeln, aber du solltest auf das R/W-Bit achten. Zu
erkennen an den A6, A5, A4...
Dein Code müsste also nicht so aussehen: 1 i2c_master_start ();
2 i2c_send_data ( 0x72 ); // Entspricht 0x4E rückwärts
sondern so: 1 i2c_master_start ();
2 i2c_send_data (( 0x27 << 1 ) | 0 ); // EIn Bit nach links geschoben, dann das W-Bit (0).
3 i2c_send_data ( 0x4e ); // Das gleiche.
Siehe auch im Datenblatt Seite 5.
von
Verzweifelt an PIC (Gast)
04.02.2018 20:06
Also g
Tuxpilot schrieb:
> Du brauchst nicht spiegeln, aber du solltest auf das R/W-Bit
> achten. Zu
> erkennen an den A6, A5, A4...
>
> Dein Code müsste also nicht so aussehen: i2c_master_start();
> i2c_send_data(0x72); // Entspricht 0x4E rückwärts
> sondern so: i2c_master_start();
> i2c_send_data((0x27 <<1) | 0); // EIn Bit nach links geschoben,
> dann das W-Bit (0).
> i2c_send_data(0x4e); // Das gleiche.
>
> Siehe auch im Datenblatt Seite 5.
Vielen Dank ihr beiden! Muss ich das also auch nicht bei den Daten für
das Display machen?
von
Tuxpilot (Gast)
04.02.2018 20:12
Klar, grundsätzlich MSB zuerst.
Das R/W-Bit natürlich nur beim ersten Byte (Adresse).
von
Verzweifelt an PIC (Gast)
04.02.2018 20:17
Tuxpilot schrieb:
> Klar, grundsätzlich MSB zuerst.
>
> Das R/W-Bit natürlich nur beim ersten Byte (Adresse).
Vielen Dank nochmal! Ich war verwirrt durch die Zeichnung. Ich
korrigiere mal die Daten und schau mal nach, ob es dann funktioniert
von
Verzweifelt an PIC (Gast)
04.02.2018 20:50
SO jetzt löscht er das Display zwar, aber das zeichen wird trotzdem
nicht geschrieben
1 void i2c_master_init (){
2 SSP1CON1 . SSPEN = 0 ;
3 SSP1STAT . SMP = 0 ;
4 SSP1STAT . CKE = 0 ;
5 SSP1CON1 = 0x0 ;
6 SSP1CON1 . WCOL = 0 ;
7 SSP1CON1 . SSPOV = 0 ;
8 // SSPEN NOCH EINSCHALTEN
9 SSP1ADD = 0x9 ;
10 SSP1CON1 . SSPM0 = 0 ;
11 SSP1CON1 . SSPM1 = 0 ;
12 SSP1CON1 . SSPM2 = 0 ;
13 SSP1CON1 . SSPM3 = 1 ;
14 SSP1CON2 = 0x0 ;
15 SSP1CON2 . RCEN = 0 ;
16 // PEN (STOP Condition setzen)
17 // RSEN (Repeat START Condition setzen)
18 // SEN(START Condition setzen)
19
20 SSP1CON3 = 0x9 ;
21 SSP1CON3 . PCIE = 0 ;
22 SSP1CON3 . SCIE = 0 ;
23 SSP1CON3 . SDAHT = 1 ;
24 SSPMSK = 0x0 ;
25 SSP1BUF = 0x00 ;
26 TRISB = 0xff ;
27 SSP1CON1 . SSPEN = 1 ;
28 }
29 void i2c_master_start (){
30 SSP1CON2 . SEN = 1 ;
31 //while(SSP1CON2.ACKEN == 0){}
32 }
33 void i2c_send_data ( unsigned short data_ ){
34 PORTC . RC0 = 1 ;
35 PORTC . RC4 = SSP1CON2 . ACKSTAT ;
36 SSP1BUF = data_ ; //Adressierung
37 while ( SSP1STAT . BF == 1 ); //Warten bis der Buffer leer ist
38 PORTC = 0 b00001011 ;
39 Delay_10us ();
40 Delay_10us ();
41 Delay_10us ();
42 Delay_10us ();
43 Delay_10us ();
44 Delay_10us ();
45 Delay_10us ();
46 Delay_10us ();
47 Delay_10us ();
48 Delay_10us ();
49 Delay_10us ();
50 }
51 void i2c_master_stop (){
52 Delay_10us ();
53 SSP1CON2 . PEN = 1 ;
54 }
55 void main () {
56 ANSELC = 0x0 ;
57 TRISB = 0x0 ; // Configure PORTB as output
58 TRISC = 0 b00000000 ; // Configure PORTC as output
59 PORTC = 0x0 ;
60 i2c_master_init ();
61 Delay_100ms ();
62
63 i2c_master_start ();
64 i2c_send_data ( 0x4E );
65 i2c_send_data ( 0x03 );
66 i2c_send_data ( 0x43 );
67 i2c_master_stop ();
68 Delay_10ms ();
69 //5ms
70 i2c_master_start ();
71 i2c_send_data ( 0x4E );
72 i2c_send_data ( 0x03 );
73 i2c_send_data ( 0x43 );
74 i2c_master_stop ();
75 Delay_100ms ();
76 //100us
77 i2c_master_start ();
78 i2c_send_data ( 0x4E );
79 i2c_send_data ( 0x03 );
80 i2c_send_data ( 0x43 );
81 i2c_master_stop ();
82 Delay_10ms ();
83 // ersten Init Befehle
84 i2c_master_start ();
85 i2c_send_data ( 0x4E );
86 i2c_send_data ( 0x02 );
87 i2c_send_data ( 0x42 );
88 i2c_master_stop ();
89 Delay_10ms ();
90 // zweiter Befehl
91 i2c_master_start ();
92 i2c_send_data ( 0x4E );
93 i2c_send_data ( 0x02 );
94 i2c_send_data ( 0x42 );
95 i2c_master_stop ();
96 Delay_10ms ();
97 // dritter Befehl
98 i2c_master_start ();
99 i2c_send_data ( 0x4E );
100 i2c_send_data ( 0x0C );
101 i2c_send_data ( 0x4C );
102 i2c_master_stop ();
103 Delay_10ms ();
104 // vierter Befehl
105 i2c_master_start ();
106 i2c_send_data ( 0x4E );
107 i2c_send_data ( 0x00 );
108 i2c_send_data ( 0x40 );
109 i2c_master_stop ();
110 Delay_10ms ();
111 // fuenfter Befehl
112 i2c_master_start ();
113 i2c_send_data ( 0x4E );
114 i2c_send_data ( 0x04 );
115 i2c_send_data ( 0x48 );
116 i2c_master_stop ();
117 Delay_10ms ();
118 // sechster Befehl
119 i2c_master_start ();
120 i2c_send_data ( 0x4E );
121 i2c_send_data ( 0x00 );
122 i2c_send_data ( 0x40 );
123 i2c_master_stop ();
124 Delay_10ms ();
125 // siebneter Befehl
126 i2c_master_start ();
127 i2c_send_data ( 0x4E );
128 i2c_send_data ( 0x01 );
129 i2c_send_data ( 0x41 );
130 i2c_master_stop ();
131 Delay_10ms ();
132 // achter Befehl
133 i2c_master_start ();
134 i2c_send_data ( 0x4E );
135 i2c_send_data ( 0x00 );
136 i2c_send_data ( 0x40 );
137 i2c_master_stop ();
138 Delay_10ms ();
139 // neunter Befehl
140 i2c_master_start ();
141 i2c_send_data ( 0x4E );
142 i2c_send_data ( 0x06 );
143 i2c_send_data ( 0x46 );
144 i2c_master_stop ();
145 Delay_10ms ();
146
147
148
149 i2c_master_start ();
150 i2c_send_data ( 0x4E );
151 i2c_send_data ( 0x00 );
152 i2c_send_data ( 0x40 );
153 i2c_master_stop ();
154 Delay_10ms ();
155
156 i2c_master_start ();
157 i2c_send_data ( 0x4E );
158 i2c_send_data ( 0x0E );
159 i2c_send_data ( 0x4E );
160 i2c_master_stop ();
161 Delay_10ms ();
162
163 i2c_master_start ();
164 i2c_send_data ( 0x4E );
165 i2c_send_data ( 0x00 );
166 i2c_send_data ( 0x40 );
167 i2c_master_stop ();
168 Delay_10ms ();
169
170 i2c_master_start ();
171 i2c_send_data ( 0x4E );
172 i2c_send_data ( 0x06 );
173 i2c_send_data ( 0x46 );
174 i2c_master_stop ();
175 Delay_10ms ();
176
177
178 //Start schreib ein H
179 i2c_master_start ();
180 i2c_send_data ( 0x4E );
181 i2c_send_data ( 0x14 );
182 i2c_send_data ( 0x54 );
183 i2c_master_stop ();
184 Delay_10ms ();
185
186 i2c_master_start ();
187 i2c_send_data ( 0x4E );
188 i2c_send_data ( 0x18 );
189 i2c_send_data ( 0x58 );
190 i2c_master_stop ();
191 Delay_10ms ();
von
Verzweifelt an PIC (Gast)
04.02.2018 21:00
Ich muss mich korrigieren, es erscheint schon, aber verschwindet sofort
wieder
Mach mal ein while(1); an das Ende von main()
04.02.2018 21:14 :
Bearbeitet durch User
Beitrag #5304219 wurde vom Autor gelöscht.
von
Verzweifelt an PIC (Gast)
04.02.2018 21:14
Hat leider nichts verändert. Das Zeichen leuchtet zirka 0,5s auf und ist
dann weg
Configuration-Bits, Watchdog?
von
Verzweifelt an PIC (Gast)
04.02.2018 21:22
Ich habe es herausgefunden. Wie es ausieht, muss man noch den Cursor um
eines weiterschieben, damit das Zeichen nicht verdeckt wird. Keine
Ahnung wieso, aber funktioniert. Dank für deine Hilfe
Das mit dem Cursor, kann man bei der Initialisierung einstellen (Entry
Mode)
Mach dir am besten mal ein paar #defines, oder kopier die aus
irgendeiner der unzähligen Bibliotheken, damit das alles ein wenig
leserlicher wird. 1 / Instruction Set defines ( HD44780 compatible )
2 // RS R/W | D7 D6 D5 D4 D3 D2 D1 D0
3 // Clear display 0 0 | 0 0 0 0 0 0 0 1
4 #define CLEAR_DISPLAY 0x01
5 // Return home 0 0 | 0 0 0 0 0 0 1 -
6 #define RETURN_HOME 0x02
7 // Entry mode set 0 0 | 0 0 0 0 0 1 I/D S
8 #define ENTRY_MODE 0x04
9 #define CURSOR_INC 0x02
10 #define CURSOR_DEC 0x00
11 #define DSHIFT_ON 0x01
12 #define DSHIFT_OFF 0x00
13 // Display ctrl 0 0 | 0 0 0 0 1 D C B
14 #define DISPLAY_CTRL 0x08
15 #define DISPLAY_ON 0x04
16 #define DISPLAY_OFF 0x00
17 #define CURSOR_ON 0x02
18 #define CURSOR_OFF 0x00
19 #define BLINK_ON 0x01
20 #define BLINK_OFF 0x00
21 ...
Das kann man dann so (ähnlich) verwenden: 1 LCD_Command ( DISPLAY_CTRL + DISPLAY_ON ); // + BLINK_ON);
2 LCD_Command ( ENTRY_MODE + CURSOR_INC + DSHIFT_OFF );
Wenn man Zeichen schreiben will, dann muss man im Code nicht den ASCII
code verwenden. Geht auch einfach so -> 'A' anstelle von 0x41.
Beim Schreiben auf Output-Pins nicht PORT verwenden, wenn der PIC LAT
Register hat.
04.02.2018 21:41 :
Bearbeitet durch User
von
Manfred (Gast)
04.02.2018 21:49
Verzweifelt an PIC schrieb im Beitrag #5304087:
> Die Adresse vom PCF ist fix verdrahtet auf 0x4E.
Ich melde Zweifel an!
http://www.ti.com/lit/ml/scyb031/scyb031.pdf
Manfred schrieb:
> Ich melde Zweifel an!
Begründung?
Nur eben rein interessehalber .... warum hast du RW angeschlossen ?
Willst du von dem Display zurücklesen (Statusbits, Daten-RAM) ?
Prinzipiell kannst du RW auch fix auf (ich meine GND) war es legen. Dann
hast du bei dem PCF noch 2 zusätzliche Leitungen frei.
Dann muss man nur bei bestimmten Befehlen (Display Löschen usw) einfach
eine längere Wartezeit einlegen.
Rene B. schrieb:
> Nur eben rein interessehalber .... warum hast du RW angeschlossen ?
Verzweifelt an PIC schrieb im Beitrag #5304087:
> Ich habe ein LCM015 -
> Display, welches einen eingebauten PCF8574 ...
-> Das LCM015 lässt einem einfach die Wahl, ob man auch lesend auf das
Display zugreifend möchte ;-)
04.02.2018 22:09 :
Bearbeitet durch User
Ah oki .. nix gesagt :-) Weitermachen :-)
von
Verzweifelt an PIC (Gast)
04.02.2018 22:33
Manfred schrieb:
> Verzweifelt an PIC schrieb im Beitrag #5304087:
>> Die Adresse vom PCF ist fix verdrahtet auf 0x4E.
> Ich melde Zweifel an!
>
> http://www.ti.com/lit/ml/scyb031/scyb031.pdf
? ich habe das Display nicht gefertigt
Nur mal eine Frage. Danke für den Cursor. Ich habe ein anderes Problem.
Irgendwie verwendet das Teil bei nach jeder Nutzung den Zeichensatz.
Also ich wollte mal BURG ausgeben. Dann BRGU aber dann ist BG&t
herausgekommen. Ich weiß nicht was ich falsch mache
von
Verzweifelt an PIC (Gast)
04.02.2018 22:36
> LCD_Command(ENTRY_MODE + CURSOR_INC + DSHIFT_OFF);
> Wenn man Zeichen schreiben will, dann muss man im Code nicht den ASCII
> code verwenden. Geht auch einfach so -> 'A' anstelle von 0x41.
>
> Beim Schreiben auf Output-Pins nicht PORT verwenden, wenn der PIC LAT
> Register hat.
Danke für den Tipp
Verzweifelt an PIC schrieb im Beitrag #5304318:
> Irgendwie verwendet das Teil bei nach jeder Nutzung den Zeichensatz.
verändert?
Verzweifelt an PIC schrieb im Beitrag #5304318:
> Also ich wollte mal BURG ausgeben. Dann BRGU aber dann ist BG&t
> herausgekommen.
Kannst du das noch mal neu formulieren?
von
Verzweifelt an PIC (Gast)
04.02.2018 22:44
Ja natürlich. Also wenn ich BURG ausgeben will => Display schreibt BURG
hin.
Wenn ich Burgl ausgeben will, dann kommt als Ausgabe BurgLf
von
Verzweifelt an PIC (Gast)
04.02.2018 22:47
Also ich habe den Fehler herausgefunden. Man muss dem PCF nach jedem
neuen Zeichen ein 0x0 senden, sonst hat der irgendwie Probleme.
von
Verzweifelt an PIC (Gast)
04.02.2018 22:59
Für dich Volker, auch wenn du es höchstwahrscheinlich nicht brauchst.
1 void i2c_master_init (){
2 SSP1CON1 . SSPEN = 0 ;
3 SSP1STAT . SMP = 0 ;
4 SSP1STAT . CKE = 0 ;
5 SSP1CON1 = 0x0 ;
6 SSP1CON1 . WCOL = 0 ;
7 SSP1CON1 . SSPOV = 0 ;
8 // SSPEN NOCH EINSCHALTEN
9 SSP1ADD = 0x9 ;
10 SSP1CON1 . SSPM0 = 0 ;
11 SSP1CON1 . SSPM1 = 0 ;
12 SSP1CON1 . SSPM2 = 0 ;
13 SSP1CON1 . SSPM3 = 1 ;
14 SSP1CON2 = 0x0 ;
15 SSP1CON2 . RCEN = 0 ;
16 // PEN (STOP Condition setzen)
17 // RSEN (Repeat START Condition setzen)
18 // SEN(START Condition setzen)
19
20 SSP1CON3 = 0x9 ;
21 SSP1CON3 . PCIE = 0 ;
22 SSP1CON3 . SCIE = 0 ;
23 SSP1CON3 . SDAHT = 1 ;
24 SSPMSK = 0x0 ;
25 SSP1BUF = 0x00 ;
26 TRISB = 0xff ;
27 SSP1CON1 . SSPEN = 1 ;
28 }
29 void i2c_master_start (){
30 SSP1CON2 . SEN = 1 ;
31 //while(SSP1CON2.ACKEN == 0){}
32 }
33 void i2c_send_data ( unsigned short data_ ){
34 PORTC . RC0 = 1 ;
35 PORTC . RC4 = SSP1CON2 . ACKSTAT ;
36 SSP1BUF = data_ ; //Adressierung
37 while ( SSP1STAT . BF == 1 ); //Warten bis der Buffer leer ist
38 PORTC = 0 b00001011 ;
39 Delay_10us ();
40 Delay_10us ();
41 Delay_10us ();
42 Delay_10us ();
43 Delay_10us ();
44 Delay_10us ();
45 Delay_10us ();
46 Delay_10us ();
47 Delay_10us ();
48 Delay_10us ();
49 Delay_10us ();
50 }
51 void i2c_master_stop (){
52 Delay_10us ();
53 SSP1CON2 . PEN = 1 ;
54 }
55 void cursor_shift (){
56 i2c_master_start ();
57 i2c_send_data ( 0x4E );
58 i2c_send_data ( 0x00 );
59 i2c_send_data ( 0x40 );
60 i2c_master_stop ();
61 Delay_10ms ();
62
63 i2c_master_start ();
64 i2c_send_data ( 0x4E );
65 i2c_send_data ( 0x04 );
66 i2c_send_data ( 0x44 );
67 i2c_master_stop ();
68 Delay_10ms ();
69 }
70 void init_lcd_master (){
71 i2c_master_start ();
72 i2c_send_data ( 0x4E );
73 i2c_send_data ( 0x03 );
74 i2c_send_data ( 0x43 );
75 i2c_master_stop ();
76 Delay_10ms ();
77 //5ms
78 i2c_master_start ();
79 i2c_send_data ( 0x4E );
80 i2c_send_data ( 0x03 );
81 i2c_send_data ( 0x43 );
82 i2c_master_stop ();
83 Delay_100ms ();
84 //100us
85 i2c_master_start ();
86 i2c_send_data ( 0x4E );
87 i2c_send_data ( 0x03 );
88 i2c_send_data ( 0x43 );
89 i2c_master_stop ();
90 Delay_10ms ();
91 // ersten Init Befehle
92 i2c_master_start ();
93 i2c_send_data ( 0x4E );
94 i2c_send_data ( 0x02 );
95 i2c_send_data ( 0x42 );
96 i2c_master_stop ();
97 Delay_10ms ();
98 // zweiter Befehl
99 i2c_master_start ();
100 i2c_send_data ( 0x4E );
101 i2c_send_data ( 0x02 );
102 i2c_send_data ( 0x42 );
103 i2c_master_stop ();
104 Delay_10ms ();
105 // dritter Befehl
106 i2c_master_start ();
107 i2c_send_data ( 0x4E );
108 i2c_send_data ( 0x04 );
109 i2c_send_data ( 0x44 );
110 i2c_master_stop ();
111 Delay_10ms ();
112 // vierter Befehl
113 i2c_master_start ();
114 i2c_send_data ( 0x4E );
115 i2c_send_data ( 0x00 );
116 i2c_send_data ( 0x40 );
117 i2c_master_stop ();
118 Delay_10ms ();
119 // fuenfter Befehl
120 i2c_master_start ();
121 i2c_send_data ( 0x4E );
122 i2c_send_data ( 0x04 );
123 i2c_send_data ( 0x48 );
124 i2c_master_stop ();
125 Delay_10ms ();
126 // sechster Befehl
127 i2c_master_start ();
128 i2c_send_data ( 0x4E );
129 i2c_send_data ( 0x00 );
130 i2c_send_data ( 0x40 );
131 i2c_master_stop ();
132 Delay_10ms ();
133 // siebneter Befehl
134 i2c_master_start ();
135 i2c_send_data ( 0x4E );
136 i2c_send_data ( 0x01 );
137 i2c_send_data ( 0x41 );
138 i2c_master_stop ();
139 Delay_10ms ();
140 // achter Befehl
141 i2c_master_start ();
142 i2c_send_data ( 0x4E );
143 i2c_send_data ( 0x00 );
144 i2c_send_data ( 0x40 );
145 i2c_master_stop ();
146 Delay_10ms ();
147 // neunter Befehl
148 i2c_master_start ();
149 i2c_send_data ( 0x4E );
150 i2c_send_data ( 0x06 );
151 i2c_send_data ( 0x46 );
152 i2c_master_stop ();
153 Delay_10ms ();
154
155
156 i2c_master_start ();
157 i2c_send_data ( 0x4E );
158 i2c_send_data ( 0x00 );
159 i2c_send_data ( 0x40 );
160 i2c_master_stop ();
161 Delay_10ms ();
162
163 i2c_master_start ();
164 i2c_send_data ( 0x4E ); //Display an/aus
165 i2c_send_data ( 0x0E );
166 i2c_send_data ( 0x4E );
167 i2c_master_stop ();
168 Delay_10ms ();
169
170 i2c_master_start ();
171 i2c_send_data ( 0x4E );
172 i2c_send_data ( 0x00 );
173 i2c_send_data ( 0x40 );
174 i2c_master_stop ();
175 Delay_10ms ();
176
177 i2c_master_start (); //Entry mode
178 i2c_send_data ( 0x4E );
179 i2c_send_data ( 0x06 );
180 i2c_send_data ( 0x46 );
181 i2c_master_stop ();
182 Delay_10ms ();
183 }
184 void pcf_reset (){
185 i2c_master_start ();
186 i2c_send_data ( 0x4E );
187 i2c_send_data ( 0x0 );
188 i2c_master_stop ();
189 Delay_10ms ();
190 }
191 void main () {
192 ANSELC = 0x0 ;
193 TRISB = 0x0 ; // Configure PORTB as output
194 TRISC = 0 b00000000 ; // Configure PORTC as output
195 PORTC = 0x0 ;
196 i2c_master_init ();
197 Delay_100ms ();
198 init_lcd_master ();
199
200 //Schreibe B
201 i2c_master_start ();
202 i2c_send_data ( 0x4E );
203 i2c_send_data ( 0x14 );
204 i2c_send_data ( 0x54 );
205 i2c_master_stop ();
206 Delay_10ms ();
207
208 i2c_master_start ();
209 i2c_send_data ( 0x4E );
210 i2c_send_data ( 0x12 );
211 i2c_send_data ( 0x52 );
212 i2c_master_stop ();
213 Delay_10ms ();
214 pcf_reset ();
215 //Schreibe u
216 i2c_master_start ();
217 i2c_send_data ( 0x4E );
218 i2c_send_data ( 0x17 );
219 i2c_send_data ( 0x57 );
220 i2c_master_stop ();
221 Delay_10ms ();
222
223 i2c_master_start ();
224 i2c_send_data ( 0x4E );
225 i2c_send_data ( 0x15 );
226 i2c_send_data ( 0x55 );
227 i2c_master_stop ();
228 Delay_10ms ();
229 pcf_reset ();
230 //Schreibe r
231 i2c_master_start ();
232 i2c_send_data ( 0x4E );
233 i2c_send_data ( 0x17 );
234 i2c_send_data ( 0x57 );
235 i2c_master_stop ();
236 Delay_10ms ();
237
238 i2c_master_start ();
239 i2c_send_data ( 0x4E );
240 i2c_send_data ( 0x12 );
241 i2c_send_data ( 0x52 );
242 i2c_master_stop ();
243 Delay_10ms ();
244 pcf_reset ();
245 //Schreibe g
246 i2c_master_start ();
247 i2c_send_data ( 0x4E );
248 i2c_send_data ( 0x16 );
249 i2c_send_data ( 0x56 );
250 i2c_master_stop ();
251 Delay_10ms ();
252
253 i2c_master_start ();
254 i2c_send_data ( 0x4E );
255 i2c_send_data ( 0x17 );
256 i2c_send_data ( 0x57 );
257 i2c_master_stop ();
258 Delay_10ms ();
259 pcf_reset ();
260
261 //Schreibe l
262 i2c_master_start ();
263 i2c_send_data ( 0x4E );
264 i2c_send_data ( 0x16 );
265 i2c_send_data ( 0x56 );
266 i2c_master_stop ();
267 Delay_10ms ();
268
269 i2c_master_start ();
270 i2c_send_data ( 0x4E );
271 i2c_send_data ( 0x1C );
272 i2c_send_data ( 0x5C );
273 i2c_master_stop ();
274 Delay_10ms ();
275 pcf_reset ();
276 cursor_shift ();
277
278 /* while(1){
279 PORTC = 0xFF;
280 I2C1_Init(1000000); // initialize I2C communication
281 I2C1_Start(); // issue I2C start signal
282 I2C1_Wr(0x4E); // send byte via I2C (device address + W
283 I2C1_Wr(0xAA); // send data (data to be written)
284 I2C1_Stop(); // issue I2C stop signal
285 Delay_100ms();
286 }
287 */
288 }
von
Verzweifelt an PIC (Gast)
05.02.2018 16:02
Ich habe eine weitere Frage. Ich kann jetzt zwar problemlos etwas auf
das Display schreiben, aber ich finde nicht die Adresse für die zweite
Reihe im Display.
Laut einem Versuch:
The display has 2 rows of 10 dot matrix characters (5x7 font), and from
left to right along the bottom edge, a dot O, 5 indicator arrows Ñ and a
3 segment battery indicator mapped as segments in characters 11 and 12
of the first row.
Jetzt ist die Frage, wie bekomme ich die zweite Adresse für die zweite
Reihe vom Display?
05.02.2018 16:22 :
Bearbeitet durch User
von
Verzweifelt an PIC (Gast)
05.02.2018 16:24
Leider nicht. Das habe ich als erstes ausprobiert, aber das Display
schreibt nichts. Es leuchten nur die Sonderzeichen unten auf(und die
Zeichen in der ersten Reihe). Wenn ich mein Programm ausprobiere, dann
leuchten die Zeichen unten kurz auf und dann steht das gleiche wie
vorher drinnen.
1 void i2c_master_init (){
2 SSP1CON1 . SSPEN = 0 ;
3 SSP1STAT . SMP = 0 ;
4 SSP1STAT . CKE = 0 ;
5 SSP1CON1 = 0x0 ;
6 SSP1CON1 . WCOL = 0 ;
7 SSP1CON1 . SSPOV = 0 ;
8 // SSPEN NOCH EINSCHALTEN
9 SSP1ADD = 0x9 ;
10 SSP1CON1 . SSPM0 = 0 ;
11 SSP1CON1 . SSPM1 = 0 ;
12 SSP1CON1 . SSPM2 = 0 ;
13 SSP1CON1 . SSPM3 = 1 ;
14 SSP1CON2 = 0x0 ;
15 SSP1CON2 . RCEN = 0 ;
16 // PEN (STOP Condition setzen)
17 // RSEN (Repeat START Condition setzen)
18 // SEN(START Condition setzen)
19
20 SSP1CON3 = 0x9 ;
21 SSP1CON3 . PCIE = 0 ;
22 SSP1CON3 . SCIE = 0 ;
23 SSP1CON3 . SDAHT = 1 ;
24 SSPMSK = 0x0 ;
25 SSP1BUF = 0x00 ;
26 TRISB = 0xff ;
27 SSP1CON1 . SSPEN = 1 ;
28 }
29 void i2c_master_start (){
30 SSP1CON2 . SEN = 1 ;
31 //while(SSP1CON2.ACKEN == 0){}
32 }
33 void i2c_send_data ( unsigned short data_ ){
34 PORTC . RC0 = 1 ;
35 PORTC . RC4 = SSP1CON2 . ACKSTAT ;
36 SSP1BUF = data_ ; //Adressierung
37 while ( SSP1STAT . BF == 1 ); //Warten bis der Buffer leer ist
38 PORTC = 0 b00001011 ;
39 Delay_10us ();
40 Delay_10us ();
41 Delay_10us ();
42 Delay_10us ();
43 Delay_10us ();
44 Delay_10us ();
45 Delay_10us ();
46 Delay_10us ();
47 Delay_10us ();
48 Delay_10us ();
49 Delay_10us ();
50 }
51 void i2c_master_stop (){
52 Delay_10us ();
53 SSP1CON2 . PEN = 1 ;
54 }
55 void cursor_shift (){
56 i2c_master_start ();
57 i2c_send_data ( 0x4E );
58 i2c_send_data ( 0x00 );
59 i2c_send_data ( 0x40 );
60 i2c_master_stop ();
61 Delay_10ms ();
62
63 i2c_master_start ();
64 i2c_send_data ( 0x4E );
65 i2c_send_data ( 0x04 );
66 i2c_send_data ( 0x44 );
67 i2c_master_stop ();
68 Delay_10ms ();
69 }
70 void init_lcd_master (){
71 i2c_master_start ();
72 i2c_send_data ( 0x4E );
73 i2c_send_data ( 0x03 );
74 i2c_send_data ( 0x43 );
75 i2c_master_stop ();
76 Delay_10ms ();
77 //5ms
78 i2c_master_start ();
79 i2c_send_data ( 0x4E );
80 i2c_send_data ( 0x03 );
81 i2c_send_data ( 0x43 );
82 i2c_master_stop ();
83 Delay_100ms ();
84 //100us
85 i2c_master_start ();
86 i2c_send_data ( 0x4E );
87 i2c_send_data ( 0x03 );
88 i2c_send_data ( 0x43 );
89 i2c_master_stop ();
90 Delay_10ms ();
91 // ersten Init Befehle
92 i2c_master_start ();
93 i2c_send_data ( 0x4E );
94 i2c_send_data ( 0x02 );
95 i2c_send_data ( 0x42 );
96 i2c_master_stop ();
97 Delay_10ms ();
98 // zweiter Befehl
99 i2c_master_start ();
100 i2c_send_data ( 0x4E );
101 i2c_send_data ( 0x02 );
102 i2c_send_data ( 0x42 );
103 i2c_master_stop ();
104 Delay_10ms ();
105 // dritter Befehl
106 i2c_master_start ();
107 i2c_send_data ( 0x4E );
108 i2c_send_data ( 0x04 );
109 i2c_send_data ( 0x44 );
110 i2c_master_stop ();
111 Delay_10ms ();
112 // vierter Befehl
113 i2c_master_start ();
114 i2c_send_data ( 0x4E );
115 i2c_send_data ( 0x00 );
116 i2c_send_data ( 0x40 );
117 i2c_master_stop ();
118 Delay_10ms ();
119 // fuenfter Befehl
120 i2c_master_start ();
121 i2c_send_data ( 0x4E );
122 i2c_send_data ( 0x04 );
123 i2c_send_data ( 0x48 );
124 i2c_master_stop ();
125 Delay_10ms ();
126 // sechster Befehl
127 i2c_master_start ();
128 i2c_send_data ( 0x4E );
129 i2c_send_data ( 0x00 );
130 i2c_send_data ( 0x40 );
131 i2c_master_stop ();
132 Delay_10ms ();
133 // siebneter Befehl
134 i2c_master_start ();
135 i2c_send_data ( 0x4E );
136 i2c_send_data ( 0x01 );
137 i2c_send_data ( 0x41 );
138 i2c_master_stop ();
139 Delay_10ms ();
140 // achter Befehl
141 i2c_master_start ();
142 i2c_send_data ( 0x4E );
143 i2c_send_data ( 0x00 );
144 i2c_send_data ( 0x40 );
145 i2c_master_stop ();
146 Delay_10ms ();
147 // neunter Befehl
148 i2c_master_start ();
149 i2c_send_data ( 0x4E );
150 i2c_send_data ( 0x06 );
151 i2c_send_data ( 0x46 );
152 i2c_master_stop ();
153 Delay_10ms ();
154
155
156 i2c_master_start ();
157 i2c_send_data ( 0x4E );
158 i2c_send_data ( 0x00 );
159 i2c_send_data ( 0x40 );
160 i2c_master_stop ();
161 Delay_10ms ();
162
163 i2c_master_start ();
164 i2c_send_data ( 0x4E ); //Display an/aus
165 i2c_send_data ( 0x0E );
166 i2c_send_data ( 0x4E );
167 i2c_master_stop ();
168 Delay_10ms ();
169
170 i2c_master_start ();
171 i2c_send_data ( 0x4E );
172 i2c_send_data ( 0x00 );
173 i2c_send_data ( 0x40 );
174 i2c_master_stop ();
175 Delay_10ms ();
176
177 i2c_master_start (); //Entry mode
178 i2c_send_data ( 0x4E );
179 i2c_send_data ( 0x06 );
180 i2c_send_data ( 0x46 );
181 i2c_master_stop ();
182 Delay_10ms ();
183 }
184 void pcf_reset (){
185 i2c_master_start ();
186 i2c_send_data ( 0x4E );
187 i2c_send_data ( 0x0 );
188 i2c_master_stop ();
189 Delay_10ms ();
190 }
191 void display_search_variable ( unsigned short data1_ue , unsigned short data1_e , unsigned short data2_ue , unsigned short data2_e , unsigned short adress_ ){
192 i2c_master_start ();
193 i2c_send_data ( adress_ );
194 i2c_send_data ( data1_ue );
195 i2c_send_data ( data1_e );
196 i2c_master_stop ();
197 Delay_10ms ();
198
199 i2c_master_start ();
200 i2c_send_data ( adress_ );
201 i2c_send_data ( data2_ue );
202 i2c_send_data ( data2_e );
203 i2c_master_stop ();
204 Delay_10ms ();
205 pcf_reset ();
206 }
207 void write_display_master_char ( char A ){
208 switch ( A ){
209 /*case ' ': display_search_variable(0x12,0x52,0x10,0x50,0x4E); break;
210 case '!': display_search_variable(0x12,0x52,0x11,0x51,0x4E); break;
211 case '"': display_search_variable(0x12,0x52,0x12,0x52,0x4E); break;
212 case '#': display_search_variable(0x12,0x52,0x13,0x53,0x4E); break;
213 case '$': display_search_variable(0x12,0x52,0x14,0x54,0x4E); break;
214 case '%': display_search_variable(0x12,0x52,0x15,0x55,0x4E); break;
215 case '&': display_search_variable(0x12,0x52,0x16,0x56,0x4E); break;
216 case '´': display_search_variable(0x12,0x52,0x17,0x57,0x4E); break;
217 case '(': display_search_variable(0x12,0x52,0x18,0x58,0x4E); break;
218 case ')': display_search_variable(0x12,0x52,0x19,0x59,0x4E); break;
219 case '*': display_search_variable(0x12,0x52,0x1A,0x5A,0x4E); break;
220 case '+': display_search_variable(0x12,0x52,0x1B,0x5B,0x4E); break;
221 case ',': display_search_variable(0x12,0x52,0x1C,0x5C,0x4E); break;
222 case '-': display_search_variable(0x12,0x52,0x1D,0x5D,0x4E); break;
223 case '/': display_search_variable(0x12,0x52,0x1E,0x5E,0x4E); break; */
224 case '.' : display_search_variable ( 0x12 , 0x52 , 0x1E , 0x5E , 0x4E ); break ;
225
226 case '0' : display_search_variable ( 0x13 , 0x53 , 0x10 , 0x50 , 0x4E ); break ;
227 case '1' : display_search_variable ( 0x13 , 0x53 , 0x11 , 0x51 , 0x4E ); break ;
228 case '2' : display_search_variable ( 0x13 , 0x53 , 0x12 , 0x52 , 0x4E ); break ;
229 case '3' : display_search_variable ( 0x13 , 0x53 , 0x13 , 0x53 , 0x4E ); break ;
230 case '4' : display_search_variable ( 0x13 , 0x53 , 0x14 , 0x54 , 0x4E ); break ;
231 case '5' : display_search_variable ( 0x13 , 0x53 , 0x15 , 0x55 , 0x4E ); break ;
232 case '6' : display_search_variable ( 0x13 , 0x53 , 0x16 , 0x56 , 0x4E ); break ;
233 case '7' : display_search_variable ( 0x13 , 0x53 , 0x17 , 0x57 , 0x4E ); break ;
234 case '8' : display_search_variable ( 0x13 , 0x53 , 0x18 , 0x58 , 0x4E ); break ;
235 case '9' : display_search_variable ( 0x13 , 0x53 , 0x19 , 0x59 , 0x4E ); break ;
236 case ':' : display_search_variable ( 0x13 , 0x53 , 0x1A , 0x5A , 0x4E ); break ;
237 case ';' : display_search_variable ( 0x13 , 0x53 , 0x1B , 0x5B , 0x4E ); break ;
238 case '<' : display_search_variable ( 0x13 , 0x53 , 0x1C , 0x5C , 0x4E ); break ;
239 case '=' : display_search_variable ( 0x13 , 0x53 , 0x1D , 0x5D , 0x4E ); break ;
240 case '>' : display_search_variable ( 0x13 , 0x53 , 0x1E , 0x5E , 0x4E ); break ;
241 case '?' : display_search_variable ( 0x13 , 0x53 , 0x1E , 0x5E , 0x4E ); break ;
242
243 case 'A' : display_search_variable ( 0x14 , 0x54 , 0x11 , 0x51 , 0x4E ); break ;
244 case 'B' : display_search_variable ( 0x14 , 0x54 , 0x12 , 0x52 , 0x4E ); break ;
245 case 'C' : display_search_variable ( 0x14 , 0x54 , 0x13 , 0x53 , 0x4E ); break ;
246 case 'D' : display_search_variable ( 0x14 , 0x54 , 0x14 , 0x54 , 0x4E ); break ;
247 case 'E' : display_search_variable ( 0x14 , 0x54 , 0x15 , 0x55 , 0x4E ); break ;
248 case 'F' : display_search_variable ( 0x14 , 0x54 , 0x16 , 0x56 , 0x4E ); break ;
249 case 'G' : display_search_variable ( 0x14 , 0x54 , 0x17 , 0x57 , 0x4E ); break ;
250 case 'H' : display_search_variable ( 0x14 , 0x54 , 0x18 , 0x58 , 0x4E ); break ;
251 case 'I' : display_search_variable ( 0x14 , 0x54 , 0x19 , 0x59 , 0x4E ); break ;
252 case 'J' : display_search_variable ( 0x14 , 0x54 , 0x1A , 0x5A , 0x4E ); break ;
253 case 'K' : display_search_variable ( 0x14 , 0x54 , 0x1B , 0x5B , 0x4E ); break ;
254 case 'L' : display_search_variable ( 0x14 , 0x54 , 0x1C , 0x5C , 0x4E ); break ;
255 case 'M' : display_search_variable ( 0x14 , 0x54 , 0x1D , 0x5D , 0x4E ); break ;
256 case 'N' : display_search_variable ( 0x14 , 0x54 , 0x1E , 0x5E , 0x4E ); break ;
257 case 'O' : display_search_variable ( 0x14 , 0x54 , 0x1F , 0x5F , 0x4E ); break ;
258
259 case 'P' : display_search_variable ( 0x15 , 0x55 , 0x10 , 0x50 , 0x4E ); break ;
260 case 'Q' : display_search_variable ( 0x15 , 0x55 , 0x11 , 0x51 , 0x4E ); break ;
261 case 'R' : display_search_variable ( 0x15 , 0x55 , 0x12 , 0x52 , 0x4E ); break ;
262 case 'S' : display_search_variable ( 0x15 , 0x55 , 0x13 , 0x53 , 0x4E ); break ;
263 case 'T' : display_search_variable ( 0x15 , 0x55 , 0x14 , 0x54 , 0x4E ); break ;
264 case 'U' : display_search_variable ( 0x15 , 0x55 , 0x15 , 0x55 , 0x4E ); break ;
265 case 'V' : display_search_variable ( 0x15 , 0x55 , 0x16 , 0x56 , 0x4E ); break ;
266 case 'W' : display_search_variable ( 0x15 , 0x55 , 0x17 , 0x57 , 0x4E ); break ;
267 case 'X' : display_search_variable ( 0x15 , 0x55 , 0x18 , 0x58 , 0x4E ); break ;
268 case 'Y' : display_search_variable ( 0x15 , 0x55 , 0x19 , 0x59 , 0x4E ); break ;
269 case 'Z' : display_search_variable ( 0x15 , 0x55 , 0x1A , 0x5A , 0x4E ); break ;
270 case '[' : display_search_variable ( 0x15 , 0x55 , 0x1B , 0x5B , 0x4E ); break ;
271 case '¥' : display_search_variable ( 0x15 , 0x55 , 0x1C , 0x5C , 0x4E ); break ;
272 case ']' : display_search_variable ( 0x15 , 0x55 , 0x1D , 0x5D , 0x4E ); break ;
273 case '^' : display_search_variable ( 0x15 , 0x55 , 0x1E , 0x5E , 0x4E ); break ;
274 case '_' : display_search_variable ( 0x15 , 0x55 , 0x1E , 0x5E , 0x4E ); break ;
275
276 case '`' : display_search_variable ( 0x16 , 0x56 , 0x10 , 0x50 , 0x4E ); break ;
277 case 'a' : display_search_variable ( 0x16 , 0x56 , 0x11 , 0x51 , 0x4E ); break ;
278 case 'b' : display_search_variable ( 0x16 , 0x56 , 0x12 , 0x52 , 0x4E ); break ;
279 case 'c' : display_search_variable ( 0x16 , 0x56 , 0x13 , 0x53 , 0x4E ); break ;
280 case 'd' : display_search_variable ( 0x16 , 0x56 , 0x14 , 0x54 , 0x4E ); break ;
281 case 'e' : display_search_variable ( 0x16 , 0x56 , 0x15 , 0x55 , 0x4E ); break ;
282 case 'f' : display_search_variable ( 0x16 , 0x56 , 0x16 , 0x56 , 0x4E ); break ;
283 case 'g' : display_search_variable ( 0x16 , 0x56 , 0x17 , 0x57 , 0x4E ); break ;
284 case 'h' : display_search_variable ( 0x16 , 0x56 , 0x18 , 0x58 , 0x4E ); break ;
285 case 'i' : display_search_variable ( 0x16 , 0x56 , 0x19 , 0x59 , 0x4E ); break ;
286 case 'j' : display_search_variable ( 0x16 , 0x56 , 0x1A , 0x5A , 0x4E ); break ;
287 case 'k' : display_search_variable ( 0x16 , 0x56 , 0x1B , 0x5B , 0x4E ); break ;
288 case 'l' : display_search_variable ( 0x16 , 0x56 , 0x1C , 0x5C , 0x4E ); break ;
289 case 'm' : display_search_variable ( 0x16 , 0x56 , 0x1D , 0x5D , 0x4E ); break ;
290 case 'n' : display_search_variable ( 0x16 , 0x56 , 0x1E , 0x5E , 0x4E ); break ;
291 case 'o' : display_search_variable ( 0x16 , 0x56 , 0x1E , 0x5E , 0x4E ); break ;
292
293 case 'p' : display_search_variable ( 0x17 , 0x57 , 0x10 , 0x50 , 0x4E ); break ;
294 case 'q' : display_search_variable ( 0x17 , 0x57 , 0x11 , 0x51 , 0x4E ); break ;
295 case 'r' : display_search_variable ( 0x17 , 0x57 , 0x12 , 0x52 , 0x4E ); break ;
296 case 's' : display_search_variable ( 0x17 , 0x57 , 0x13 , 0x53 , 0x4E ); break ;
297 case 't' : display_search_variable ( 0x17 , 0x57 , 0x14 , 0x54 , 0x4E ); break ;
298 case 'u' : display_search_variable ( 0x17 , 0x57 , 0x15 , 0x55 , 0x4E ); break ;
299 case 'v' : display_search_variable ( 0x17 , 0x57 , 0x16 , 0x56 , 0x4E ); break ;
300 case 'w' : display_search_variable ( 0x17 , 0x57 , 0x17 , 0x57 , 0x4E ); break ;
301 case 'x' : display_search_variable ( 0x17 , 0x57 , 0x18 , 0x58 , 0x4E ); break ;
302 case 'y' : display_search_variable ( 0x17 , 0x57 , 0x19 , 0x59 , 0x4E ); break ;
303 case 'z' : display_search_variable ( 0x17 , 0x57 , 0x1A , 0x5A , 0x4E ); break ;
304 case '{' : display_search_variable ( 0x17 , 0x57 , 0x1B , 0x5B , 0x4E ); break ;
305 case '|' : display_search_variable ( 0x17 , 0x57 , 0x1C , 0x5C , 0x4E ); break ;
306 case '}' : display_search_variable ( 0x17 , 0x57 , 0x1D , 0x5D , 0x4E ); break ;
307 default: break ;
308 }
309 }
310 void clear_display (){
311 display_search_variable ( 0x00 , 0x40 , 0x01 , 0x41 , 0x4E );
312 }
313 void return_home (){
314 display_search_variable ( 0x00 , 0x40 , 0x02 , 0x42 , 0x4E );
315 }
316 void main () {
317 char A = '1' ;
318 ANSELC = 0x0 ;
319 TRISB = 0x0 ; // Configure PORTB as output
320 TRISC = 0 b00000000 ; // Configure PORTC as output
321 PORTC = 0x0 ;
322 i2c_master_init ();
323 Delay_100ms ();
324 init_lcd_master ();
325 write_display_master_char ( 'f' );
326 write_display_master_char ( '=' );
327 write_display_master_char ( '8' );
328 write_display_master_char ( '0' );
329 write_display_master_char ( '.' );
330 write_display_master_char ( '8' );
331 write_display_master_char ( '6' );
332 write_display_master_char ( '3' );
333 write_display_master_char ( '2' );
334 display_search_variable ( 0x0C , 0x4C , 0x00 , 0x40 , 0x4E ); //setze die Adresse auf 0x40
335 write_display_master_char ( 'l' );
336 write_display_master_char ( 'l' );
337 write_display_master_char ( 'l' );
338 write_display_master_char ( 'l' );
339 write_display_master_char ( 'l' );
340 }
von
Verzweifelt an PIC (Gast)
05.02.2018 16:28
Volker S. schrieb:
> Die zweite Zeile beginnt vermutlich bei 0x40.
>
> <edit> bestätigt... http://www.microchip.com/forums/FindPost/629817
> <edit2> siehe auch: http://sprut.de/electronic/lcd/index.htm#adressen
Aso ok, wieso läuft das bei mir nicht? Ich hab ja die richtige Adresse
gschickt
von
Verzweifelt an PIC (Gast)
05.02.2018 16:32
Ich sende ja: NC E RW RS DB7 DB6 DB5 DB4
0 0 0 0 1 1 0 0 0X0C
0 1 0 0 1 1 0 0 0X4C
NC E RW RS DB7 DB6 DB5 DB4
0 0 0 0 0 0 0 0 0X00
0 1 0 0 0 0 0 0 0X40
Verzweifelt an PIC schrieb im Beitrag #5305061:
> display_search_variable(0x0C,0x4C,0x00,0x40,0x4E); //setze die
> Adresse auf 0x40
Keine Ahnung was du da treibst, dein Code ist sehr unleserlich...
von
Verzweifelt an PIC (Gast)
05.02.2018 16:38
Entschuldige, ich bin da etwas ungeübt. Ich sende diese Daten:
NC E RW RS DB7 DB6 DB5 DB4
0 0 0 0 1 1 0 0 0X0C Höheren Vier Datenbyte
0 1 0 0 1 1 0 0 0X4C
NC E RW RS DB7 DB6 DB5 DB4
0 0 0 0 0 0 0 0 0X00 Niedrigen Vier Datenbyte
0 1 0 0 0 0 0 0 0X40
Schreib doch mal Anfang mal nicht bei Null los, sondern z.B. bei 5.
Also versuch den Cursor zuerst mal in der ersten Zeile zu setzten.
Dein Strobe (Enable) funktioniert so möglicherweise auch nicht.
Ich mach das immer so:
1. RS, RW und Daten anlegen
2. Enable high
3. Enable low
Sprut schreibt dazu auch:
Im Moment der Low-High-Flanke von ENABLE liest das Dislplay die Werte
von RS und R/W ein. Ist zu diesem Zeitpunkt R/W=0, dann liest das
Display mit der folgenden High-Low-Flanke von ENABLE den Datenbus ein
(Schreibzyklus). War aber R/W=1, dann legt das Display ein Datenword auf
den Datenbus (Lese-Zyklus), solange bis die High-Low-Flanke von ENABLE
das Interface wieder deaktiviert
von
Verzweifelt an PIC (Gast)
05.02.2018 16:52
Das funktioniert problemlos. Jetzt schreibt er auch diese ganzen
Sonderzeichen aus => also das DOT die Pfeile und die Batterieanzeige
von
Verzweifelt an PIC (Gast)
05.02.2018 16:56
Volker S. schrieb:
> Dein Strobe (Enable) funktioniert so möglicherweise auch nicht.
> Ich mach das immer so:
> 1. RS, RW und Daten anlegen
> 2. Enable high
> 3. Enable low
habe ich dann auch gemacht mit diesem pcf_reset. Da hast du recht, wenn
man es nicht so macht, dann passierten eigenartige Dinge.
P.S: Wieso kann man nicht seinen Beitrag ändern?
Verzweifelt an PIC schrieb im Beitrag #5305102:
> P.S: Wieso kann man nicht seinen Beitrag ändern?
Kann man, wenn man angemeldet ist.
Verzweifelt an PIC schrieb im Beitrag #5305102:
> habe ich dann auch gemacht mit diesem pcf_reset.
Das musst du ja jedes mal machen:
Ich sende ja: NC E RW RS DB7 DB6 DB5 DB4
0 0 0 0 1 1 0 0 0X0C
0 1 0 0 1 1 0 0 0X4C
-> 0 0 0 0 1 1 0 0 0X0C
NC E RW RS DB7 DB6 DB5 DB4
0 0 0 0 0 0 0 0 0X00
0 1 0 0 0 0 0 0 0X40
-> 0 0 0 0 0 0 0 0 0X00
Bevor du weiter machst, räum doch mal deine Funktion zum Schreiben auf.
Übergib nur das, was geschrieben werden soll und mach den Rest intern.
Mach am besten zwei Funktionen, für Kommandos und Daten (Zeichen).
von
Verzweifelt an PIC (Gast)
05.02.2018 17:11
> Bevor du weiter machst, räum doch mal deine Funktion zum Schreiben auf.
> Übergib nur das, was geschrieben werden soll und mach den Rest intern.
>
> Mach am besten zwei Funktionen, für Kommandos und Daten (Zeichen).
Danke ich schreib das Programm um. Ich verzichte darweil auf die zweite
Reihe, weil ich muss noch einige andere Sachen programmieren. Auf jeden
Fall, DANKE Volker
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.