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]
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]