Hallo,
ich progge immer noch für den 16F84 - hab mir aber jetzt einen 18F13?? besorgt - mal sehen. Es klappt jetzt jedenfalls.
Mein Code:
Code:
#define ENABLE PORTB.F0
#define RS PORTB.F2
#define RW PORTB.F3
#define D4 PORTB.F4
#define D5 PORTB.F5
#define D6 PORTB.F6
#define D7 PORTB.F7
#define T4 TRISB.F4
#define T5 TRISB.F5
#define T6 TRISB.F6
#define T7 TRISB.F7
void inittheLCD ();
void schreiben(char byte);
void controlachtbit(char byte);
void inittheLCD();
void OutLcdControl(char byte);
void display_loeschen_cursor();
void display_on();
void display_off();
void cursor_anfang();
void entry_mode();
void zwei_zeilig();
void ausfuehren();
void busy();
void schreiben(char byte);
void main() {
TRISB = 0;
PORTB = 0;
TRISA = 0;
PORTA = 0;
PORTA.F0 = 1;
inittheLCD();
PORTA.F0 = 0;
schreiben('H');
schreiben('a');
schreiben('l');
schreiben('l');
schreiben('o');
schreiben(' ');
schreiben('1');
schreiben('1');
schreiben('e');
schreiben('r');
Delay_ms(10);
while(1);
}
void inittheLCD()
{
/*Initialisierung des LCD-Displays*/
Delay_ms(250);
//LCD auf 8bit initialisieren (3mal)
controlachtbit(0b00110000);
Delay_ms(250);
controlachtbit(0b00110000);
Delay_ms(250);
controlachtbit(0b00110000);
Delay_ms(250);
controlachtbit(0b00110000);
Delay_ms(250);
//LCD auf 4bit initialisieren
controlachtbit(0b00100000);
Delay_ms(50);
//Display loeschen - curser home
display_loeschen_cursor();
Delay_ms(1050);
//2zeilig
zwei_zeilig();
Delay_ms(1050);
//Display: aus
display_off();
Delay_ms(1050);
//Eingabemodus
entry_mode();
Delay_ms(1050);
//Curser Anfang:
cursor_anfang();
Delay_ms(1050);
//Display: an
display_on();
Delay_ms(1050);
}
void controlachtbit(char byte)
{
/*Ein Steuerbyte 8bittig uebertragen*/
PORTB = 0;
D4 = byte.F4;
D5 = byte.F5;
D6 = byte.F6;
D7 = byte.F7;
ausfuehren();
//Test:
PORTA.F3 = D7;
return;
}
void OutLcdControl(char byte){
/*Ein Steuerbyte 4-bittig uebertragen*/
Delay_ms(40);//busy();
PORTB = 0;
D4 = byte.F4;
D5 = byte.F5;
D6 = byte.F6;
D7 = byte.F7;
ausfuehren();
Delay_ms(40);//busy();
PORTB = 0;
D4 = byte.F0;
D5 = byte.F1;
D6 = byte.F2;
D7 = byte.F3;
ausfuehren();
Delay_ms(40);//busy();
//Test:
PORTA.F2 = 1;
return;
}
void display_loeschen_cursor(){
//Display wird geloescht und Cursor an den Anfang gesetzt
OutLcdControl(1);
}
void display_on(){
//Display wird eingeschaltet
OutLcdControl(0b00001111);
}
void display_off(){
//Display wird ausgeschaltet
OutLcdControl(0b00001000);
}
void cursor_anfang(){
//Curser wird an den Anfang gesetzt
OutLcdControl(3);
}
void entry_mode(){
//LCD wird auf eingabemodus geschaltet
OutLcdControl(0b00000110);
}
void zwei_zeilig(){
//LCD wird auf 2 zeilig eingestellt
OutLcdControl(0b00101000);
}
void ausfuehren(){
//ein Befehl wird ausgefuehrt (LCD-ENABLE an und aus)
ENABLE = 1;
Delay_ms(15);
ENABLE = 0;
Delay_ms(15);
}
void busy(){
/*Diese Fkt. laueft solange bis das Busyflag 0 ist*/
PORTB = 0;
//Datenbus auf Eingabe schalten
T4 = 1;
T5 = 1;
T6 = 1;
T7 = 1;
RW = 1;
while(1){
ENABLE = 1;
Delay_ms(10);
if(D7 == 0)//Wenn das Busy-Flag 0 ist - dann wird diese Schleife abgebrochen
break;
ENABLE = 0;
Delay_ms(20);
ENABLE = 1;
Delay_ms(20);
ENABLE = 0;
Delay_ms(20);
}
ENABLE = 0;
Delay_ms(20);
ENABLE = 1;
Delay_ms(20);
ENABLE = 0;
//Datenbus auf Ausgabe schalten
T4 = 0;
T5 = 0;
T6 = 0;
T7 = 0;
PORTB = 0;
}
void schreiben(char byte){
Delay_ms(40);//busy();
PORTB = 0;
D4 = byte.F4;
D5 = byte.F5;
D6 = byte.F6;
D7 = byte.F7;
RS = 1;
ausfuehren();
Delay_ms(40);//busy();
PORTB = 0;
D4 = byte.F0;
D5 = byte.F1;
D6 = byte.F2;
D7 = byte.F3;
RS = 1;
ausfuehren();
Delay_ms(40);//busy();
}
Gruß,
Sebastian
Lesezeichen