Forum: Mikrocontroller und Digitale Elektronik LCD_CHAR_OUT Funktion


von Doenercola (Gast)


Lesenswert?

Hallo Leute!

Ich verzweifel hier grad leicht an einer Progammieraufgabe.
Wir haben einen ADuC 832 und ein HD44780 Display, welches durch Adressen 
im Programmspeicher angesprochen werden kann.

Nun soll ich eine Funktion schreiben, die einen Charakter auf dem 
Display ausgibt. Leider hab ich überhaupt keinen Plan wie ich das 
realisieren soll. An der benötigten Delay-Funktion hab ich auch schon 
viele Nerven verloren.

Hier ist die Vorlage:

//---------------------------------------------------------------------- 
---------
//  Function:   write one char to lcd
//  Used Func:  Delay_50us
//  Parameter:  char
//  Return:     none
//---------------------------------------------------------------------- 
---------
void LCD_CHAR_OUT(uint8_t ucTemp)
{

}


#include <intrins.h>  // Fuer NOP-Befehl
void Delay_50us(void)
{
  uint8_t ucCount = 0;  // Zaehlvariable
  for(ucCount = 70; ucCount > 0; ucCount--)  // 50us / 712ns = 70
  {
  _nop_();                  // Warte 1 Maschinenzyklus
  }


Ich wär euch sehr dankbar für eure Hilfe :)

Liebe Grüße

von Doenercola (Gast)


Lesenswert?

Bin jetzt etwas weiter....

void LCD_CHAR_OUT(uint8_t ucTemp)
{
  pLCD_Data = ucTemp;
}

pLCD_Cont nd pLCD_Data sind beides Zeiger auf den Adressraum für dsa 
Display.
Bei der Initialisierung arbeiten wir ja mit pLCD_Cont, bei dem Schreiben 
von Anzeigedaten mit pLCD_Data. Stimmt diese Zuweisung?

von Oliver J. (skriptkiddy)


Lesenswert?

Doenercola schrieb:
> Stimmt diese Zuweisung?
Nein, wenn pLCD_Data ein Zeiger ist.

Gruß Oliver

von Doenercola (Gast)


Lesenswert?

*pLCD_Data = ucTemp;
Und mit Dereferenzierung? ;)

von Oliver J. (skriptkiddy)


Lesenswert?

Doenercola schrieb:
> *pLCD_Data = ucTemp;
> Und mit Dereferenzierung? ;)
Da sieht das schon besser aus.

Gruß Oliver

von Doenercola (Gast)


Lesenswert?

Hmm, da meckert Keil.

LCD.c(96): error C195: '*' illegal indirection

Das Display nimmt bei der Initialisierung auch diese Befehle entgegen:
        pLCD_Cont = 0x1;  // Display resetten
  Delay_4ms();
  pLCD_Cont = 0x0C;  // Display ein, Cursor aus, kein Blinken
  Delay_50us();

Hier auch die Deklaration der Zeiger:

// Zeiger anlegen
  uint8_t xdata  pLCD_Cont   at AdrLCD_CONT;  // Zeiger fuer 
"Steuerdaten schreiben"
  uint8_t xdata  pLCD_Data   at AdrLCD_DATA;  // Zeiger fuer 
"Anzeigedaten schreiben"

von Karl H. (kbuchegg)


Lesenswert?

Doenercola schrieb:

> Hier auch die Deklaration der Zeiger:

Das sind aber ziemlich offensichtlich keine Zeiger. Das sind Variablen, 
die offenbar an eine bestimmte Speicheradresse gemappt wurden. D.h. für 
dein Programm verhalten sie sich wie ganz normale Variablen. Du 
schreibst einen Wert rein und durch das Mapping wird der Wert an die 
Hardware weitergeleitet.

Du solltest dich in erster Linie an dem orientieren, was im Quellcode 
steht und nicht so sehr an dem in den Kommentaren. Denn hier wurden im 
Kommentar die falschen Begriffe benutzt.

von Doenercola (Gast)


Lesenswert?

Die Kommentare sind zwar von mir, aber die Informationen hab ich aus den 
Texten zu den Laborübungen - also scheinen dort auch die falschen 
Begriffe verwendet worden zu sein. Ich sprech den Betreuer nächste Woche 
mal darauf an. :)

Könnte die Ausgabefunktion so ihren Dienst tun?

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.