Forum: Mikrocontroller und Digitale Elektronik Fleury LCD-Library plus mjkdz Port Expander?


von Stefan R. (Gast)


Lesenswert?

Hallo,

ich habe mal wieder ein Projekt und diesmal wollte ich ein paar 
Leitungen am ATMega sparen und habe mir so einen Port-Expander von mjkdz 
(vermutlich mit PCA8574D) bestellt. Normalerweise verwende ich die 
LCD-Library von Peter Fleury und nun habe ich eigentlich gehofft, auf 
die schnelle einen Weg zu finden, wie ich die weiterhin nutzen kann, 
diesen I2C-Expander aber einfach dazwischen bekomme. Nur hat meine 
Internet-Recherche bisher recht wenig ergeben, wie man das wohl machen 
könnte.

Hat einer von Euch das schon mal erfolgreich hinbekommen? Oder bin ich 
mit meinem Ansatz sogar auf dem Holzweg und es gibt eine ganz andere 
Lösung?

Bei AVR-Freaks ist ein Thread, wo jemand den am ATtiny betreibt, 
allerdings macht der die LCD-Steuerung auch von Hand und nicht über eine 
Library wie die von Fleury.

Danke für jeden Beitrag,
Stefan

von Karl H. (kbuchegg)


Lesenswert?

Stefan R. schrieb:
> Hallo,
>
> ich habe mal wieder ein Projekt und diesmal wollte ich ein paar
> Leitungen am ATMega sparen und habe mir so einen Port-Expander von mjkdz
> (vermutlich mit PCA8574D) bestellt. Normalerweise verwende ich die
> LCD-Library von Peter Fleury und nun habe ich eigentlich gehofft, auf
> die schnelle einen Weg zu finden, wie ich die weiterhin nutzen kann,
> diesen I2C-Expander aber einfach dazwischen bekomme. Nur hat meine
> Internet-Recherche bisher recht wenig ergeben, wie man das wohl machen
> könnte.

Du hättest weniger in Internet Recherche investieren sollen, sondern 
mehr in den Source Code der LCD-Funktionen.

Du musst die Stelle finden, an der die eigentliche Ausgabe auf die 
Portpins passiert. Jeder halbwegs vernünftige Programmierer baut sich 
seine LCD-Funtkionen so auf, dass alles in mehr oder weniger einer 
einzigen Ausgabe-Funktion zusammenläuft, die die tatsächliche Arbeit des 
Pin setzens bzw. löschens für ein auszugebendes Byte erledigt.
Die gilt es im Code zu finden.
Und dort ist dann dein Eingreifpunkt, an dem du das Byte dann eben nicht 
auf die diversen Portpins rausgibst sondern die Anpassung an deine 
spezielle Hardware machst. Zum Beispiel die Ausgabe an einen 
Port-Expander.
Die Ausgabe bzw. Behandlung der Steuerleitungen nicht vergessen!

: Bearbeitet durch Admin
von leluno (Gast)


Lesenswert?

Karl Heinz schrieb:
> Jeder halbwegs vernünftige Programmierer baut sich
> seine LCD-Funtkionen so auf

Es müsste dann eigentlich irgendwo eine Standardbib geben damit nicht 
jeder über den Aufbau der LCD-Funktionen neu nachdenken muss.
1
//++++++++++++ hardware-funktion 1:  ++++++++++++++++++++
2
void lcdset(lcdbyte){
3
#if use_lcd4bit
4
  if gbi(lcdbyte,2){sbi(PORT(RS_Port),(RS_Pin));}else{cbi(PORT(RS_Port),(RS_Pin));}
5
  lcdbyte  &=  0xf0;
6
  cbi(PORT(db4_Port),db4_Pin);
7
  PORT(db4_Port)|=(gbi(lcdbyte,4))<<db4_Pin;
8
  cbi(PORT(db5_Port),db5_Pin);
9
  PORT(db5_Port)|=(gbi(lcdbyte,5))<<db5_Pin;
10
  cbi(PORT(db6_Port),db6_Pin);
11
  PORT(db6_Port)|=(gbi(lcdbyte,6))<<db6_Pin;
12
  cbi(PORT(db7_Port),db7_Pin);
13
  PORT(db7_Port)|=(gbi(lcdbyte,7))<<db7_Pin;
14
#endif  
15
16
#if use_mcp23s17_lcd
17
//mcp23s17A_send(0x12,lcdbyte);
18
hwSpiA(0x12,lcdbyte);
19
#endif
20
21
#if use_twilcd64x || use_twilcd64
22
  i2c_start_wait(64);
23
  i2c_write(lcdbyte);  //  
24
  i2c_stop();
25
#endif
26
27
#if use_twilcd72x
28
  set_mcp23017_outAB(lcdbyte , 0);
29
#endif
30
31
#if use_lcd74hc
32
  send74hc16bitlcd(lcdbyte & 12,lcdbyte & 0xf0);
33
#endif
34
}//------- void lcdset(lcdbyte) ------------------
35
36
37
//++++++++++++ hardware-funktion 2:  ++++++++++++++++++++
38
void lcdsetE(lcdbyte){
39
#if use_lcd4bit
40
    lcdset(lcdbyte);
41
    sbi(PORT(En_Port),(En_Pin));
42
    cbi(PORT(En_Port),(En_Pin));
43
#endif
44
45
#if use_twilcd64
46
  i2c_start_wait(varADR_SLAVE_LCD);
47
  i2c_write(lcdbyte);  //  
48
  i2c_write(lcdbyte+WERTpinE);  //  
49
  i2c_write(lcdbyte);  //  
50
  i2c_stop();
51
#endif  
52
53
#if use_mcp23s17_lcd
54
/*mcp23s17A_send(0x12,lcdbyte);
55
mcp23s17A_send(0x12,lcdbyte+WERTpinE);
56
mcp23s17A_send(0x12,lcdbyte);*/
57
hwSpiA(0x12,lcdbyte);
58
hwSpiA(0x12,lcdbyte+WERTpinE);
59
hwSpiA(0x12,lcdbyte);
60
#endif
61
62
#if use_twilcd72
63
//uint8_t mcp23017_72_A,mcp23017_72_B;
64
//lcdbyte d7-d6-d5-d4-en-rs-//-//
65
mcp23017_72_A= (mcp23017_72_A & 0b00000011) + (lcdbyte   & 0b11111100);
66
//mcp23017_72_B= (mcp23017_72_B & 0b00111111) + (((lcdbyte & 0b00000100)<<5));
67
  set_mcp23017_outAB(mcp23017_72_A, mcp23017_72_B);
68
  set_mcp23017_outAB((mcp23017_72_A + WERTpinE), mcp23017_72_B );
69
  set_mcp23017_outAB(mcp23017_72_A, mcp23017_72_B);
70
#endif
71
72
#if use_twilcd72x
73
  set_mcp23017_outAB(lcdbyte , 0);
74
  set_mcp23017_outAB(lcdbyte + 8, 0);
75
  set_mcp23017_outAB(lcdbyte , 0);
76
#endif
77
78
#if use_twilcd64x
79
  i2c_start_wait(varADR_SLAVE_LCD);
80
  i2c_write(lcdbyte);  //  
81
  i2c_write(lcdbyte+WERTpinE);  //  
82
  i2c_write(lcdbyte);  //  
83
  i2c_stop();
84
#endif  
85
86
#if use_lcd74hc
87
  send74hc16bitlcd(lcdbyte &4,lcdbyte & 0xf0);
88
  send74hc16bitlcd((lcdbyte &4) + 8,lcdbyte & 0xf0);
89
  send74hc16bitlcd(lcdbyte &4,lcdbyte & 0xf0);
90
#endif
91
}//------------- lcdsetE(lcdbyte) -----------------------
92
//------------ hardware-funktion 2:  --------------------

von Karl H. (kbuchegg)


Lesenswert?

leluno schrieb:
> Karl Heinz schrieb:
>> Jeder halbwegs vernünftige Programmierer baut sich
>> seine LCD-Funtkionen so auf
>
> Es müsste dann eigentlich irgendwo eine Standardbib geben

Ha!
Willkommen in der Realität.

Nichts ist so schwer durchzusetzen, wie Standards. Denn jeder hat eine 
andere Vorstellung davon, wie ein bestimmter Standard im Detail 
auszusehen hat. Und jeder erhebt seine persönlichen 
Vorlieben/Problemchen zum Standard.

: Bearbeitet durch User
von isnah (Gast)


Lesenswert?

"Für ganz Faule" gibt es von Nico und Thomas Eichelman eine Lib zur 
Ansteuerung von LCDs über PCA8574X unter der Verwendung der I2C-Lib von 
Peter Fleury.
http://computerheld.de/i2clcd/
Funktioniert auf die Schnelle wunderbar :-)

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.