Hallo zusammen, ich möchte ein LCD aus einem NOKIA 3410 per Mega8 ansteuern (Hardware SPI). Ich habe mir also das Datenblatt des PCD 8544 und ein paar fertige Codes aus dem Netz angeschaut. Die Ansteuerung des Displays sollte ja genauso wie beim 3310 funktionieren. Folgenden Code habe ich dann mal zum initialisieren des Displays geschrieben. Alles was das Display nach dem Einschalten der Betriebsspannung macht ist, dass der untere Rand des Displays kurz aufflackert, dann wird nichts angezeigt. Nach dem Ausschalten wird dann noch für ein paar Sekunden (abhängig von der Größe des Kondensators an Vlcd) eine horizontale Linie angezeigt. Diese erscheint an rein zufälliger Stelle. Weiß jemand, was an meinem Code fehlt? Verwendede HW: Mega8L8 @3,0V 4,0Mhz ext. Quarz
1 | #include <avr/io.h> |
2 | #include <stdlib.h> |
3 | #include <util/delay.h> |
4 | |
5 | #define LCD_CS PB1 // 0 = active
|
6 | #define LCD_DC PB0 // command: DC = 0 | data: DC = 1
|
7 | #define LCD_RES PD7 // 0 = reset
|
8 | #define SS PB2
|
9 | #define MOSI PB3
|
10 | #define MISO PB4
|
11 | #define SCK PB5
|
12 | |
13 | #define LCD_ENABLE PORTB&=~(1<<LCD_CS)
|
14 | #define LCD_DISABLE PORTB|=(1<<LCD_CS)
|
15 | #define LCD_DATA PORTB|=(1<<LCD_DC)
|
16 | #define LCD_COMMAND PORTB&=~(1<<LCD_DC)
|
17 | |
18 | // prototypes:
|
19 | void lcd_command(unsigned char command); |
20 | void lcd_data(unsigned char data); |
21 | unsigned char spi_putc(unsigned char byte_in); |
22 | |
23 | |
24 | |
25 | int main(void) |
26 | {
|
27 | DDRD |= (1<<LCD_RES); |
28 | PORTD &= ~(1<<LCD_RES); |
29 | DDRB |= ((1<<SS) | (1<<LCD_CS) | (1<<LCD_DC) | (1<<SCK) | (1<<MOSI)); // output |
30 | DDRB &= ~(1<<MISO); // input |
31 | PORTB |= ((1<<SS) | (1<<LCD_CS) | (1<<LCD_DC)); // pullups |
32 | |
33 | // low pulse to RES-pin to enable LCD
|
34 | _delay_ms(100); |
35 | PORTD |= (1<<LCD_RES); |
36 | |
37 | // enable spi
|
38 | SPCR |= ((1<<SPE)|(1<<MSTR)|(1<<SPR0)); //Enable SPI, SPI in Master Mode, presc = 16 |
39 | |
40 | |
41 | |
42 | lcd_command(0x21); |
43 | lcd_command(0xC8); |
44 | lcd_command(0x06); |
45 | lcd_command(0x13); |
46 | lcd_command(0x20); |
47 | lcd_command(0x0C); |
48 | |
49 | _delay_ms(100); |
50 | |
51 | lcd_data(0x1F); |
52 | lcd_data(0x1F); |
53 | lcd_data(0x1F); |
54 | |
55 | |
56 | |
57 | |
58 | while(1) |
59 | {
|
60 | }
|
61 | }
|
62 | |
63 | |
64 | |
65 | void lcd_command(unsigned char command) |
66 | {
|
67 | LCD_ENABLE; |
68 | |
69 | LCD_COMMAND; |
70 | |
71 | spi_putc(command); |
72 | |
73 | LCD_DISABLE; |
74 | }
|
75 | |
76 | void lcd_data(unsigned char data) |
77 | {
|
78 | LCD_ENABLE; |
79 | |
80 | LCD_DATA; |
81 | |
82 | spi_putc(data); |
83 | |
84 | LCD_DISABLE; |
85 | }
|
86 | |
87 | |
88 | unsigned char spi_putc(unsigned char byte_in) |
89 | {
|
90 | SPDR = byte_in; |
91 | while(!(SPSR & (1<<SPIF))); //Wartet bis Byte gesendet wurde |
92 | unsigned char byte_out = SPDR; |
93 | return byte_out; |
94 | }
|
Gruß, Markus