Problem bei der Erweiterung einer LCD (HD44780) Library

OP #363377
Lesenswert?

Hallo,

ich habe ein Problem mit der erweiterung einer LCD library.
Die LCD lib von Peter Fleury enthält diverse Routinen für HD44780U
basierende LCDs, allerdings habe ich hier ein 4 Zeiliges Display Wintek
von pollin.de), welches intern 2 Controller (je 2 Zeilen) hat.
Die Auswahl des Controllers erfolgt dabei über 2 Enable Eingänge,
während die anderen Anschlüse für beide Controller gleich sind.

Die einzelnen Port und Pin Zuordnungen sind einer Header Datei lcd.h
definiert.
Beispiel:

#define LCD_RS_PORT      LCD_PORT     /**< port for RS line         */
#define LCD_RS_PIN       4            /**< pin  for RS line         */
#define LCD_RW_PORT      LCD_PORT     /**< port for RW line         */
#define LCD_RW_PIN       5            /**< pin  for RW line         */
#define LCD_E_PORT       LCD_PORT     /**< port for Enable line     */
#define LCD_E_PIN        6            /**< pin  for Enable line     */

Meine Idee wäre es, bei einem 2-Controller-Display während dem
Programmablauf jeweils vor einem Schreib oder Lesezugriff die Zuordnung
von LCD_E_PORT und LCD_E_PIN zu ändern um nicht alle restlichen Routinen
umschreiben zu müssen.

Ich habe folgende Änderungen gemach:

Änderungen in lcd.h:

.....
eingefügt:
#define LCD_4LINE_2CONTROLLER 1  /**< Use 0 for Displays with one
Controller, 1 for 2 Controllers */

....
// Settings only for displays with one controller
#if !LCD_4LINE_2CONTROLLER
#define LCD_E_PORT       LCD_PORT   /**< port for Enable line     */
#define LCD_E_PIN        6          /**< pin  for Enable line     */
#else //Settings for 2 controller
#define LCD_E0_PORT       LCD_PORT  /**< port for Enable line 0    */
#define LCD_E0_PIN        6         /**< pin  for Enable line 0    */
#define LCD_E1_PORT       PORTB     /**< port for Enable line 1    */
#define LCD_E1_PIN        0         /**< pin  for Enable line 1    */
#endif
....

#if LCD_4LINE_2CONTROLLER
/**
 @brief    Change the display controller (E-Pin)
 @param
 @return  none
*/
extern void lcd_changecontrol(uint8_t controller);
#endif

######################################################################## 
######################
Änderungen in lcd.c:

....

#if LCD_4LINE_2CONTROLLER
uint8_t LCD_E_PORT, LCD_E_PIN;
#endif

....

/*********************************************************************** 
**
Changes the Display-Controller (=Change of E-Pin)
Input:    controller 0 or 1
Returns:  none
************************************************************************ 
*/
#if LCD_4LINE_2CONTROLLER
void lcd_changecontrol(uint8_t controller)
{
  if (controller)
  {
    LCD_E_PORT = LCD_E1_PORT;
    LCD_E_PIN  = LCD_E1_PIN;
  }
  else
  {
    LCD_E_PORT = LCD_E0_PORT;
    LCD_E_PIN  = LCD_E0_PIN;
  }
}
#endif


######################################################################## 
######################


Im main müsste dann nur noch zum Umschalten der Displaycontroller die
zusätzliche Funktion verwendet werden

...
lcd_changecontrol(1);
lcd_init(LCD_DISP_ON_CURSOR_BLINK);
...


Leider funktioniert das nur theoretisch...
Ich denke es liegt an den Zuweisung

LCD_E_PORT = LCD_Ex_PORT;

Die Zuweisung der Pin-Nummer funktioniert im Debugger ohne Probleme
(ist ja auch nur ein Int-Wert).
Aber welchen Datentyp muss ich LCD_E_PORT verpassen? Und wie macht man
dann eine Zuweisung des Portnamens während dem Programmablauf??

Gruß
Angehängte Dateien:
OP #363379
Lesenswert?

Hallo,

danke für den link!

Mittlerweile habe ich es aber auch geschafft die LCD Library von Peter
Fleury zu erweitern um damit auch Displays mit 2 HD44... ansteuern zu
können.
Leider nicht ganz so wie ichs anfangs wollte.

Wäre trotzdem interessant gewesen wie man Ports über eine Variable
anspricht, bzw. der Variable den Portnamen zuweisen kann...

PS: Warum ist mein Nick in der Threadliste nicht sichtbar und warum
steht er im Beitrag in Klammern? (Eingeloggt war ich jedenfalls immer)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren