1 | #include "T6963C.h"
|
2 | //-------------------------------------------------------------------------------------------------
|
3 | //
|
4 | // Delay function
|
5 | //
|
6 | //-------------------------------------------------------------------------------------------------
|
7 | void delay(void)
|
8 | {
|
9 | volatile unsigned char i;
|
10 | for(i = 0; i < (16000000/1000000); i++)
|
11 | {
|
12 | asm("nop");
|
13 | }
|
14 | }
|
15 | //-------------------------------------------------------------------------------------------------
|
16 | //
|
17 | // Ports intalization
|
18 | //
|
19 | //-------------------------------------------------------------------------------------------------
|
20 | void GLCD_InitalizeInterface(void)
|
21 | {
|
22 | GLCD_DATA_DDR = 0xFF;
|
23 | GLCD_CTRL_DDR = ((1 << GLCD_WR) | (1 << GLCD_RD) | (1 << GLCD_CE) | (1 << GLCD_CD) | (1 << GLCD_RESET) | (1 << GLCD_FS));
|
24 | GLCD_CTRL_PORT |= ((1 << GLCD_WR) | (1 << GLCD_RD) | (1 << GLCD_CE) | (1 << GLCD_CD) | (1 << GLCD_RESET) | (1 << GLCD_FS));
|
25 | }
|
26 | //-------------------------------------------------------------------------------------------------
|
27 | //
|
28 | // Reads dispay status
|
29 | //
|
30 | //-------------------------------------------------------------------------------------------------
|
31 | unsigned char GLCD_ChceckStatus(void)
|
32 | {
|
33 | uint8_t tmp;
|
34 | GLCD_DATA_DDR = 0x00;
|
35 |
|
36 | GLCD_CTRL_PORT &= ~((1 << GLCD_RD) | (1 << GLCD_CE));
|
37 | delay();
|
38 | tmp = GLCD_DATA_PIN;
|
39 | GLCD_DATA_DDR = 0xFF;
|
40 | GLCD_CTRL_PORT |= ((1 << GLCD_RD) | (1 << GLCD_CE));
|
41 | return tmp;
|
42 | }
|
43 | //-------------------------------------------------------------------------------------------------
|
44 | //
|
45 | // Writes instruction
|
46 | //
|
47 | //-------------------------------------------------------------------------------------------------
|
48 | void GLCD_WriteCommand(unsigned char command)
|
49 | {
|
50 | while(!(GLCD_ChceckStatus()&0x03));
|
51 | GLCD_DATA_PORT = command;
|
52 |
|
53 | GLCD_CTRL_PORT &= ~((1 << GLCD_WR) | (1 << GLCD_CE));
|
54 | delay();
|
55 | GLCD_CTRL_PORT |= ((1 << GLCD_WR) | (1 << GLCD_CE));
|
56 | }
|
57 |
|
58 | //-------------------------------------------------------------------------------------------------
|
59 | //
|
60 | // Writes data
|
61 | //
|
62 | //-------------------------------------------------------------------------------------------------
|
63 | void GLCD_WriteData(unsigned char data)
|
64 | {
|
65 | while(!(GLCD_ChceckStatus()&0x03));
|
66 | GLCD_DATA_PORT = data;
|
67 |
|
68 | GLCD_CTRL_PORT &= ~((1 << GLCD_WR) | (1 << GLCD_CE) | (1 << GLCD_CD));
|
69 | delay();
|
70 | GLCD_CTRL_PORT |= ((1 << GLCD_WR) | (1 << GLCD_CE) | (1 << GLCD_CD));
|
71 | }
|
72 | //-------------------------------------------------------------------------------------------------
|
73 | //
|
74 | // Reads data
|
75 | //
|
76 | //-------------------------------------------------------------------------------------------------
|
77 | unsigned char GLCD_ReadData(void)
|
78 | {
|
79 | uint8_t tmp;
|
80 | while(!(GLCD_ChceckStatus()&0x03));
|
81 | GLCD_DATA_DDR = 0x00;
|
82 |
|
83 | GLCD_CTRL_PORT &= ~((1 << GLCD_RD) | (1 << GLCD_CE) | (1 << GLCD_CD));
|
84 | delay();
|
85 | tmp = GLCD_DATA_PIN;
|
86 | GLCD_CTRL_PORT |= ((1 << GLCD_RD) | (1 << GLCD_CE) | (1 << GLCD_CD));
|
87 | GLCD_DATA_DDR = 0xFF;
|
88 | return tmp;
|
89 | }
|
90 | //-------------------------------------------------------------------------------------------------
|
91 | //
|
92 | // Sets address pointer for display RAM memory
|
93 | //
|
94 | //-------------------------------------------------------------------------------------------------
|
95 | void GLCD_SetAddressPointer(unsigned int address)
|
96 | {
|
97 | GLCD_WriteData(address & 0xFF);
|
98 | GLCD_WriteData(address >> 8);
|
99 | GLCD_WriteCommand(T6963_SET_ADDRESS_POINTER);
|
100 | }
|
101 | //-------------------------------------------------------------------------------------------------
|
102 | //
|
103 | // Clears text area of display RAM memory
|
104 | //
|
105 | //-------------------------------------------------------------------------------------------------
|
106 | void GLCD_ClearText(void)
|
107 | {
|
108 | int i;
|
109 | GLCD_SetAddressPointer(GLCD_TEXT_HOME);
|
110 |
|
111 | for(i = 0; i < GLCD_TEXT_SIZE; i++)
|
112 | {
|
113 | GLCD_WriteDisplayData(0);
|
114 | }
|
115 | }
|
116 | //-------------------------------------------------------------------------------------------------
|
117 | //
|
118 | // Clears characters generator area of display RAM memory
|
119 | //
|
120 | //-------------------------------------------------------------------------------------------------
|
121 | void GLCD_ClearCG(void)
|
122 | {
|
123 | unsigned int i;
|
124 | GLCD_SetAddressPointer(GLCD_EXTERNAL_CG_HOME);
|
125 |
|
126 | for(i = 0; i < 256 * 8; i++)
|
127 | {
|
128 | GLCD_WriteDisplayData(0);
|
129 | }
|
130 | }
|
131 | //-------------------------------------------------------------------------------------------------
|
132 | //
|
133 | // Clears graphics area of display RAM memory
|
134 | //
|
135 | //-------------------------------------------------------------------------------------------------
|
136 | void GLCD_ClearGraphic(void)
|
137 | {
|
138 | int i;
|
139 | GLCD_SetAddressPointer(GLCD_GRAPHIC_HOME);
|
140 | for(i = 0; i < GLCD_GRAPHIC_SIZE; i++)
|
141 | {
|
142 | GLCD_WriteDisplayData(0x00);
|
143 | }
|
144 | }
|
145 | //-------------------------------------------------------------------------------------------------
|
146 | //
|
147 | // Writes a single character (ASCII code) to display RAM memory
|
148 | //
|
149 | //-------------------------------------------------------------------------------------------------
|
150 | void GLCD_WriteChar(char charCode)
|
151 | {
|
152 | GLCD_WriteDisplayData(charCode - 32);
|
153 | }
|
154 | //-------------------------------------------------------------------------------------------------
|
155 | //
|
156 | // Writes null-terminated string to display RAM memory
|
157 | //
|
158 | //-------------------------------------------------------------------------------------------------
|
159 | void GLCD_WriteString(char * string)
|
160 | {
|
161 | while(*string)
|
162 | {
|
163 | GLCD_WriteChar(*string++);
|
164 | }
|
165 | }
|
166 | //-------------------------------------------------------------------------------------------------
|
167 | //
|
168 | // Writes null-terminated string from program memory to display RAM memory
|
169 | //
|
170 | //-------------------------------------------------------------------------------------------------
|
171 | void GLCD_WriteStringPgm(prog_char * string)
|
172 | {
|
173 | char ch;
|
174 | while((ch = pgm_read_byte(string++)))
|
175 | {
|
176 | GLCD_WriteChar(ch);
|
177 | }
|
178 | }
|
179 | //-------------------------------------------------------------------------------------------------
|
180 | //
|
181 | // Sets display coordinates
|
182 | //
|
183 | //-------------------------------------------------------------------------------------------------
|
184 | void GLCD_TextGoTo(unsigned char x, unsigned char y)
|
185 | {
|
186 | unsigned int address;
|
187 |
|
188 | address = GLCD_TEXT_HOME + x + (GLCD_TEXT_AREA * y);
|
189 |
|
190 | GLCD_SetAddressPointer(address);
|
191 | }
|
192 | //-------------------------------------------------------------------------------------------------
|
193 | //
|
194 | // Writes single char pattern to character generator area of display RAM memory
|
195 | //
|
196 | //-------------------------------------------------------------------------------------------------
|
197 | void GLCD_DefineCharacter(unsigned char charCode, unsigned char * defChar)
|
198 | {
|
199 | unsigned int address;
|
200 | unsigned char i;
|
201 |
|
202 | address = GLCD_EXTERNAL_CG_HOME + (8 * charCode);
|
203 |
|
204 | GLCD_SetAddressPointer(address);
|
205 |
|
206 | for(i = 0; i < 8 ; i++)
|
207 | {
|
208 | GLCD_WriteDisplayData(*(defChar + i));
|
209 | }
|
210 | }
|
211 |
|
212 | //-------------------------------------------------------------------------------------------------
|
213 | //
|
214 | // Set (if color==1) or clear (if color==0) pixel on screen
|
215 | //
|
216 | //-------------------------------------------------------------------------------------------------
|
217 | void GLCD_SetPixel(unsigned char x, unsigned char y, unsigned char color)
|
218 | {
|
219 | unsigned char tmp;
|
220 | unsigned int address;
|
221 |
|
222 | address = GLCD_GRAPHIC_HOME + (x / GLCD_FONT_WIDTH) + (GLCD_GRAPHIC_AREA * y);
|
223 |
|
224 | GLCD_SetAddressPointer(address);
|
225 |
|
226 | GLCD_WriteCommand(T6963_DATA_READ_AND_NONVARIABLE);
|
227 | tmp = GLCD_ReadData();
|
228 |
|
229 | if(color)
|
230 | tmp |= (1 << (GLCD_FONT_WIDTH - 1 - (x % GLCD_FONT_WIDTH)));
|
231 | else
|
232 | tmp &= ~(1 << (GLCD_FONT_WIDTH - 1 - (x % GLCD_FONT_WIDTH)));
|
233 |
|
234 | GLCD_WriteDisplayData(tmp);
|
235 |
|
236 | }
|
237 | //-------------------------------------------------------------------------------------------------
|
238 | //
|
239 | // Writes display data and increment address pointer
|
240 | //
|
241 | //-------------------------------------------------------------------------------------------------
|
242 | void GLCD_WriteDisplayData(unsigned char x)
|
243 | {
|
244 | GLCD_WriteData(x);
|
245 | GLCD_WriteCommand(T6963_DATA_WRITE_AND_INCREMENT);
|
246 | }
|
247 | //-------------------------------------------------------------------------------------------------
|
248 | //
|
249 | // Sets graphics coordinates
|
250 | //
|
251 | //-------------------------------------------------------------------------------------------------
|
252 | void GLCD_GraphicGoTo(unsigned char x, unsigned char y)
|
253 | {
|
254 | unsigned int address;
|
255 | address = GLCD_GRAPHIC_HOME + (x / GLCD_FONT_WIDTH) + (GLCD_GRAPHIC_AREA * y);
|
256 | GLCD_SetAddressPointer(address);
|
257 | }
|
258 | //-------------------------------------------------------------------------------------------------
|
259 | //
|
260 | // Displays bitmap from program memory
|
261 | //
|
262 | //-------------------------------------------------------------------------------------------------
|
263 | void GLCD_Bitmap(unsigned char * bitmap, unsigned char x, unsigned char y, unsigned char width, unsigned char height)
|
264 | {
|
265 | unsigned char i, j;
|
266 |
|
267 | for(j = 0; j < height; j++)
|
268 | {
|
269 | GLCD_GraphicGoTo(x, y + j);
|
270 | for(i = 0; i < width/GLCD_FONT_WIDTH; i++)
|
271 | {
|
272 | GLCD_WriteDisplayData(pgm_read_byte(bitmap + i + (GLCD_GRAPHIC_AREA * j)));
|
273 | }
|
274 | }
|
275 | }
|
276 | //-------------------------------------------------------------------------------------------------
|
277 | //
|
278 | // Display initalization
|
279 | //
|
280 | //-------------------------------------------------------------------------------------------------
|
281 | void GLCD_Initalize(void)
|
282 | {
|
283 | GLCD_InitalizeInterface();
|
284 |
|
285 | GLCD_CTRL_PORT &= ~(1 << GLCD_RESET);
|
286 | _delay_ms(1);
|
287 | GLCD_CTRL_PORT |= (1 << GLCD_RESET);
|
288 |
|
289 | #if (GLCD_FONT_WIDTH == 8)
|
290 | GLCD_CTRL_PORT &= ~(1 << GLCD_FS);
|
291 | #endif
|
292 |
|
293 | GLCD_WriteData(GLCD_GRAPHIC_HOME & 0xFF);
|
294 | GLCD_WriteData(GLCD_GRAPHIC_HOME >> 8);
|
295 | GLCD_WriteCommand(T6963_SET_GRAPHIC_HOME_ADDRESS);
|
296 |
|
297 | GLCD_WriteData(GLCD_GRAPHIC_AREA);
|
298 | GLCD_WriteData(0x00);
|
299 | GLCD_WriteCommand(T6963_SET_GRAPHIC_AREA);
|
300 |
|
301 | GLCD_WriteData(GLCD_TEXT_HOME);
|
302 | GLCD_WriteData(GLCD_TEXT_HOME >> 8);
|
303 | GLCD_WriteCommand(T6963_SET_TEXT_HOME_ADDRESS);
|
304 |
|
305 | GLCD_WriteData(GLCD_TEXT_AREA);
|
306 | GLCD_WriteData(0x00);
|
307 | GLCD_WriteCommand(T6963_SET_TEXT_AREA);
|
308 |
|
309 | GLCD_WriteData(GLCD_OFFSET_REGISTER);
|
310 | GLCD_WriteData(0x00);
|
311 | GLCD_WriteCommand(T6963_SET_OFFSET_REGISTER);
|
312 |
|
313 | GLCD_WriteCommand(T6963_DISPLAY_MODE | T6963_GRAPHIC_DISPLAY_ON | T6963_TEXT_DISPLAY_ON /*| T6963_CURSOR_DISPLAY_ON*/);
|
314 |
|
315 | GLCD_WriteCommand(T6963_MODE_SET | 0);
|
316 |
|
317 | }
|