Hallo, ich versuche gerade ein LCD mit T6963C Controller zum laufen zu bringen (128x64 LCD von Pollin). Leider bekomme ich überhaupt nichts angezeigt. Theoretisch müßten beim Aufruf von lcd_init() 10 "A"s angezeigt werden. Ich würde mich freuen, wenn jemand meinen Code überprüfen könnte. Verdrahtung habe ich überprüft. Der LCD-Reset erfolgt über eine RC-Kombination (10k-10uF). Controller: Renesas M16C62P Taktfrequenz: 24MHz Board: Renesas SKP16C62P Compiler: NC30 t6963.h:
1 | #define DATA p0
|
2 | #define DATA_DIR pd0
|
3 | |
4 | #define CD p1_0
|
5 | #define CD_DIR pd1_0
|
6 | #define CE p1_1
|
7 | #define CE_DIR pd1_1
|
8 | #define RD p1_2
|
9 | #define RD_DIR pd1_2
|
10 | #define WR p1_3
|
11 | #define WR_DIR pd1_3
|
12 | |
13 | #define STA0 0x01
|
14 | #define STA1 0x02
|
15 | |
16 | int lcd_init(void); |
17 | void lcd_wr_cmd(unsigned char cmd); |
18 | void lcd_wr_data(unsigned char data); |
19 | unsigned char lcd_rd_data(void); |
t6963.c:
1 | #include "t6963.h" |
2 | #include "skp_bsp.h" |
3 | |
4 | int lcd_check_status(void); |
5 | void lcd_test_status(void); |
6 | |
7 | inline void nop(void) |
8 | {
|
9 | _asm("NOP"); |
10 | }
|
11 | |
12 | int lcd_init(void) |
13 | {
|
14 | int i; |
15 | |
16 | pu00 = 0; pu01 = 0; pu02 = 0; // turn off pullups |
17 | RD = 1; WR = 1; CE = 1; CD = 1; |
18 | CD_DIR = 1; CE_DIR = 1; RD_DIR = 1; WR_DIR = 1; |
19 | DATA_DIR = 0; |
20 | |
21 | lcd_wr_data(0x00); |
22 | lcd_wr_data(0x02); |
23 | lcd_wr_cmd(0x42); // graphics home address (0x200) |
24 | |
25 | lcd_wr_data(0x16); |
26 | lcd_wr_data(0x00); |
27 | lcd_wr_cmd(0x43); // graphics area set |
28 | |
29 | lcd_wr_data(0x00); |
30 | lcd_wr_data(0x00); |
31 | lcd_wr_cmd(0x40); // text home address (0x0000) |
32 | |
33 | lcd_wr_data(0x16); |
34 | lcd_wr_data(0x00); |
35 | lcd_wr_cmd(0x41); // text area set |
36 | |
37 | lcd_wr_cmd(0x80); // mode set (OR mode, internal CG) |
38 | |
39 | lcd_wr_cmd(0x97); // display mode |
40 | |
41 | lcd_wr_data(0x00); |
42 | lcd_wr_data(0x00); |
43 | lcd_wr_cmd(0x24); // set address pointer |
44 | |
45 | |
46 | for (i=0;i<10;i++) { |
47 | lcd_wr_data(0x21); // 'A' |
48 | lcd_wr_cmd(0xC0); // write 1 byte |
49 | }
|
50 | |
51 | return 0; |
52 | }
|
53 | |
54 | |
55 | void lcd_wr_cmd(unsigned char cmd) |
56 | {
|
57 | lcd_test_status(); |
58 | |
59 | DATA_DIR = 1; |
60 | RD = 1; |
61 | CD = 1; |
62 | DATA = cmd; nop(); |
63 | CE = 0; |
64 | WR = 0; |
65 | nop(); nop(); |
66 | WR = 1; |
67 | CE = 1; |
68 | DATA_DIR = 0; |
69 | }
|
70 | |
71 | |
72 | void lcd_wr_data(unsigned char data) |
73 | {
|
74 | lcd_test_status(); |
75 | |
76 | DATA_DIR = 1; |
77 | RD = 1; |
78 | CD = 0; |
79 | DATA = data; nop(); |
80 | CE = 0; |
81 | WR = 0; |
82 | nop(); nop(); |
83 | WR = 1; |
84 | CE = 1; |
85 | CD = 1; |
86 | DATA_DIR = 0; |
87 | }
|
88 | |
89 | |
90 | unsigned char lcd_rd_data(void) |
91 | {
|
92 | unsigned char data; |
93 | |
94 | lcd_test_status(); |
95 | |
96 | DATA_DIR = 0; |
97 | WR = 1; |
98 | |
99 | CD = 0; |
100 | CE = 0; |
101 | RD = 0; |
102 | nop(); nop(); nop(); nop(); |
103 | data = DATA; |
104 | RD = 1; |
105 | CE = 1; |
106 | DATA_DIR = 1; |
107 | CD = 1; |
108 | |
109 | return data; |
110 | }
|
111 | |
112 | |
113 | int lcd_check_status(void) |
114 | {
|
115 | int i; |
116 | |
117 | /* 20ms delay */
|
118 | for (i=0;i<50;i++) { |
119 | _asm("NOP"); _asm("NOP"); _asm("NOP"); _asm("NOP"); |
120 | _asm("NOP"); |
121 | _asm("NOP"); _asm("NOP"); _asm("NOP"); _asm("NOP"); |
122 | _asm("NOP"); |
123 | }
|
124 | |
125 | return 0; |
126 | }
|
127 | |
128 | |
129 | void lcd_test_status(void) |
130 | {
|
131 | while (lcd_check_status() != 0) |
132 | ;
|
133 | }
|