Forums Neueste Beiträge
 

HD44780, Problem mit benutzerdefinierten Zeichen

06/03/2009 - 19:14 von Stefan Brröring | Report spam
Hallo,

ich habe da ein seltsames Problem mit HD44780 kompatiblem Displays.
Ich versuche Benutzerdefinierte Zeichen im CG Ram zu definieren. Das
funktioniert auch im Prinzip, aber die Speicherstellen für die ersten
2,5 Zeichen enthalten offenbar nur Nullen:

Ich hab das mit zwei verschiedenen Displays 4x20 ausprobiert, beide von
Reichelt. Einmal das blaue Displaymodul und einmal das grüne.

Nach der Grundinitialisierung schreibe ich zunàchst ein 0x40 in das
Controlregister, anschließend das Bitmuster in das Datenregister.

Zu Testzwecken hab ich 00010101 in die Speicherstellen 00-3F
geschrieben. Anschließend drucke ich die Zeichen #0 bis #7 auf das
Display. Dabei bleiben bei den ersten beiden Ziffern die Pixel alle aus.
Vom dritten Zeichen sehe ich die untere Hàlfte, danach die vollstàndigen
Zeichen.

Hat da jemand einen Tip für mich?

Hier ein paar Codeschnipsel.
Interessant wird es ganz unten. Die Delays hab ich zu Testzwecken eingebaut.

Gruß
Stefan DF9BI





void LCD_printcharx(char b) // ein Zeichen zum Display schicken zb: '*'
{
char c;
c = b & 0xF0;
LCD_PORT = c;
SetBit(LCD_PORT,LCD_rs); // dataregister adressieren
SetBit(LCD_PORT,LCD_enable);
// Daten schreiben, Impuls an enable
ClrBit(LCD_PORT,LCD_enable);
b=b << 4;
b = b & 0xF0;
LCD_PORT = b;
SetBit(LCD_PORT,LCD_rs); // dataregister adressieren
SetBit(LCD_PORT,LCD_enable);
// Daten schreiben, Impuls an enable
ClrBit(LCD_PORT,LCD_enable);
}

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
void LCD_cfg(char b, char t) //control8bit(char b) // 2x4 Bit zum
Display schicken, Controlregister
{
// PORTC.4-PORTC.7 = D4-D7; PORTC.3 = enable -> 1; PORTC.2 = Register
// select ->0 = control
char c;
c = (b & 0xF0);
LCD_PORT = c;
SetBit(LCD_PORT,LCD_enable);
ClrBit(LCD_PORT,LCD_enable);
// Komandobyte & Enable=0 Input=Instruction=0 auf Port C legen "bbbb
// 0000"
b=b << 4;
if (t) _delay_ms(3);
b = b & 0xF0;
LCD_PORT = b;
// Komandobyte & Enable=0 Input=Instruction=0 auf Port C legen "bbbb
// 0000"
SetBit(LCD_PORT,LCD_enable);
ClrBit(LCD_PORT,LCD_enable);
// Komandobyte & Enable=0 Input=Instruction=0 auf Port C legen "bbbb
// 0000"
if (t) _delay_ms(3);
}
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

void LCD_definechars(void)
{ LCD_cfg(0x40,1);
_delay_ms(3);
char c,i;

for(i=0;i<64;i++)
{
LCD_printcharx(0x15);
_delay_ms(3);
}
}
 

Lesen sie die antworten

#1 Stefan Brröring
06/03/2009 - 19:55 | Warnen spam
Ich hab noch was rausgefunden:

Wenn ich in der Schleife den Zàhler auf 40 reduziere, sind die ersten
drei Zeichen in Ordung. Ich kann dann aber nur 5 Zeichen neu definieren.
Für meine Anwendung brauche ich aber alle 8.

Ich habe dann den Schleifenindex auf 1-8 geàndert und nach jedem Zeichen
neu adressiert. Das Ergebnis bleibt gleich. Auch eine zusàtzliche
Wartezeit vor dem LCD_cfg brachte da nichts.

Gruß

Stefan DF9BI



void LCD_definechars(void)
{ LCD_cfg(0x40,1);
_delay_ms(3);
char c,i;

for(i=0;i<64;i++)
{
LCD_printcharx(0x15);
_delay_ms(3);
}
}

Ähnliche fragen