mikrocontroller.net

Forum: Compiler & IDEs HD61830 Ansteuerung


Autor: Sven S. (schwerminator)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich möchte mit einem AtMega16 einen HD61830B-LCD-Controller ansteuern. 
Ich steh noch ziemlich am Anfang meiner Programmier-Karriere, deshalb 
kann es sein, dass ich mir das ganze ein wenig einfach vorstelle, aber 
ich würde euch gern bitten einmal einen Blick auf meinen Code zu werfen. 
Auf dem LCD wird nichts und teilweise vertikale Striche angezeigt.
#define F_CPU 8000000UL

#define DATAPORT  PORTA
#define DATADDR    DDRA
#define DATAPIN    PINA
#define CTRLPORT  PORTB
#define CTRLDDR    DDRB
#define RS      0
#define RW      1
#define E      2
#define CS      3
#define RESET    4
#define LED      5

#include <util/delay.h>
#include <stdint.h>
#include <avr/io.h>

void lcdWaitIdle(void) {
  // waits until busy flag is cleared
 
  DATAPORT = 0x00;      // Datenport wird gelöscht
  DATADDR = 0x00;        // Datenport wird als Eingang deklariert

  CTRLPORT |= (1<<RW);    // R/W auf logisch 1 -> R 
  CTRLPORT |= (1<<RS);    // RS auf logisch 1 -> aktiv
  CTRLPORT |= (1<<E);    // E auf logisch 1 -> lesen
  
  do{
    CTRLPORT |= (1<<E);
    CTRLPORT &= ~(1<<E);  // fallende Flanke am Pin E
  }while(DATAPIN & (1<<7));  // Schleife bis Busy Flag logisch 0 wird
  
  DATADDR = 0xff;        // Datenport wird als Ausgang deklariert
}
 
void lcdWriteCommand(uint8_t command) {
  // Kommandobyte -> HD61830
 
  lcdWaitIdle();
  CTRLPORT &= ~(1<<RW);    // R/W auf logisch 0 -> W 
  CTRLPORT |= (1<<RS);    // RS auf logisch 1 -> aktiv
  DATAPORT = command;      // übergebenes Kommandobyte wird ausgegeben
  CTRLPORT |= (1<<E);
  CTRLPORT &= ~(1<<E);    // fallende Flanke am Pin E -> Portdaten werden ins Register geschrieben
}
 
void lcdWriteData(uint8_t data) {
  // Datenbyte -> HD61830
 
  lcdWaitIdle();
  CTRLPORT &= ~(1<<RW);    // R/W auf logisch 0 -> W 
  CTRLPORT &= ~(1<<RS);    // RS auf logisch 0 -> inaktiv
  DATAPORT = data;      // übergebenes Datenbyte wird ausgegeben
  CTRLPORT |= (1<<E);
  CTRLPORT &= ~(1<<E);    // fallende Flanke am Pin E -> Portdaten werden ins Register geschrieben
}
  
void lcdWritePair(uint8_t command, uint8_t data) {
  // Kombination aus Kommando- und Datenbyte

  lcdWriteCommand(command);
  lcdWriteData(data);
}

void lcdInit(void){
  DATADDR = 0xff;        // Datenport wird als Ausgang deklariert
  CTRLDDR = 0xff;        // Kommandoport wird als Ausgang deklariert
  
  CTRLPORT &= ~(1<<CS);    // CS auf logisch 0 -> aktiv
  CTRLPORT |= (1<<RESET);  // RESET auf logisch 1 -> aktiv
  
  lcdWaitIdle();
  
  lcdWritePair((1<<RS), 0x34); // Erstmal nur einen blinkenden Cursor
}

 
int main (void) {
  lcdInit();
  
  CTRLPORT |= (1<<LED);    // Hintergrundbeleuchtung aus
}

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hast du dir aber 'nen mächtigen Display-Controller ausgesucht ;)

Was mir auffällt ist z.B. "lcdWritePair((1<<RS), 0x34);" in deiner 
Init-Funktion, das muss falsch sein (wahrscheinlich meinst du 
"lcdWritePair(0, 0x34);").
 - wahrscheinlich brauchst du beim ENABLE-Signal ein paar nops/eine 
Verzögerung (s. "Enable cycle time" / "Enable Pulse width").
 - Mach dir doch auch Macros für die LCD-Befehle (MODE_CTRL, CHR_PITCH 
usw...).
 - Nenn die Funktion für die Befehle lieber LcdPutCmd, oder so - dass da 
zwei bytes übertragen werden ist nicht weiter interessant, wenn man den 
Code liest, dass da Befehle übertragen werden dagegen schon.
 - den Reset Pin musst du wahrscheinlich nicht mit dem AVR ansteuern, 
häng den doch einfach an Vcc oder an den Reset-Pin des AVR.

hth. Jörg

ps.: AVCC des AVR ist aber angeschlossen, oder?

Autor: Sven S. (schwerminator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Was mir auffällt ist z.B. "lcdWritePair((1<<RS), 0x34);" in deiner
> Init-Funktion, das muss falsch sein (wahrscheinlich meinst du
> "lcdWritePair(0, 0x34);").
Ach verdammt, da hast du natürlich Recht!

>  - wahrscheinlich brauchst du beim ENABLE-Signal ein paar nops/eine
> Verzögerung (s. "Enable cycle time" / "Enable Pulse width").
Kann ich da nicht einfach auch wieder mit dem Busy-Flag arbeiten? Die 
Anzahl nops, die benötigt wird, ist ja von der Taktfrequenz abhängig.

>  - Mach dir doch auch Macros für die LCD-Befehle (MODE_CTRL, CHR_PITCH
> usw...).
später...

>  - Nenn die Funktion für die Befehle lieber LcdPutCmd, oder so - dass da
> zwei bytes übertragen werden ist nicht weiter interessant, wenn man den
> Code liest, dass da Befehle übertragen werden dagegen schon.
später...

>  - den Reset Pin musst du wahrscheinlich nicht mit dem AVR ansteuern,
> häng den doch einfach an Vcc oder an den Reset-Pin des AVR.
Da hast du natürlich recht, aber im Moment habe ich noch I/O-Pins en 
masse, also sollte es auch so gehen.

> ps.: AVCC des AVR ist aber angeschlossen, oder?
Ja klar ;)

Ich werde gleich nachher die Änderungen im Code vornehmen und testen.

mfG

Autor: Sven S. (schwerminator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so ich habe das jetzt ein wenig verändert:
void shiftEnable(void){
  CTRLPORT |= (1<<E);
  _delay_us(100);
  CTRLPORT &= ~(1<<E);  // fallende Flanke am Pin E
}

void lcdWaitIdle(void) {
  // waits until busy flag is cleared
 
  DATAPORT = 0x00;      // Datenport wird gelöscht
  DATADDR = 0x00;        // Datenport wird als Eingang deklariert

  CTRLPORT |= (1<<RW);    // R/W auf logisch 1 -> R 
  CTRLPORT |= (1<<RS);    // RS auf logisch 1 -> aktiv
  CTRLPORT |= (1<<E);    // E auf logisch 1 -> lesen
  
  do{
    asm("nop");
  }while(DATAPIN & (1<<7));  // Schleife bis Busy Flag logisch 0 wird
  
  DATADDR = 0xff;        // Datenport wird als Ausgang deklariert
}
Ein delay von 100µs in der Funktion E sollte ja locker reichen (Enable 
fall/rise time 25 ns). in der do...while-Schleife bin ich mir unsicher, 
was da rein muss. eigendlich soll doch gewartet werden also asm("nop"), 
oder? Generell ist keine Besserung sichtbar.

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ein delay von 100µs in der Funktion E sollte ja locker reichen
Ja, natürlich (_delay_us(2) sollte auch gehen )

> (Enable fall/rise time 25 ns).
Vorsicht! Es geht hier um Enable High(resp. Low-) time (die Zeit, die 
Enable high bzw. Low ist und NICHT um fall/rise time (= die Zeit, die es 
dauert, bis  enable umgeschaltet hat)

> in der do...while-Schleife bin ich mir unsicher, was da rein muss.
> eigendlich soll doch gewartet werden also asm("nop"),
Nein!
shiftEnable();
void lcdWaitIdle(void) {
  // waits until busy flag is cleared
  unsigned char tmp;    

  DATAPORT = 0x00;      // Datenport wird gelöscht
  DATADDR = 0x00;       // Datenport wird als Eingang deklariert

  CTRLPORT |= (1<<RW)|(1<<RS);  // R/W auf logisch 1 -> R 
                                // RS auf logisch 1 -> aktiv
  do{
    CTRLPORT |=(1<<E);
    _delay_us(1);
    tmp = DATAPIN;
    CTRLPORT &= ~(1<<E);
    _delay_us(1);
  }while(tmp & (1<<7));  // Schleife bis Busy Flag logisch 0 wird
                         // Das Flag (d.h. alle LCD-Daten) kann sich nur 
                         // mit der fallenden Flanke von E ändern  !
  
  DATADDR = 0xff;        // Datenport wird als Ausgang deklariert
}
hth. Jörg

ps.: wenn's funktioniert/wenn du verstanden hast ;) schau dir mal die 
LCD-Lib. von P. Fleury an (http://jump.to/fleury), da kannst du dir auf 
jeden Fall die 'höheren' Funktionen (und die Namen :) ) abschauen

pps.: Mach auf jeden Fall die Optimierung an (falls noch nicht 
geschehen)!

Autor: Sven S. (schwerminator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Halli Hallo,
es tut sich was!!! Ich drehte vorhin testweise den Kontrast ganz auf und 
erkannte sehr schwache Zeichen, also spielte ich mit dem Wert von "Set 
Number of Time Divisions" herum, sodass endlich was sichtbar wurde. 
Zeichen, die ich an das Display schicke, werden korrekt dargestellt. Nur 
leider werden viele weitere Zeichen gezeigt - wirre Zeichen (arabisch?! 
;)). Außerdem sehen immer drei Zeilen gleich aus. Inhalt kann nicht im 
Speicher des HD61830 sein, weil ich auch schon RESETS ausprobiert habe. 
Hat jemand eine Idee, woran das liegen könnte?

mfG

Autor: Sven S. (schwerminator)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Ich habe jetzt alles zum Laufen gebracht. Wen es interessiert, hier ist 
der Code:
#define DATAPORT  PORTA
#define DATADDR    DDRA
#define DATAPIN    PINA
#define CTRLPORT  PORTB
#define CTRLDDR    DDRB
#define RS      0
#define RW      1
#define E      2
#define CS      3
#define RESET    4
#define LED      5

#include <util/delay.h>
#include <stdint.h>
#include <avr/io.h>

void shiftEnable(void){
  // Erzeugt eine fallende Flanke am Enable-Pin

  CTRLPORT |= (1<<E);
  _delay_us(2);
  CTRLPORT &= ~(1<<E);
  _delay_us(2);
}

void lcdWaitIdle(void) {
  // Wartet bis der Controller wieder Daten verarbeiten kann
 
  unsigned char tmp;
 
  DATAPORT = 0x00;      // Datenport wird gelöscht
  DATADDR = 0x00;        // Datenport wird als Eingang deklariert

  CTRLPORT |= (1<<RW);    // R/W auf logisch 1 -> R 
  CTRLPORT |= (1<<RS);    // RS auf logisch 1 -> aktiv
  
  do{
    CTRLPORT |= (1<<E);  // Steigende Flanke am Enable-Pin
    _delay_us(2);
    tmp = DATAPIN;      // Datenport wird eingelesen
    CTRLPORT &= ~(1<<E);  // Fallende Flanke am Enable-Pin
    _delay_us(2);
  }while(tmp & (1<<7));    // Schleife bis Busy Flag logisch 0 wird
  
  DATADDR = 0xff;        // Datenport wird wieder als Ausgang deklariert
}
 
void lcdWriteCommand(uint8_t command) {
  // Kommandobyte -> HD61830
 
  lcdWaitIdle();
  CTRLPORT &= ~(1<<RW);    // R/W auf logisch 0 -> W 
  CTRLPORT |= (1<<RS);    // RS auf logisch 1 -> aktiv
  DATAPORT = command;      // übergebenes Kommandobyte wird ausgegeben
  shiftEnable();
}
 
void lcdWriteData(uint8_t data) {
  // Datenbyte -> HD61830
 
  lcdWaitIdle();
  CTRLPORT &= ~(1<<RW);    // R/W auf logisch 0 -> W 
  CTRLPORT &= ~(1<<RS);    // RS auf logisch 0 -> inaktiv
  DATAPORT = data;      // übergebenes Datenbyte wird ausgegeben
  shiftEnable();
}
  
void lcdWritePair(uint8_t command, uint8_t data) {
  // Kombination aus Kommando- und Datenbyte

  lcdWriteCommand(command);
  lcdWriteData(data);
}

void lcdInit(unsigned char modus){
  // Initialisiert das Display

  DATADDR = 0xff;        // Datenport wird als Ausgang deklariert
  CTRLDDR = 0xff;        // Kommandoport wird als Ausgang deklariert
  
  CTRLPORT |= (1<<RESET);  // RESET auf logisch 1 -> inaktiv
  CTRLPORT &= ~(1<<CS);    // CS auf logisch 0 -> aktiv
  
  if(modus == 'c'){
    // Charaktermodus
    
    lcdWritePair(0x00, 0x30);  // Mode Control
    lcdWritePair(0x01, 0x75);  // Set Character Pitch
    lcdWritePair(0x02, 0x27);  // Set Number of Characters
    lcdWritePair(0x03, 0x1f);  // Set Number of Time Divisionsn 
    lcdWritePair(0x04, 0x07);  // Set Cursor Position
  }
  else{
    // Grafikmodus
    
    lcdWritePair(0x00, 0x32);  // Mode Control
    lcdWritePair(0x01, 0x07);  // number of bits of 1-byte display data to be displayed
    lcdWritePair(0x02, 0x1d);  // number of horizontal bytes
    lcdWritePair(0x03, 0x1f);  // Set Number of Time Divisionsn 
  }
  
  lcdWritePair(0x08, 0x00);    // Set Display Start Low Order Address
  lcdWritePair(0x09, 0x00);    // Set Display Start High Order Address
  
  lcdClear(modus);
}

void lcdClear(unsigned char modus){
  // Löscht das Display

  lcdSetCursor(modus, 0, 0);      // Cursor an den Anfang setzen
  
  if(modus == 'c'){
    // Charaktermodus
    
    for(uint16_t i=0; i<320; i++)  // Alle Chars durchlaufen und löschen
      lcdWritePair(0x0c, 0x20);
  }
  else{
    // Grafikmodus
    
    for(uint16_t i=0; i<1920; i++)  // Alle Bytes durchlaufen und löschen
      lcdWritePair(0x0c, 0x00);
  }

  lcdSetCursor(modus, 0, 0);      // Cursor an den Anfang setzen
}

void lcdSetCursor(unsigned char modus, uint8_t x, uint8_t y){
  // Setzt den Cursor an eine bestimmte Position
  
  uint16_t adress;
  uint8_t adressLow, adressHigh;
  
  if(modus == 'c'){
    // Charaktermodus
    
    adress = (y * 40) + x;
  }
  else{
    // Grafikmodus
    
    adress = (y * 30) + x;
  }
  
  lcdWritePair(0x0a, (uint8_t)(adress));  // Set Cursor Address (Low Order)
  lcdWritePair(0x0b, (uint8_t)(adress >> 8));  // Set Cursor Address (High Order)
}

void lcdSetPixel(uint8_t x, uint8_t y, unsigned char modus){
  // Setzt/Löscht den Pixel an einer bestimmte Position

  lcdSetCursor('g', (x >> 3), y);
  
  if(modus == 's')
    lcdWritePair(0x0f, (x & 0x07));
  else
    lcdWritePair(0x0e, (x & 0x07));
}

Ich möchte an dieser Stelle Mark H. (markh.de) danken, der mir mit 
seinem Code sehr weitergeholfen hat.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo !
der thread is schon etwas älter, ich weiß, aber ich grab ihn trotzdem 
nochmal aus...

>>Außerdem sehen immer drei Zeilen gleich aus. Inhalt kann nicht im
>>Speicher des HD61830 sein, weil ich auch schon RESETS ausprobiert habe.
>>Hat jemand eine Idee, woran das liegen könnte?

ich hab ein sehr ähnliches problem, nur dass bei mir nicht drei zeilen 
sondern alle zeilen gleich aussehen. wie hast du das problem lösen 
können und was war die ursache ?? ich benutze deinen codeschnippsel, 
aber bei funktioniert er nicht...
mfg martin

Autor: Sven S. (schwerminator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hatte das problem glaube ich damit gelöst, indem ich den wert für 
"Time Division" geändert habe in der init-funktion. den wert entnimmst 
du dem datenblatt des lcd-panels.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jo dankeschön, jetzt funktioniert es!!!

Autor: AL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
könnte ihr mir bitte sagen welche Funktionen ich aufrufen muss um das 
LCD zu starten? Zuerst die Initialisierung und dann nur noch die 
Funktion zum senden der Zeichen?
Entschuldigt bitte aber ich bin noch ein Anfänger was die Programmierung 
in Bascom angeht. Ich habe aber in LCD mit dem HD Controller und würde 
es gerne testen.
Vielen Dank!

Autor: AL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich meine natürlich in C nicht bascom :)

Meine main.c sieht so aus:


#ifndef F_CPU
#define F_CPU 3686400
#endif
#include <lcd.h>

int main(void) {
 

  lcdInit('c');
  lcdClear('c');
  lcdSetCursor('c',5,5);
  lcdSetPixel(5,5,'s');
  
  
  
}
Dadrauf müsste das Display doch ansprechen oder? Bei mir leuchte aber 
alle Pixel .... :(

Autor: Sven S. (schwerminator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
schreib mal nur das folgende in die main.c:
#ifndef F_CPU
#define F_CPU 3686400
#endif
#include <lcd.h>

int main(void) {
 
  lcdInit('c');
  lcdClear('c');

}

Autor: AL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Antwort. Leider passiert weiterhin nichts. Ich bin mir 
nicht sicher ob ich alles richtig in der LCD.h konfiguriert habe.
Das sind meine Einstellungen:
#define DATAPORT  PORTA
#define DATADDR    DDRA
#define DATAPIN    PINA
#define CTRLPORT  PORTB
#define CTRLDDR    DDRB
#define RS      1
#define RW      2
#define E      0
#define CS      3
#define RESET    4
#define LED      5
Wobei mein Datenport auf dem Port A des AVR liegt, das müsste 
übereinstimmen.
RS auf PB.1
RW auf PB.2
E auf PB.0
CS und RESET habe ich nicht angeschlossen.
Ich muss dazu erwähnen das, dass Display aus einer Hicom Telefonanlage 
stammt. Ich habe die ganze Hauptplatine des Telefons genommen und mich 
dort an eine Anschlussleiste (alle Ausgänge des HD61830 sind dort 
ausgeführt) angeschlossen. Die RESET Leitung ist über einen 100kOhm 
Widerstand an GND angeschlossen und CS ebenfalls über einen Widerstand 
auf GND...
Soll das vl. eine Art sicherung sein um das Display nicht 
umprogrammieren zu können? Sollte Reset nicht auf VCC liegen?
Vielen Dank für eure Hilfe!

Autor: AL (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Im Anhang ist ein Foto von meinem Aufbau, damit ihr euch davon ein Bild 
machen könnt wie das aussieht.
LG

Autor: Sven S. (schwerminator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AL wrote:
> Sollte Reset nicht auf VCC liegen?

Ja!

Autor: AL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab die Reset Leitung auf VCC gelegt aber es passiert garnichts. Es 
leuchten weiterhin alle Pixel.... :(

Autor: Sven S. (schwerminator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bist du sicher, dass die schaltung auf der platine die funktion des 
hd61830 nicht beeinträchtigt?

Autor: AL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, sicher bin ich mir nicht.
Ich kann versuchen alle Leitungen die irgendwo andershin verlaufen zu 
trennen. Auf der Platine befindet sich noch ein Eeprom in dem 
anscheinende sich die Library mit den Characters befindet. Vom HD Chip 
gehen Leitungen zu diesem Eprom.
Im Prinzip aber brauche ich doch nur den HD61830 Chip, den 
Spannungsinverter für das LCD und mehr nicht, oder? Der HD Chip brauch 
im Prinzip auch nur die Datenleitungen sowie Steuerleitungen und die 8 
Leitungen die zu dem LCD gehen, denn Rest könnte ich abschalten.

LG

Autor: AL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktioniert alles ! :)
Es war die RESET Leitung und es war tatsächlich der Einfluss von den 
anderen Komponenten!

LG

Autor: TV freak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo all !
Ich versuche auch gerade ein Powertip PG240128X mit einem LC7981 
Controller
an einem Atmega 16 zu laufen zu bringen. Dieser Controller scheint ja 
wohl mit dem HD61830 kompatibel zu seien.
Jetzt zu meinem Problem :
Wie bekomme ich das hin das ich den Code von oben in einem Bascom 
Programm einbauen kann das dann die Zeichen zum Display sendet ??

gruss,  TV freak

Autor: Karl Heins (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe ebenfalls ein PowerTip PG240128X-P1 Display gekauft und dieses 
mit einem Mega32 verbunden. Mit dem oben genannten Sourcecode kann ich 
das Display zwar löschen, wenn ich das Display allerdings derart 
initialisiere:
lcdInit('g');
lcdClear('g');
lcdSetCursor('g', 0, 0);

und dann
for (cntx = 0; cntx < 100; cntx++) {
    lcdSetPixel(cntx,cntx,'s');
}

ausführe, erscheint nicht eine 100-Pixel lange, diagonale Linie auf dem 
Display, sondern es werden gleichzeitig vier Linien aufgebaut, die um 
1/4 der Displayhöhe versetzt sind und am linken Rand beginnen. Die Länge 
der Linien beträgt etwa 30 Pixel, allerdings mit Lücken ^^. Das Display 
hat eine Auflösung von 240x128 Pixel. Was ist das für ein komisches 
Problem? Ist mein Grafik-Controller etwa kaputt?

Autor: Karl Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mittlerweile vermute ich, dass die Datenleitungen 0 und 1 auf der 
Display-Steuerbaugruppe defekt sind - die Signale vom Mega32 kann ich an 
den Anschlusspins messen, aber sie werden nicht verarbeitet. Einen 4-Bit 
Modus gibt es nicht zufällig bei diesem Display-Controller, oder?

Autor: Nobi_noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich sehe das der thread etwas älter ist, aber, ich versuche seit 
einige Nächte Zeichen/Buchstaben aus zu geben, klappt aber nicht. Ich 
benutze die lib weiter oben. Habe diese korrekt angepasst (denke ich), 
linien zeichnen geht problemlos, text lässt sich aber nicht anzeigen. 
nach dem ich auf char mode umschalte werden die Linien gelöscht, der 
Cursor ist zu sehen (blinkend), mehr aber auch nicht. kann mir da jemand 
einen tipp geben, evtl hinwies auf eine "bessere"lib mit mehr 
Funktionen?
#include <lcd.h>
#include <util/delay.h>
#include <stdint.h>
#include <avr/io.h>
int main(void) {
 
  lcdInit('g');
lcdClear('g');
lcdSetCursor('g', 0, 0);
unsigned char cntx;

for (cntx = 0; cntx < 240; cntx++) {
    lcdSetPixel(cntx,10,'s');
  
}


//ich habe versucht auch mit lcdinit('c'); ins char mode zu wechseln aber geht auch nicht 


  lcdWritePair(0x00, 0x3c);  // Mode Control
    lcdWritePair(0x01, 0x75);  // Set Character Pitch
    lcdWritePair(0x02, 0x27);  // Set Number of Characters
    lcdWritePair(0x03, 0x7f);  // Set Number of Time Divisionsn 
    lcdWritePair(0x04, 0x07);  // Set Cursor Position
  _delay_ms(500);
  lcdWriteData(65); //sollte doch A oder e angezeigt werden
  

}

Ich habe es mit dem programmieren nicht so leicht, daher brauche ich 
eure hilfe. mfg.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.