noch mal mit funktion void enable (void)
Code:
/** D E F I N I T I O N S ****************************************************/
#define PORTLCD LATB
#define TRIS_LCD TRISB
#define LCD_E PORTBbits.RB0
#define LCD_RS PORTBbits.RB2
#define LCD_RW PORTBbits.RB3
#define nop _asm nop _endasm // verzögerung 0,25µs
//****************************************************************************
#pragma code
void delay100us(unsigned char multiplikator)
// for PicLSBK (16MHz Taktzyklus = 4 MHz Befehlszyklus)
{
while(multiplikator--) Delay10TCYx(40); //40*10*0,25µs = 100 µs
}
void enable(void)
{
LCD_E = 1; // Daten übernehmen
delay100us(3);
LCD_E = 0;
}
void LCD_BUSY(void)
{
unsigned char temp1;
// unsigned char temp2;
do
{
TRIS_LCD = 0xF0; // LCD-PORT = high nibbles:eingang; low nibbles:ausgang
//Display abfrage
LCD_RS = 0; // LCD im Befehls-Mode
LCD_RW = 1; // LCD im Lesen-Mode
LCD_E = 1; // Enable (LCD)
temp1 = PORTLCD;
temp1 = temp1 & 0xF0; // Niederw.Nibble (steuerbits) ausmaskieren
LCD_E = 0; // toggeln
enable();
} while (temp1>=0x80);
delay100us(1);
LCD_RW = 0; // Busy = low: LCD im Schreiben-Mode
TRIS_LCD = 0x00; // LCD-PORT = Ausgänge
PORTLCD = 0x00; // Daten und Steuerleitungen LOW
}
void LCD_WriteZeichen(unsigned char zeichen)
{
unsigned char x;
delay100us(200);
// LCD_BUSY(); // Warten bis LCD bereit ist
LCD_RW = 0; // LCD im Schreiben-Mode
LCD_RS = 1; // LCD im Befehl-Mode
x = zeichen & 0xf0;
x = x | LCD_RS;
PORTLCD = x; //höherwertiges nibbel
nop;
enable();
delay100us(50); //5ms warten nach den 1.nibble
x = zeichen;
x = (x << 4)& 0xf0; //niederwertiges nibbel
x = x | LCD_RS;
PORTLCD = x;
enable();
delay100us(50); //5ms warten nach den 2.nibble
LCD_RS = 0;
}
void LCD_WriteString(unsigned char *String)
{
unsigned char zeichen;
zeichen = *String;
while(zeichen !='\0')
{
LCD_WriteZeichen(zeichen); // zeichen am LC-Display ausgeben
String++;
zeichen = *String;
}
}
void LCD_WriteRegister(unsigned char data)
{
unsigned char x;
delay100us(200);
// LCD_BUSY(); // Warten bis LCD bereit ist
// LCD_RW = 0; // LCD im Schreiben-Mode
// LCD_RS = 0; // LCD im Befehl-Mode
x = data & 0xf0;
PORTLCD = x; //höherwertiges nibbel
enable();
delay100us(50); //5ms warten nach den 1.nibble
x = data;
x = (x << 4)& 0xf0; //niederwertiges nibbel
PORTLCD = x;
enable();
delay100us(50); //5ms warten nach dem 2.nibble
}
void LCD_Init(void)
{
// LCD initialisieren
TRIS_LCD = 0x00; // LCD-PORT = Ausgänge
PORTLCD = 0x00; // Daten und Steuerleitungen LOW
delay100us (150);
delay100us (150); // warte über 30ms
delay100us (100);
PORTLCD = 0x30; // Interface auf 8-Bit setzen
enable();
delay100us(50); //warte 5ms
// Interface auf 8-Bit setzen
enable(); // Enable (LCD)
delay100us(2); //warte 200µs
enable(); // Interface auf 8-Bit setzen
// Enable (LCD)
delay100us(2); //warte 200µs
PORTLCD = 0x20; // Interface auf 4-Bit setzen
enable(); // Enable (LCD)
LCD_WriteRegister(0x28); // 2-zeilig, 5x8-Punkt-Matrix
LCD_WriteRegister(0x08); // Display aus
LCD_WriteRegister(0x01); // Display löschen
LCD_WriteRegister(0x06); // Kursor nach rechts wandernd, kein Display-Shift
LCD_WriteRegister(0x0f); // Display ein [ 0x0C = ein, 0x08 = aus ]
}
void main (void)
{
LCD_Init();
LCD_WriteZeichen('t');
LCD_WriteZeichen('x');
}
Lesezeichen