Hallo liebe Leute,
so... hier der 1000ste 44780-lcd-Beitrag : )
Ich mach's kurz:
Entwicklungsboard mikroelektronika easyavr5a
uc Atmega8
c mit winavr/gcc
2x16 LCD, Industriestandard
Leine Busy-Abfrage (RW nicht geroutet)
Verdrahtung fix, siehe header.
Hier der Header für die LCD-Funktionen:
1 | /* lcd-routinen hd44780 4-bit */
|
2 |
|
3 | #include <util/delay.h>
|
4 | #include <inttypes.h>
|
5 |
|
6 | #define _lcdport PORTD
|
7 | #define _lcddirection DDRD
|
8 | #define _rs PD2
|
9 | #define _en PD3
|
10 | #define _d4 PD4
|
11 | #define _d5 PD5
|
12 | #define _d6 PD6
|
13 | #define _d7 PD7
|
14 |
|
15 |
|
16 | void initlcd (void);
|
17 | void lcden (void);
|
18 | void lcdcom (uint8_t sendbyte);
|
19 | void lcddata (uint8_t sendbyte);
|
20 | void lcdstring (char *stringpointer);
|
21 | char lcdcursor (uint8_t line, uint8_t column);
|
22 |
|
23 | void initlcd (void) {
|
24 | _delay_ms(20);
|
25 | _delay_ms(20);
|
26 | _delay_ms(20);
|
27 | _delay_ms(20);
|
28 | _delay_ms(20);
|
29 |
|
30 | _lcddirection|=(1<<_rs)|(1<<_en)|(1<<_d4)|(1<<_d5)|(1<<_d6)|(1<<_d7);
|
31 | _lcdport|=(1<<_d6)|(1<<_d7); // init command 0x30
|
32 | lcden();
|
33 | _delay_ms(20);
|
34 | lcden();
|
35 | _delay_ms(20);
|
36 | lcden();
|
37 | _delay_ms(20);
|
38 | _lcdport=(1<<_d5); // init command 0x20 4-bit-mode
|
39 | _delay_ms(20);
|
40 | lcdcom(0b00101000);
|
41 | lcdcom(0b00001100);
|
42 | lcdcom(0b00010100);
|
43 | lcdcom(0b00000110);
|
44 | lcdcom(0b00000001);
|
45 | lcdcom(2);
|
46 | _delay_ms(20);
|
47 |
|
48 | }
|
49 |
|
50 | void lcden (void) { // enable-pulse
|
51 | _lcdport|=(1<<_en);
|
52 | _delay_ms(1);
|
53 | _lcdport&=~(1<<_en);
|
54 | _delay_ms(1);
|
55 | }
|
56 |
|
57 | void lcdcom (uint8_t sendbyte) {
|
58 | _lcdport=sendbyte; // erst upper nibble
|
59 | _lcdport=_lcdport&0xF0; // mask lower nibble
|
60 | lcden();
|
61 | sendbyte=sendbyte<<4; // lower nibble hochschieben
|
62 | _lcdport=sendbyte;
|
63 | _lcdport=_lcdport&0xF0; // mask lower nibble
|
64 | lcden();
|
65 | }
|
66 |
|
67 | void lcddata (uint8_t sendbyte) {
|
68 | _lcdport=sendbyte; // erst upper nibble
|
69 | _lcdport=_lcdport&0xF0; // mask lower nibble
|
70 | _lcdport|=(1<<_rs); // rs setzen, daten
|
71 | lcden();
|
72 | sendbyte=sendbyte<<4; // lower nibble hochschieben
|
73 | _lcdport=sendbyte;
|
74 | _lcdport=_lcdport&0xF0; // mask lower nibble
|
75 | _lcdport|=(1<<_rs); // rs setzen, daten
|
76 | lcden();
|
77 | _lcdport&=~(1<<_rs); // rs zurücksetzen
|
78 |
|
79 |
|
80 | void lcdstring (char *stringpointer){
|
81 | while(*stringpointer)
|
82 | lcddata(*stringpointer++);
|
83 | }
|
Jetzt die Preisfrage:
Wenn ich den header includiere, die init gefolgt von einer Textausgabe
aufrufe, passiert folgendes:
- Es werden je nach Text tlw. völlig sinnlose Zeichen ausgegeben. So
führt zum Beispiel der String "Test" zur Ausgabe von "Test". Der String
"KURTKROEMER" bringt aber "D_einhalb_U%". Mehr als vier Zeichen werde
nie angezeigt. Selstamerweise verhält es sich bei einem Einzelnen
Zeichen (gehen auch nich alle. "Q" z.B. geht) so, dass exakt jeder
zweite Reset eine Ausgabe bringt. In den Resets dazwischen wird nichts
angezeigt.
Hat jemand die Glaskugel gerade NICHT in reparatur und eine Idee?
Oder vielleicht zufällig gerade was in der Richtung aufgebaut, um den
Code an einem Anderen Display zu testen?
Tausen Dank im Voraus,
Thomas