Forum: Mikrocontroller und Digitale Elektronik I2C Display läuft nicht


von Verzweifelt an PIC (Gast)


Lesenswert?

Hallo,

ich habe ein Problem mit meinem PIC16F1829. 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 = 0b00000001;
35
      SSP1BUF = data_;           //Adressierung
36
      while(SSP1STAT.BF == 1);  //Warten bis der Buffer leer ist
37
      PORTC = 0b00000011;
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 = 0b00000000;        // 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) Benutzerseite


Lesenswert?

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)


Lesenswert?

Digitales Oszi TDS2012 Tektronikx 2 Kanal 1GS/s 100Mhz

von Volker S. (vloki)


Lesenswert?

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)


Lesenswert?

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.

von Volker S. (vloki)


Lesenswert?

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)


Angehängte Dateien:

Lesenswert?

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)


Lesenswert?

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)


Lesenswert?

Klar, grundsätzlich MSB zuerst.

Das R/W-Bit natürlich nur beim ersten Byte (Adresse).

von Verzweifelt an PIC (Gast)


Lesenswert?

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)


Lesenswert?

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 = 0b00001011;
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 = 0b00000000;        // 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)


Lesenswert?

Ich muss mich korrigieren, es erscheint schon, aber verschwindet sofort 
wieder

von Volker S. (vloki)


Lesenswert?

Mach mal ein while(1); an das Ende von main()

: Bearbeitet durch User
Beitrag #5304219 wurde vom Autor gelöscht.
von Verzweifelt an PIC (Gast)


Lesenswert?

Hat leider nichts verändert. Das Zeichen leuchtet zirka 0,5s auf und ist 
dann weg

von Volker S. (vloki)


Lesenswert?

Configuration-Bits, Watchdog?

von Verzweifelt an PIC (Gast)


Lesenswert?

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

von Volker S. (vloki)


Lesenswert?

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.

: Bearbeitet durch User
von Manfred (Gast)


Lesenswert?

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

von Volker S. (vloki)


Lesenswert?

Manfred schrieb:
> Ich melde Zweifel an!

Begründung?

von Rene B. (themason) Benutzerseite


Lesenswert?

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.

von Volker S. (vloki)


Lesenswert?

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 ;-)

: Bearbeitet durch User
von Rene B. (themason) Benutzerseite


Lesenswert?

Ah oki .. nix gesagt :-) Weitermachen :-)

von Verzweifelt an PIC (Gast)


Lesenswert?

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)


Lesenswert?

>     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

von Volker S. (vloki)


Lesenswert?

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)


Lesenswert?

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)


Lesenswert?

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)


Lesenswert?

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 = 0b00001011;
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 = 0b00000000;        // 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)


Lesenswert?

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?

von Volker S. (vloki)


Lesenswert?

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

: Bearbeitet durch User
von Verzweifelt an PIC (Gast)


Lesenswert?

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 = 0b00001011;
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 = 0b00000000;        // 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)


Lesenswert?

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)


Lesenswert?

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

von Volker S. (vloki)


Lesenswert?

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)


Lesenswert?

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

von Volker S. (vloki)


Lesenswert?

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.

von Volker S. (vloki)


Lesenswert?

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)


Lesenswert?

Das funktioniert problemlos. Jetzt schreibt er auch diese ganzen 
Sonderzeichen aus => also das DOT die Pfeile und die Batterieanzeige

von Verzweifelt an PIC (Gast)


Lesenswert?

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?

von Volker S. (vloki)


Lesenswert?

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)


Lesenswert?

> 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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.