Hallo,
danke für die schnelle Antwort. Die Zeichen verändern sich mittlerweile
nicht mehr. Aber es klappt immer noch nicht ganz. In der ersten Zeile
sollte "Zeile 1" und in der zweiten Zeile "Zeile 2" stehen. (In der
2.Zeile stehen zwei Blöcke mit seltsamen Zeichen.)
Ich habe die Fkt. jetzt geändert - hier noch mal mein Quelltext:
1 | #define ENABLE PORTB.F0
|
2 | #define RS PORTB.F2
|
3 | #define RW PORTB.F3
|
4 | #define D4 PORTB.F4
|
5 | #define D5 PORTB.F5
|
6 | #define D6 PORTB.F6
|
7 | #define D7 PORTB.F7
|
8 | #define T4 TRISB.F4
|
9 | #define T5 TRISB.F5
|
10 | #define T6 TRISB.F6
|
11 | #define T7 TRISB.F7
|
12 |
|
13 | void init_lcd();
|
14 | void lcd_write_data(char byte);
|
15 | void lcd_write_ctrl(char byte);
|
16 | void lcd_write_nibble(char byte);
|
17 | void lcd_pos(char x, char y);
|
18 | void lcd_text(char *string);
|
19 | char low_nibble;
|
20 | char high_nibble;
|
21 | unsigned char laenge;
|
22 | int i;
|
23 | char speicherstelle;
|
24 |
|
25 | void main(){
|
26 | init_lcd();
|
27 | lcd_pos(0,1);
|
28 | lcd_text("Zeile 1");
|
29 | lcd_pos(0,2);
|
30 | lcd_text("Zeile 2");
|
31 | while(1);
|
32 | }
|
33 | void init_lcd(){
|
34 | TRISB = 0;
|
35 | PORTB = 0;
|
36 | delay_ms(50);
|
37 | lcd_write_ctrl(0x30);
|
38 | delay_ms(50);
|
39 | lcd_write_ctrl(0x30);
|
40 | delay_ms(50);
|
41 | lcd_write_ctrl(0x30);
|
42 | delay_ms(50);
|
43 | lcd_write_ctrl(0x20);
|
44 | delay_ms(50);
|
45 | lcd_write_ctrl(0x28);
|
46 | delay_ms(50);
|
47 | lcd_write_ctrl(0x0C);
|
48 | delay_ms(50);
|
49 | lcd_write_ctrl(0x01);
|
50 | delay_ms(50);
|
51 | lcd_write_ctrl(0x0C);
|
52 | delay_ms(50);
|
53 |
|
54 | }
|
55 | void lcd_write_data(char byte){
|
56 | RS = 1;
|
57 | low_nibble = (byte & 15);
|
58 | high_nibble = (byte >> 4);
|
59 | lcd_write_nibble(high_nibble);
|
60 | lcd_write_nibble(low_nibble);
|
61 | }
|
62 | void lcd_write_ctrl(char byte){
|
63 | RS = 0;
|
64 | low_nibble = (byte & 15);
|
65 | high_nibble = (byte >> 4);
|
66 | lcd_write_nibble(high_nibble);
|
67 | lcd_write_nibble(low_nibble);
|
68 | }
|
69 | void lcd_write_nibble(char byte){
|
70 | D4 = byte.F0;
|
71 | D5 = byte.F1;
|
72 | D6 = byte.F2;
|
73 | D7 = byte.F3;
|
74 | ENABLE = 1;
|
75 | delay_ms(10);
|
76 | ENABLE = 0;
|
77 | delay_ms(50);
|
78 | PORTB = 0;
|
79 | }
|
80 | void lcd_pos(char x, char y){
|
81 | speicherstelle = 0;
|
82 | speicherstelle = x;
|
83 | if(y == 2) speicherstelle = speicherstelle + 64;
|
84 | lcd_write_ctrl(speicherstelle);
|
85 | }
|
86 | void lcd_text(char string[]){
|
87 | laenge = strlen(string);
|
88 | for(i = 0; i < laenge; i++){
|
89 | lcd_write_data(string[i]);
|
90 | }
|
91 |
|
92 | }
|
Vermutlich ist in der Fkt. lcd_pos auch noch ein Fehler.
Sebastian