Hallo miteinander Ich habe folgendes Problem un zwar gibt meine LCD-Anzeige nichts aus. Initialisieren funktioniert allerdings perfekt. Kann mir einer von euch dabei weiterhelfen?? MfG Unti
Stefan Untner schrieb: > Kann mir einer von euch dabei weiterhelfen?? Nein. Unsichtbaren Code kann hier keiner lesen. Möchtest du ihn in sichtbarer Version anhängen?
Sorry (ganz vergessn) hier hab ich main.c, Ausschnitte aus lcd.c und
lcd.h
main.c:
#include <16F1829.H>
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include <lcd.h>
#fuses PUT,BROWNOUT,NOLVP, NOMCLR
#fuses INTRC_IO, NOWDT, NOPROTECT
#use delay(clock=16000000)
void main(void)
{
char msg[]="hallo";
set_tris_c(0x00); //output
LCD_reset();
while(1) // endless loop
{
delay_ms(5);
LCD_out(msg);
}//end while
}//end main
lcd.c: (Ausschnitt)
void LCD_write4Bit(unsigned char zeichen)
{
LCD_E=0;
LCD_D7=zeichen &0x80;
LCD_D6=zeichen &0x40;
LCD_D5=zeichen &0x20;
LCD_D4=zeichen &0x10;
LCD_E=1;
LCD_E=0;
delay_us(50); //50µs warten
LCD_D7=zeichen &0x08;
LCD_D6=zeichen &0x04;
LCD_D5=zeichen &0x02;
LCD_D4=zeichen &0x01;
LCD_E=1;
LCD_E=0;
delay_us(50); //50 µs warten
}
void LCD_out(char *text)
{
LCD_RS=DAT;
while(*text!='\0')
{
LCD_write4Bit(*text++); //string wird zeichen für zeichen ausgegeben
bis '\0'
}
}
lcd.h:
#ifndef H__LCD
#define H__LCD
#define REG 0 //Registerbefehl
#define DAT 1 //Datenbefehl
#byte PORT_C=0x0E
#bit LCD_E=PORT_C.0 //enable
#bit LCD_RS=PORT_C.1 //Registerselect
#bit LCD_D4=PORT_C.2
#bit LCD_D5=PORT_C.3
#bit LCD_D6=PORT_C.4
#bit LCD_D7=PORT_C.5
void LCD_write4Bit(unsigned char zeichen); //Einzelnes Zeichen wird
ausgegeben
void LCD_init(); //LCD wird initialisiert
void LCD_del(); //LCD wird gelöscht
void LCD_pos1(); //Cursor wird auf Position 1,1 gesetzt
void LCD_on();//Display wird eingeschaltet, cursor ist inaktiv
void LCD_out(char *text);//string wird zeichenweise ausgegeben
void LCD_movexy(unsigned char row, unsigned char col);//cursor wird
gesetzt
void LCD_enable();//negative flanke wird erzeugt
void DefineBarSigns(); //user RAM Character werden generiert
void DrawBar(unsigned char percent); //Balkenausgabe
void LCD_reset();
#endif
>Ausschnitte aus lcd.c und lcd.h
Kannst auch gleich ne Wurstbrotschnitte hier posten;)
Ich bevorzuge vollständige Tiere;)
Das gesamte lcd.c File ist im Anhang und lcd.h ist bereits vollständig im oberen Beitrag vorhanden.
> LCD_E=1; > LCD_E=0; > delay_us(50); //50 µs warten Mach das mal so: LCD_E=1; delay_us(1); //1 µs warten LCD_E=0; Exaktes Timing ist beim LCD alles.
Danke für den guten Versuch aber es hat leider nicht funktioniert. Im Anhang ist das veränderte lcd.c File.
>Danke für den guten Versuch aber es hat leider nicht funktioniert. >Im Anhang ist das veränderte lcd.c File. Du sollst nicht deine langen Delays in den E Puls reinlegen, sondern den E Puls 1us lang machen. Schau in das Datenblatt des LCDs. Dann nimmst du die Bilder mit den Timing Diagrammen und baust das 1:1 nach. Dann klappt das auch.
Stefan Untner schrieb: > Initialisieren funktioniert allerdings perfekt. Sicher? Ich seh keinen Funktionsaufruf LCD_init(), nur ein LCD_reset(). Stimmt außerdem LCD_RS?
[holger] Hab ich danach auch gemacht. Das Display ist fix auf eine selbstgebaute Platine gelötet, deswegen kann ich nicht herausfinden welches Display das ist. Ich vermute allerdings, dass es sich um ein LCD mit Standartchip ist.
[T.roll] Ich bin mir sicher, dass es funktioniert. LCD_RS stimmt, ich habs mit LCD_RS=1; und mit LCD_RS=DAT; ausprobiert.... kein Unterschied.
>Hab ich danach auch gemacht.
Ja, und dann in lcd_reset die langen delays weggemacht.
Och man ey...
Hab in LCD_reset wieder die langen delays reingetan. Funktioniert trotzdem leider nicht.
Schalt mal das Cursorblinken in der init ein und schau ob er auch blinkt: LCD_write4Bit(0x0f); //00001111 statt LCD_write4Bit(0x0c); //00001100
>Hab in LCD_reset wieder die langen delays reingetan. >Funktioniert trotzdem leider nicht. Und den Code nicht gepostet. Das sieht doch schon mal alles nicht so ganz verkehrt aus. Einige Sachen sind ja schon drin, nur nutzt du sie nicht. Zum Beispiel:
1 | void LCD_enable() |
2 | {
|
3 | LCD_E=1;//negative Flanke wird erzeugt |
4 | delay_us(1); |
5 | LCD_E=0; |
6 | }
|
mach das
1 | void LCD_enable() |
2 | {
|
3 | LCD_E=1;//negative Flanke wird erzeugt |
4 | delay_us(1); |
5 | LCD_E=0; |
6 | delay_us(1); |
7 | }
|
und der Enable Puls wird immer passen. So, dann noch
1 | void LCD_reset() |
2 | {
|
3 | delay_ms(50); // Power on reset abwarten |
4 | LCD_E=0; |
5 | LCD_RS=REG; |
6 | LCD_D7=0; |
7 | LCD_D6=0; |
8 | LCD_D5=1; |
9 | LCD_D4=1; |
10 | LCD_enable(); |
11 | delay_ms(50); |
12 | LCD_D7=0; |
13 | LCD_D6=0; |
14 | LCD_D5=1; |
15 | LCD_D4=1; |
16 | LCD_enable(); |
17 | delay_ms(50); |
18 | LCD_D7=0; |
19 | LCD_D6=0; |
20 | LCD_D5=1; |
21 | LCD_D4=1; |
22 | LCD_enable(); |
23 | delay_ms(50); |
24 | }
|
Nutze den Kram der schon geht. Sonst machst du nur Fehler. Weiter: void LCD_write4Bit(unsigned char zeichen) Bau da LCD_Enable() ein.
1 | void LCD_write4Bit(unsigned char zeichen) |
2 | {
|
3 | LCD_D7=zeichen &0x80; |
4 | LCD_D6=zeichen &0x40; |
5 | LCD_D5=zeichen &0x20; |
6 | LCD_D4=zeichen &0x10; |
7 | LCD_enable(); |
8 | LCD_D7=zeichen &0x08; |
9 | LCD_D6=zeichen &0x04; |
10 | LCD_D5=zeichen &0x02; |
11 | LCD_D4=zeichen &0x01; |
12 | LCD_enable(); |
13 | }
|
In void LCD_out(char *text) hast du Mist gebaut nach LCD_write4Bit(); brauchst du ein delay. Bau es dort ein!
1 | void LCD_write4Bit(unsigned char zeichen) |
2 | {
|
3 | LCD_D7=zeichen &0x80; |
4 | LCD_D6=zeichen &0x40; |
5 | LCD_D5=zeichen &0x20; |
6 | LCD_D4=zeichen &0x10; |
7 | LCD_enable(); |
8 | LCD_D7=zeichen &0x08; |
9 | LCD_D6=zeichen &0x04; |
10 | LCD_D5=zeichen &0x02; |
11 | LCD_D4=zeichen &0x01; |
12 | LCD_enable(); |
13 | delay_us(50); |
14 | }
|
usw. Vereinfache deinen Code. Wenn du die genauen delays nicht kennst mach sie grösser.
1 | void LCD_del() |
2 | {
|
3 | LCD_RS=REG; //Registerbefehl |
4 | LCD_write4Bit(0x01); //Daten werden gesendet |
5 | delay_ms(5);//700µs warten |
6 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.