PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 18f242 displayansteuerung in c



obi134
09.09.2008, 21:40
Hi !
Ich wollte mal probieren mit c (c18-compiler von microchip) ein mein display anzusteuern. aber irgendwie klappt wohl die Initialisierung des Displays nicht. Aber ich finde den Fehler nicht :-s Könnt ihr da vielleicht mal drüber gucken? danke schonmal
Gruß



/** I N C L U D E S ************************************************** ********/

#include <p18f242.h>

#include "delays.h"



/** C O N F I G U R A T I O N ************************************************/

#pragma config OSC = HS //CPU=20 MHz

#pragma config PWRT = ON

#pragma config BOR = OFF

#pragma config WDT = OFF //Watchdog Timer

#pragma config LVP = OFF //Low Voltage ICSP



/** D E C L A R A T I O N S **************************************************/

#define XRS LATCbits.LATC4

#define XWR LATCbits.LATC5

#define E LATCbits.LATC6

#define text HALLO



#define DISPLAY_BREITE 20



/** C O D E **************************************************/

#pragma code



void LCD_Init(void);

void LCD_send_cmd(char command);

void send(void);

void main(void)

{

LATB = 0x00;

TRISB = 0x00;

LATC = 0x00;

TRISC = 0x8f; //10001111, RC0 - RC3 input, RC4 - RC6 output

LCD_Init();

} //end main





//******************************** LCD ************************************
//************************************************** ***********************
// LCD_Init():
//
// Initialisierung des LCD-Displays.
//
//************************************************** ***********************

void LCD_Init()
{

LCD_send_cmd(0x38); // Interface data length: 8 bit, zweizeilig, 5x7 Dots
LCD_send_cmd(0x38); // Interface data length: 8 bit, zweizeilig, 5x7 Dots
LCD_send_cmd(0x38); // Interface data length: 8 bit, zweizeilig, 5x7 Dots
LCD_send_cmd(0x38); // Interface data length: 8 bit, zweizeilig, 5x7 Dots
LCD_send_cmd(0x0E); // Display On: ON, Cursor ON, ohne Blinken
LCD_send_cmd(0x01); // clear display
LCD_send_cmd(0x06); // Entry Mode Set: inkrementieren / Cursor automatisch

} // LCD_Init

//************************************************** ***********************
// LCD_send_char(char zeichen):
//
// Ausgabe des Zeichens <zeichen> an der aktuellen Cursorposition.
//
//************************************************** ***********************

void LCD_send_char(char zeichen)
{


LATB = zeichen;
send();
Delay10KTCYx(63);


} // LCD_send_char

//************************************************** ***********************
// LCD_send_cmd(char command):
//
// Senden des Befehls <command> zum LCD-Display
//
//************************************************** ***********************

void LCD_send_cmd(char command)
{


LATB = command;
send();
Delay10KTCYx(255);


} // LCD_send_cmd

//************************************************** ***********************
// LCD_outtext(char x, char y,const char *text):
//
// Ausgabe von <text> an der aktuellen Cursorposition.
//
//************************************************** ***********************

void LCD_outtext(char x, char y, const char *text)
{

switch(y)
{
case 1:

LCD_send_cmd(x + 0x07F);
break;

case 2:
LCD_send_cmd(x + 0x0BF);
break;

case 3:
LCD_send_cmd(x + 0x093);
break;

case 4:
LCD_send_cmd(x + 0x0D3);
break;

} // switch(y)

while(*text && (x++ <= DISPLAY_BREITE)) LCD_send_char(*text++);

} // LCD_outtext



void send()

{

XWR = 0;

XRS = 1;

E = 1;

Delay10TCYx(1);

E = 0;

XRS = 0;
XWR = 1;

}

obi134
10.09.2008, 21:40
keine antwort?
Also Grundsätzlich ist rigendwas mit der Initialisierungsroutine falsch denke ich weil ich nur 2 voll ausgefüllte zeilen auf dem display sehe...kennt sich da keiner mit aus?

the_Ghost666
10.09.2008, 22:55
Ich hab zwar nicht den C18 compiler genutzt, aber so ein Fehler tritt bei mir auf, wenn ich die Zeiträume zwischen den Aufrufen nicht einhalte. Stimmt das bei dir wirklich? du verwendest ja immer die gleiche LCD_send_cmd Routine. Gerade bei der Initialisierung braucht er aber mehr Zeit, als später beim Betrieb. Delay10KTCYx 255 bedeutet eine verzögerung um 2.550.000 Taktzyklen? Bei was für nem Takt?
Stimmen die Wartezeiten zwischen dem Einschalten des Enable-Pins und dem Ausschalten, das Display braucht einige µs um die Daten zu übernehmen.