Hallo
Ich weis, das Thema wurde schon öfters behandelt, ich fand auch was in
der SUFU, aber da trotz aller Sucherei mein Code immer noch nicht geht
wende ich mich mal an euch...
Also folgendes.
Ich habe ein 4*20 Zeichen Display an einem KS0073 Controller an einen
ATmega128 angeschlossen.
Ich habe das Display zum Test unter BASCOM angesteuert, da funktioniert
alles wunderbar. Unter C klappt das jedoch noch nicht.
Meine Beschaltung:
AVR -> LCD
-----------
PA0 -> D4
PA1 -> D5
PA2 -> D6
PA3 -> D7
PA4 -> E
PA5 -> RS
RW -> GND
Weil RW des LCDs mit GND verbunden ist, habe ich an Anlehnung dieses
Threads Beitrag "Re: DIP162 2x16 LCD Display von Conrad + Fleury"
die Funktion lcd_waitbusy() umgeschrieben.
Hier meine Codes:
Ausschnitt aus lcd.h
1 | /**
|
2 | * @name Definition for LCD controller type
|
3 | * Use 0 for HD44780 controller, change to 1 for displays with KS0073 controller.
|
4 | */
|
5 | #define LCD_CONTROLLER_KS0073 1 /**< Use 0 for HD44780 controller, 1 for KS0073 controller */
|
6 |
|
7 | /**
|
8 | * @name Definitions for Display Size
|
9 | * Change these definitions to adapt setting to your display
|
10 | */
|
11 | #define LCD_LINES 4 /**< number of visible lines of the display */
|
12 | #define LCD_DISP_LENGTH 20 /**< visibles characters per line of the display */
|
13 | #define LCD_LINE_LENGTH 0x40 /**< internal line length of the display */
|
14 | #define LCD_START_LINE1 0x00 /**< DDRAM address of first char of line 1 */
|
15 | #define LCD_START_LINE2 0x40 /**< DDRAM address of first char of line 2 */
|
16 | #define LCD_START_LINE3 0x14 /**< DDRAM address of first char of line 3 */
|
17 | #define LCD_START_LINE4 0x54 /**< DDRAM address of first char of line 4 */
|
18 | #define LCD_WRAP_LINES 0 /**< 0: no wrap, 1: wrap at end of visibile line */
|
19 |
|
20 |
|
21 | #define LCD_IO_MODE 1 /**< 0: memory mapped mode, 1: IO port mode */
|
22 |
|
23 |
|
24 | #define LCD_PORT PORTA /**< port for the LCD lines */
|
25 | #define LCD_DATA0_PORT LCD_PORT /**< port for 4bit data bit 0 */
|
26 | #define LCD_DATA1_PORT LCD_PORT /**< port for 4bit data bit 1 */
|
27 | #define LCD_DATA2_PORT LCD_PORT /**< port for 4bit data bit 2 */
|
28 | #define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */
|
29 | #define LCD_DATA0_PIN 0 /**< pin for 4bit data bit 0 */
|
30 | #define LCD_DATA1_PIN 1 /**< pin for 4bit data bit 1 */
|
31 | #define LCD_DATA2_PIN 2 /**< pin for 4bit data bit 2 */
|
32 | #define LCD_DATA3_PIN 3 /**< pin for 4bit data bit 3 */
|
33 | #define LCD_RS_PORT LCD_PORT /**< port for RS line */
|
34 | #define LCD_RS_PIN 5 /**< pin for RS line */
|
35 | #define LCD_RW_PORT LCD_PORT /**< port for RW line */
|
36 | #define LCD_RW_PIN 7 /**< pin for RW line */
|
37 | #define LCD_E_PORT LCD_PORT /**< port for Enable line */
|
38 | #define LCD_E_PIN 4 /**< pin for Enable line */
|
Ausschnitt aus lcd.c (P. Fleurys externem c-File)
Hier sieht man wie ich die lcd_waitbusy() manipuliert habe. Das sind
alle Änderungen im File.
1 | #include <util/delay.h>
|
2 |
|
3 | /*
|
4 | ** constant definitions
|
5 | */
|
6 | #ifndef F_CPU
|
7 | #define F_CPU 14745600 // CPU frequency
|
8 | #endif
|
9 |
|
10 | ...
|
11 |
|
12 |
|
13 | static uint8_t lcd_waitbusy(void)
|
14 | {
|
15 | _delay_ms( 10 );
|
16 |
|
17 | return 0;
|
18 |
|
19 | }/* lcd_waitbusy */
|
Und dann noch meine Ansteuerung in meinem eigenen c-File:
1 | int main(void)
|
2 | {
|
3 | /* Initialisiere Display, Cursor aus */
|
4 | lcd_init(LCD_DISP_ON);
|
5 |
|
6 | /* loesche das LCD Display und Cursor auf 1 Zeile, 1 Spalte */
|
7 | lcd_clrscr();
|
8 |
|
9 |
|
10 | /* String auf Display anzeigen */
|
11 | lcd_puts("Hello world.");
|
12 | _delay_ms(10000);
|
13 | while(1)
|
14 | {
|
15 |
|
16 | }
|
17 | return 0;
|
18 |
|
19 |
|
20 | }
|
Warum geht das nicht?
Ich habe die Delaytime auch schon etliche male variiert. Von 50µs bis
den 10ms war alles dabei...
Für mich stellt sich noch die Frage ob die Verdrahtung richtig ist. Ist
z.B.
#define LCD_DATA0_PIN 0 /**< pin for 4bit data bit 0 */
das nun D4 oder D7 des LCDs?