hd44780 LCD, Gpio, i2c, lib, Funktionenkonflickt

Gast #4527430
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.
Angehängte Dateien:
Gast
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
Gast
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ß
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.
Gast
@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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.