PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mikrocontroller ADuC812, uVision2, LCD ansteuern



AM
22.09.2004, 16:48
Hallo,

ich programmiere seit 2 Tagen Mikrocontroller in C (uVision2) und habe daher noch nicht die Erfahrung! Derzeit versuche ich ein LCD (AV1624) anzusteuern. Ich hab das Datenblatt des Displays durchgearbeitet und danach meinen C-Code geschrieben (siehe unten!). Ich hab keine Ahnung was ich da falsch gemacht habe (kenn mich ja noch nicht besonders aus). Vielleicht kann mir jemand einen Tip geben.


Mein LCD-File:


#include <stdio.h>
#include <ADUC812.H>
#include "LCD.h"


#define COMMAND 0x30 // 0011 0000 (ist das Initialisierungskommando => aus Datenblatt)
#define BUSY 0x80 // Bit 7 (von Port 0.7 ist gesetzt, wenn Display für den Empfang
// weiterer Daten noch nicht bereit ist!)

#define WAIT_WHILE_BUSY { while (ReadBusyFlag() & BUSY); }


// LCD-Datenpins liegen auf Port 0 (0.0-0.7)
//
// E RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
//
// P2.2 P2.1 P2.0 P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0
//

// um die Portpins einzeln ansprechen zu können:
sbit RS = I2CCON^1; // Register Select: RS = 1: Daten werden gesendet!
// RS = 0: Kommando wird gesendet!
sbit RW = I2CCON^0; // Read/Write-Pin: Read = 1 / Write = 0
sbit Enable = I2CCON^2; // bei fallender Flanke (1->0) werden die Werte der Daten- und
// Steuerleitungen vom Display eingelesen!


void InitLCD() // Initialisierungsschleife aus Datenblatt
{
Wait(300);

RS = 0; // dem Display anzeigen, dass ein Kommando gesendet werden soll
RW = 0; // Schreiben!
P0 = COMMAND;
Enable = 1; // Daten werden bei fallender Flanke (1->0) übernommen
Wait(500); // kurz warten
Enable = 0;

Wait(300);
RS = 0; RW = 0;
P0 = COMMAND;
Enable = 1;
Wait(300); // kurz warten
Enable = 0;


Wait(300); // 100 us warten

RS = 0;
RW = 0;
P0 = COMMAND;
Enable = 1;
Wait(300); // kurz warten
Enable = 0;

Wait(300); // 100 us warten

// Display-Mode festlegen
RS = 0;
RW = 0;
P0 = 0x38; // 00111000
Enable = 1; // |||
Wait(300); // || \- Zeichenfont 5x7
Enable = 0; // | \-- 2 Zeilen
// \--- 8-Bit Mode
Wait(300);// ab hier kann das Busy-Flag abgefragt werden!
// Display einschalten
RS = 0;
RW = 0;
P0 = 0x3c; // 00111100
Enable = 1; // |||
Wait(300); // || \- Zeichen unter dem Cursor blinkt nicht
Enable = 0; // | \-- Cursor sichtbar
// \--- Display einschalten
Wait(300);//WAIT_WHILE_BUSY; // warten, bis Busy-Flag vom Displaycontroller gelöscht wird

// Display löschen
RS = 0;
RW = 0;
P0 = 0x01; // Kommando "Display löschen"
Enable = 1;
Wait(300); Enable = 0;

Wait(300);
//WAIT_WHILE_BUSY;

// Entry Mode Set
RS = 0;
RW = 0;
P0 = 0x06; // 00000110
Enable = 1; // ||
Wait(300); // | \- Displayinhalt nicht schieben
Enable = 0; // \-- Adresspointer inkrementieren

Wait(300);
}


unsigned char ReadBusyFlag()
{
RS = 0;
RW = 1;
Enable = 1;
Wait(300);
Enable = 0;

return P0;
}


void WriteChar (unsigned char Data)
{
WAIT_WHILE_BUSY;

RS = 1; // signalisieren, dass Daten gesendet werden
RW = 0; // will schreiben

P0 = Data; // Daten an den Port legen!

Enable = 1;
Wait(300);
Enable = 0;
Wait(300);
}


void WriteText (char *Data)
{
while (*Data)
{
WriteChar (*Data++);
}
}


void Wait(unsigned int i)
{
for (; i >= 0; i--);
}



Mein"Main"-File:

#include <stdio.h>
#include <ADUC812.H>
#include "LCD.h"


void main (void)
{
InitLCD();

WriteChar('T');

while (1);// WriteText ("Test");
}


Ich hab die Files auch noch mal im Anhang beigefügt!


Danke!!! \:D/ [/b]

D.Stolarek
23.09.2004, 09:34
also ich hab zwar programmier kenntnisse von c aber ich weiss trotzdem nich obs stimmt
also das was ich glaube ist, das du vergessen hast im main file die ganzen sachen wieder zurück zu bringen die bei return stehen

du hast ja öfters return stehen und beim normalen windows c muss man diese wieder im main prog einfügen also das ist das was ich glaube es muss nich richtig sein aber versuchen kann mans

23.09.2004, 09:45
Danke, werd ich versuchen

23.09.2004, 10:28
Ich weiß zwar nicht was du meinst D.Stolarek, aber es hört sich falsch an was du erzählst

D.Stolarek
23.09.2004, 12:13
also beim normalen c ists so das man die werte wieder zurück ins prog bringen muss um diese dann weiter zu benutzen in z.b. anderen progs für andere funktionen

er arbeitet halt nich mit pointern wenn er das täte könnte er auf den richtigen wert zeigen und den dann benutzen

den man kann da nich dem hauptprog sagen mach mal das ohne das er irgendwelche werte hat

also ist das meiner meinung nach richtig, denn der soll die sachen dann ja zum beispiel auf 1 setzen können

ich glaube da ist aber auch nen anderer fehler den er hat einen wert bei p0 drin in unsigned char ReadBusyFlag() den er dann wieder zurück gibt

und in dem prog darunter schreibt er in p0 nen anderen wert rein nämlich data

also ich meine da ist was falsch

AM
23.09.2004, 13:42
Das mit dem "return" war nicht das Problem!
Ich habe in der wait-Funktion einen Fehler gefunden!

for (; i > 0; i--); statt for (; i >= 0; i--);

D.h. das Display meldet sich schon! Ich kann jetzt zwar Text auf dem
LCD ausgeben, jedoch schreibt mir das Display den Text über den
Displayrand hinaus und ich hab keine Ahnung wie ich das ändere.

Ich möchte nämlich eine Funktion schreiben, bei der ich ein bestimmtes Zeichen im Display ansteuern und verändern kann (z. B.: Zeichen 3 in Zeile 2).


Kann mir da jemand weiterhelfen?


Danke!!!

13.01.2005, 10:17
Das mit dem "return" war nicht das Problem!
Ich habe in der wait-Funktion einen Fehler gefunden!

for (; i > 0; i--); statt for (; i >= 0; i--);

D.h. das Display meldet sich schon! Ich kann jetzt zwar Text auf dem
LCD ausgeben, jedoch schreibt mir das Display den Text über den
Displayrand hinaus und ich hab keine Ahnung wie ich das ändere.

Ich möchte nämlich eine Funktion schreiben, bei der ich ein bestimmtes Zeichen im Display ansteuern und verändern kann (z. B.: Zeichen 3 in Zeile 2).


Kann mir da jemand weiterhelfen?


Danke!!!kann jemand sagen, wo man uVision 2 kostengünstig herbekommt.