Anfängerin
21.07.2004, 11:14
Hallo ihr alle,
ich arbeite momentan mit einem "Scheckkartenmodul" von Philips, einem miniModul-552. Darauf befindet sich ein 80C552 Microcontroller. Ans Scheckkartenmodul angeschlossen ist ein 20x4 LCD-Display.
Die Verdrahtung an sich ist eigentlich recht einfach, hier eine kleine Tabelle dazu:
-Steuerleitungen-
MUC (Port) LCD (Pin, "Input")
4.0 4 (rs, rs=0 -> Befehlsregister;
rs=1 ->Datenregister)
4.1 5 (r/w, read/write)
4.2 6 (e, enable)
-Datenleitungen-
MUC (Port) LCD (Pin, "Input")
1.0 - 1.7 16-23 (=D0-D7)
Sodale, und nun bin ich gerade am Ausprobieren, wie ich denn nun einfach ein kleines "Hallo Welt" auf das Display zaubern könnte. Ich hab ausm Internet einen Code übernommen, der diente zur Ansteuerung eines 20x4-Displays vom LPT-Port aus. Nun muss ich das ja nur noch auf die Pins meines Mikrocontrollers richtig "umschreiben", oder?
Oder gibt es sonst noch was zu beachten?
Im Moment hänge ich gerade an der LCD_Init()-Funktion (Code s.u.)
Das Display wird zwar gelöscht, aber das liegt wohl an der InitDriverFunktion.....Aber mehr macht mir das Display nicht....und ich komme nicht drauf, woran das liegen könnte....Meint ihr, der Code ist so wie er jetzt ist, noch fehlerhaft???
Hier sind einmal die (hoffentlich) relevanten Code-Fragemente:
hier die main:
char *lcd_text[] = {"12345678901234567890", "12345678901234567890", "12345678901234567890", "12345678901234567890"}; //4 columns a 20 rows
void main (void)
{
while (1)
{
char done = 0;
// initialize the LCD module
LCD_Init();
// test sequence in order to demonstrate the functionality of the LCD
while (!done)
{
//gebe Zeichen aufm Display aus....
}
}
}
hier die Init-Funktion:
void LCD_Init (void)
{
LCD_InitDriver();
LCD_Clear();
LCD_CursorOff();
}
static void LCD_InitDriver (void)
{
LCD_WriteControl(0x38);
LCD_WriteControl(0x38);
LCD_WriteControl(0x38);
LCD_WriteControl(0x06);
LCD_WriteControl(0x0c);
}
Jetzt kommt der "kritische" Teil ;-)
Hier habe ich versucht, die einzelnen Pins HIGH oder LOW zu setzen, anhand der outport-Funktion...Aber outport() ist ja eine DOS-Funktion, und daher für Mikrocontroller ungeeignet.
Meint ihr, das stimmt so, wie ich das hier versucht habe???
static void LCD_WriteControl (unsigned char my_data)
{
P4_0 = 0x0; P4_1 = 0x0; P4_2 = 0x0;
// outport(LCD_CONTROL_ADDRESS,0x03); // RS=0, R/W=0, E=0
P1 = my_data;
// char=1Byte,braucht alle Pins von Port 1
// outport(LCD_DATA_ADDRESS,data);
P4_0 = 0x0; P4_1 = 0x0; P4_2 = 0x1;
// outport(LCD_CONTROL_ADDRESS,0x02); // RS=0, R/W=0, E=1
P4_0 = 0x0; P4_1 = 0x0; P4_2 = 0x0;
// outport(LCD_CONTROL_ADDRESS,0x03); // RS=0, R/W=0, E=0
P4_0 = 0x0; P4_1 = 0x1; P4_2 = 0x0;
// outport(LCD_CONTROL_ADDRESS,0x01); // RS=0, R/W=1, E=0
//hier benötige ich noch eine delay-Funktion für ein delay von 10ms!!!
/* delay(1000);*/ // 10ms delay
}
ich arbeite momentan mit einem "Scheckkartenmodul" von Philips, einem miniModul-552. Darauf befindet sich ein 80C552 Microcontroller. Ans Scheckkartenmodul angeschlossen ist ein 20x4 LCD-Display.
Die Verdrahtung an sich ist eigentlich recht einfach, hier eine kleine Tabelle dazu:
-Steuerleitungen-
MUC (Port) LCD (Pin, "Input")
4.0 4 (rs, rs=0 -> Befehlsregister;
rs=1 ->Datenregister)
4.1 5 (r/w, read/write)
4.2 6 (e, enable)
-Datenleitungen-
MUC (Port) LCD (Pin, "Input")
1.0 - 1.7 16-23 (=D0-D7)
Sodale, und nun bin ich gerade am Ausprobieren, wie ich denn nun einfach ein kleines "Hallo Welt" auf das Display zaubern könnte. Ich hab ausm Internet einen Code übernommen, der diente zur Ansteuerung eines 20x4-Displays vom LPT-Port aus. Nun muss ich das ja nur noch auf die Pins meines Mikrocontrollers richtig "umschreiben", oder?
Oder gibt es sonst noch was zu beachten?
Im Moment hänge ich gerade an der LCD_Init()-Funktion (Code s.u.)
Das Display wird zwar gelöscht, aber das liegt wohl an der InitDriverFunktion.....Aber mehr macht mir das Display nicht....und ich komme nicht drauf, woran das liegen könnte....Meint ihr, der Code ist so wie er jetzt ist, noch fehlerhaft???
Hier sind einmal die (hoffentlich) relevanten Code-Fragemente:
hier die main:
char *lcd_text[] = {"12345678901234567890", "12345678901234567890", "12345678901234567890", "12345678901234567890"}; //4 columns a 20 rows
void main (void)
{
while (1)
{
char done = 0;
// initialize the LCD module
LCD_Init();
// test sequence in order to demonstrate the functionality of the LCD
while (!done)
{
//gebe Zeichen aufm Display aus....
}
}
}
hier die Init-Funktion:
void LCD_Init (void)
{
LCD_InitDriver();
LCD_Clear();
LCD_CursorOff();
}
static void LCD_InitDriver (void)
{
LCD_WriteControl(0x38);
LCD_WriteControl(0x38);
LCD_WriteControl(0x38);
LCD_WriteControl(0x06);
LCD_WriteControl(0x0c);
}
Jetzt kommt der "kritische" Teil ;-)
Hier habe ich versucht, die einzelnen Pins HIGH oder LOW zu setzen, anhand der outport-Funktion...Aber outport() ist ja eine DOS-Funktion, und daher für Mikrocontroller ungeeignet.
Meint ihr, das stimmt so, wie ich das hier versucht habe???
static void LCD_WriteControl (unsigned char my_data)
{
P4_0 = 0x0; P4_1 = 0x0; P4_2 = 0x0;
// outport(LCD_CONTROL_ADDRESS,0x03); // RS=0, R/W=0, E=0
P1 = my_data;
// char=1Byte,braucht alle Pins von Port 1
// outport(LCD_DATA_ADDRESS,data);
P4_0 = 0x0; P4_1 = 0x0; P4_2 = 0x1;
// outport(LCD_CONTROL_ADDRESS,0x02); // RS=0, R/W=0, E=1
P4_0 = 0x0; P4_1 = 0x0; P4_2 = 0x0;
// outport(LCD_CONTROL_ADDRESS,0x03); // RS=0, R/W=0, E=0
P4_0 = 0x0; P4_1 = 0x1; P4_2 = 0x0;
// outport(LCD_CONTROL_ADDRESS,0x01); // RS=0, R/W=1, E=0
//hier benötige ich noch eine delay-Funktion für ein delay von 10ms!!!
/* delay(1000);*/ // 10ms delay
}