Forum: Mikrocontroller und Digitale Elektronik hd44780 LCD, Gpio, i2c, lib, Funktionenkonflickt


von aSma>> (Gast)


Angehängte Dateien:

Lesenswert?

Servus,
ich habe eine lcd hd44780 lib für GPIO und I2C in C geschrieben 
(stm32f1). Jetzt möchte ich möglichst die Funktionen nicht doppelt 
schreiben, sondern elegand programmieren, damit der Code besser wartbar 
ist.
1
...
2
#ifdef I2C
3
#define hd44780_write()         _I2C_hd44780_write(_LCD_MODE_t MODE_t, uint8_t data)
4
#endif
5
6
7
#define hd44780_clear()          hd44780_write( COMMAND, HD44780_CMD_CLEAR )
8
#define hd44780_home()           hd44780_write( COMMAND, HD44780_CMD_RETURN_HOME )
9
...
10
#define hd44780_write_char( c )  hd44780_write( DATA, c & 0xff )
11
12
13
//---------------------------------------------------------------------
14
// typedef _LCD_MODE_t
15
// @brief  enum for function hd44780_write();
16
//---------------------------------------------------------------------
17
typedef enum{
18
  COMMAND = 0,
19
  DATA,
20
  HI_NIBBLE,
21
}_LCD_MODE_t;
22
23
//------------------------------- global function -------------------------------
24
void hd44780_init( void );
25
void hd44780_write(_LCD_MODE_t MODE_t, uint8_t data);
26
27
void hd44780_write_string( char *s );
28
void hd44780_set_cursor( uint8_t x, uint8_t y );
29
void hd44780_ticker ( char *msg );
30
extern void Delay_us( uint32_t c );
31
extern void Delay_ms( uint32_t c );

Die Funktion
1
_I2C_hd44780_write(_LCD_MODE_t MODE_t, uint8_t data);
ist nicht global.
1
#ifdef I2C
2
#define hd44780_write()      _I2C_hd44780_write(_LCD_MODE_t MODE_t, uint8_t data)
3
#endif

Geht das überhaubt so?  Sollte ich alle #defines überschreiben? Oder 
jemand ein Tipp wie ich das elegant lösen kann. Vielleicht mithilfe 
"weak"...

Vielen Dank.

PS: Die GPIO lib ist von CooCox. Die I2C lib habe ich mit DMA gelösst. 
Diese funktioniert einbahnfrei.

: Verschoben durch User
von aSma>> (Gast)


Lesenswert?

Ich habe es selber hingekriegt.
1
#ifdef I2C
2
#include "aS_stm32f1_hd44780.h"
3
#define hd44780_write            I2C_hd44780_write
4
#else
5
...
6
GPIO
7
#endif

Plus
1
_I2C_hd44780_write(_LCD_MODE_t MODE_t, uint8_t data);
global zu:
1
I2C_hd44780_write(_LCD_MODE_t MODE_t, uint8_t data);
gemacht. Jetzt läuft es. Danke dennoch.

mfg

von wg (Gast)


Lesenswert?

Hallo  aSma>>

habe gerade deinen Beitrag gefunden.

besteht die Möglichkeit das du dein Projekt veröffentlichst ?
habe gerade ein Problem, das mein Display nicht so will wie ich möchte 
:)

würde gerne von deinen Projekt lernen

Gruß

von Thomas W. (diddl)


Lesenswert?

Ich habe dasselbe "Problem" mit meinem SainsMart I2C RGB LCD Keypad.

In C habe ich es durch normierte Schnittstellen gelöst.
Das Fleury LCD Source hat die Daten über Funktionen weitergegeben an 
einen "Driver".
Der Driver existiert für normale IO, für I2C GPIO Varianten und serielle 
Ansteuerung.

Seit ein paar Tagen beschäftige ich mich sehr intensiv mit C++

Das hat mich mein Konzept der driver überdenken lassen.
Jetzt schreibe ich gerade einiges um auf C++.
Es ist super modular und funktioniert klasse!

Jede Hardware ist ein Objekt.
Besteht die Hardware aus verschiedenen Teilen, gibt es einfach objekte 
für die Teilaufgaben.

Zb. das SainsMart RGB-LCD-Keypad hat ja ein normales hd44780 display und 
einen MCP23017 I2C Gpio. So besteht die Hardware aus mehreren Objekten 
die alle nur genau ihren Teil beitragen und direkt miteinander 
kommunizieren.

Dabei weiss das MCP23017 Objekt nicht, was es steuert. Und das hd44780 
Objekt weiss nicht, dass sein LCD über I2C angeschlossen ist. Das I2C 
GPIO sieht "nach oben" aus wie ein normeles IO. Alles gebuffert und 
gleiche IO in IO gruppen geführt, damit man die I2C zugriffe minimiert.

von aSma>> (Gast)


Lesenswert?

@wg (Gast)

Sry, leider kann ich dir nicht meinen Code aushändigen, wegen 
jugendlichen Leichtsinn.

Ein paar Codesegmente kann ich keinen Urheber mehr zuordnen. Ich habe 
einfach jegliche Kommentare früher immer gleich gelöscht. Heute verwende 
ich nur freien Code, also nix mit GPL usw, da brauche ich kein Balast 
mit mir zu führen.

Sonst hier auf der homepage gibt es für den avr genügend libs, die viel 
besser dokumentiert sind als meine.

Bei Entwicklung vom Code ohnen logic analyzer kommt man nicht weit.

Wenn du Hilfe brauchst für deinen Code, dann stell einfach hier rein und 
dir wird geholfen.

mfg

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.