comparison code_part1/OSTC_code_c_part2/p3_wordprocessor.c @ 72:77f1556457b1

added missing source file
author heinrichsweikamp
date Sun, 14 Nov 2010 19:13:42 +0100
parents
children bc3092c41335
comparison
equal deleted inserted replaced
71:6beb680a6130 72:77f1556457b1
1 /*
2 * OSTC - diving computer code
3 * ===========================
4 * PART 3 : word processor
5 *
6 * p3_wordprocessor.c for OSTC Mk.2
7 * Created on: 17.09.2009
8 * Author: christian.w @ heinrichsweikamp.com
9 *
10 * #include "ostc28.drx.txt"
11 * #include "ostc28.tbl.txt"
12 * #include "ostc48.tbl.txt"
13 * #include "ostc48.drx.txt"
14 * #include "ostc90.drx.txt"
15 * #include "ostc90.tbl.txt"
16 */
17
18 // Copyright (C) 2009 HeinrichsWeikamp GbR
19
20 // This program is free software: you can redistribute it and/or modify
21 // it under the terms of the GNU General Public License as published by
22 // the Free Software Foundation, either version 3 of the License, or
23 // (at your option) any later version.
24
25 // This program is distributed in the hope that it will be useful,
26 // but WITHOUT ANY WARRANTY; without even the implied warranty of
27 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 // GNU General Public License for more details.
29
30 // You should have received a copy of the GNU General Public License
31 // along with this program. If not, see <http://www.gnu.org/licenses/>.
32
33
34 // *****************************
35 // ** I N T R O D U C T I O N **
36 // *****************************
37 //
38 // OSTC
39 //
40 // code:
41 //
42 // summary:
43 // display routines
44 // for the OSTC experimental project
45 // written by Christian Weikamp
46 // last revision __________
47 // comments added _________
48 //
49 // additional files:
50 // #include "ostc28.drx.txt"
51 // #include "ostc28.tbl.txt"
52 // #include "ostc48.tbl.txt"
53 // #include "ostc48.drx.txt"
54 // #include "ostc90.drx.txt"
55 // #include "ostc90.tbl.txt"
56 // assembler code (PART 1) for working OSTC experimental plattform
57 // C code (PART 2) for working OSTC experimental plattform
58 //
59 // history:
60 //
61
62
63 // *********************
64 // ** I N C L U D E S **
65 // *********************
66 #include <p18f4685.h>
67
68 // ********************************
69 // ** C O N F I G U R A T I O N **
70 // ** for simulation without asm **
71 // ********************************
72 #pragma config OSC = IRCIO67
73 #pragma config FCMEN = OFF
74 #pragma config IESO = OFF
75 #pragma config PWRT = ON
76 #pragma config BOREN = OFF
77 #pragma config WDT = OFF
78 #pragma config WDTPS = 128
79 #pragma config MCLRE = ON
80 #pragma config LPT1OSC = OFF
81 #pragma config PBADEN = OFF
82 #pragma config DEBUG = OFF
83 #pragma config XINST = OFF
84 #pragma config LVP = OFF
85 #pragma config STVREN = OFF
86
87 // ****************************
88 // ** D E F I N E S **
89 // ** missing in p18f4685.h **
90 // ****************************
91
92 #define WP_FONT_SMALL_HEIGHT 24
93 #define WP_FONT_MEDIUM_HEIGHT 32
94 #define WP_FONT_LARGE_HEIGHT 58
95 #define oled_rw PORTA,2,0
96 #define oled_rs PORTE,0,0
97
98 // ***********************
99 // ** V A R I A B L E S **
100 // ***********************
101
102 #pragma udata bank0a=0x060
103 // input
104 volatile unsigned char wp_stringstore[26];
105 volatile unsigned char wp_color1;
106 volatile unsigned char wp_color2;
107 volatile unsigned char wp_top;
108 volatile unsigned char wp_leftx2;
109 volatile unsigned char wp_font;
110 volatile unsigned char wp_invert;
111 // internal
112 volatile unsigned char wp_temp_U8;
113 volatile unsigned char wp_txtptr;
114 volatile unsigned char wp_char;
115 volatile unsigned char wp_command;
116 volatile unsigned int wp_data_16bit;
117 volatile unsigned char wp_data_8bit_one;
118 volatile unsigned char wp_data_8bit_two;
119 volatile unsigned int wp_start;
120 volatile unsigned int wp_end;
121 volatile unsigned int wp_i;
122 volatile unsigned char wp_black;
123 volatile unsigned char wp_debug_U8;
124
125
126 // *************************
127 // ** P R O T O T Y P E S **
128 // *************************
129 void main(void);
130
131 void main_calc_wordprocessor(void);
132
133 void wp_write_command(void);
134 void wp_write_data(void);
135 void wp_write_black(void);
136 void wp_write_color(void);
137 void wp_set_window(void);
138 void wp_set_char_font_small(void);
139 void wp_set_char_font_medium(void);
140 void wp_set_char_font_large(void);
141 void wordprocessor(void);
142
143 // *******************************
144 // ** start **
145 // ** necessary for compilation **
146 // *******************************
147 #pragma romdata der_code = 0x0000
148 #pragma code der_start = 0x0000
149 void der_start(void)
150 {
151 _asm
152 goto main
153 _endasm
154 }
155
156 // ***********************************
157 // ** main code for simulation / **
158 // ** tests without assembler code **
159 // ** is NOT a part of the OSTC **
160 // ***********************************
161 #pragma code main = 0x9000
162 void main(void)
163 {
164 wp_top = 10;
165 wp_leftx2 = 10;
166 wp_color1 = 255;
167 wp_color2 = 255;
168 wp_font = 0;
169 wp_invert = 0;
170 wp_stringstore[0] = ' ';
171 wp_stringstore[1] = '!';
172 wp_stringstore[2] = '"';
173 wp_stringstore[3] = ':';
174 wp_stringstore[4] = 0;
175 wordprocessor();
176 }
177
178 // ******************************************************
179 // ******************************************************
180 // ** THE FOLLOWING CODE HAS TO BE COPPIED TO THE OSTC **
181 // ******************************************************
182 // ******************************************************
183 // ***************
184 // ***************
185 // ** THE FONTS **
186 // ***************
187 // ***************
188 // all new for bigscreen
189 #pragma romdata font_data_large = 0x09A00
190 rom const rom unsigned int wp_large_data[] =
191 {
192 #include "ostc90.drx.txt" // length 0x59A
193 };
194 #pragma romdata font_table_large = 0x09FA0
195 rom const rom unsigned int wp_large_table[] =
196 {
197 #include "ostc90.tbl.txt" // length 0x18
198 };
199 #pragma romdata font_table_medium = 0x0A000
200 rom const rom unsigned int wp_medium_table[] =
201 {
202 #include "ostc48.tbl.txt" // length 0x22
203 };
204 #pragma romdata font_data_medium = 0x0A024
205 rom const rom unsigned int wp_medium_data[] =
206 {
207 #include "ostc48.drx.txt" // length 0x374 // geht bis einschl. 0xA398
208 };
209 #pragma romdata font_table_small = 0x0A39A
210 rom const rom unsigned int wp_small_table[] =
211 {
212 #include "ostc28.tbl.txt" // length 0xE8
213 };
214 #pragma romdata font_data_small = 0x0A488
215 rom const rom unsigned int wp_small_data[] =
216 {
217 #include "ostc28.drx.txt"
218 };
219
220 // **********************
221 // **********************
222 // ** THE JUMP-IN CODE **
223 // ** for the asm code **
224 // **********************
225 // **********************
226 #pragma code main_wordprocessor = 0x0B468
227 void main_wordprocessor(void)
228 {
229 wordprocessor();
230 }
231
232 // *********************
233 // *********************
234 // ** THE SUBROUTINES **
235 // *********************
236 // *********************
237
238 #pragma code subroutines2 = 0x0B470 // can be adapted to fit the romdata tables ahead
239
240 // ------------
241 // write new //
242 // ------------
243
244 void wp_write_command(void)
245 {
246 _asm
247 bcf oled_rs
248 movff wp_command,PORTD
249 bcf oled_rw
250 bsf oled_rw
251 _endasm
252 }
253
254 void wp_write_data(void)
255 {
256 wp_data_8bit_one = wp_data_16bit >> 8;
257 wp_data_8bit_two = wp_data_16bit;
258 _asm
259 bsf oled_rs
260 movff wp_data_8bit_one,PORTD
261 bcf oled_rw
262 bsf oled_rw
263 movff wp_data_8bit_two,PORTD
264 bcf oled_rw
265 bsf oled_rw
266 _endasm
267 }
268
269 void wp_write_black(void)
270 {
271 _asm
272 movff wp_black,PORTD
273 bcf oled_rw
274 bsf oled_rw
275 bcf oled_rw
276 bsf oled_rw
277 _endasm
278 }
279
280 void wp_write_color(void)
281 {
282 _asm
283 movff wp_color1,PORTD
284 bcf oled_rw
285 bsf oled_rw
286 movff wp_color2,PORTD
287 bcf oled_rw
288 bsf oled_rw
289 _endasm
290 }
291
292 void wp_set_window(void)
293 {
294 // x axis start ( 0 - 319)
295 wp_command = 0x35;
296 wp_write_command();
297 wp_data_16bit = ((unsigned int)wp_leftx2) << 1;
298 wp_write_data();
299 // x axis end ( 0 - 319)
300 wp_command = 0x36;
301 wp_write_command();
302 wp_data_16bit = 319;
303 wp_write_data();
304 // y axis start + end ( 0 - 239 )
305 wp_command = 0x37;
306 wp_write_command();
307 // the bottom part
308 wp_data_16bit = wp_top;
309 if(wp_font == 2)
310 wp_data_16bit += WP_FONT_LARGE_HEIGHT;
311 else if(wp_font == 1)
312 wp_data_16bit += WP_FONT_MEDIUM_HEIGHT;
313 else
314 wp_data_16bit += WP_FONT_SMALL_HEIGHT;
315 wp_data_16bit--;
316 if(wp_data_16bit > 239)
317 wp_data_16bit = 239;
318 // the top part
319 wp_data_16bit |= ((unsigned int)wp_top) << 8;
320 // all together in one 16bit transfer
321 wp_write_data();
322 // start
323 wp_command = 0x20;
324 wp_write_command();
325 wp_data_16bit = wp_top;
326 wp_write_data();
327 wp_command = 0x21;
328 wp_write_command();
329 wp_data_16bit = ((unsigned int)wp_leftx2) << 1;
330 wp_write_data();
331 }
332
333 void wp_set_char_font_small(void)
334 {
335 if(wp_char == ' ')
336 wp_char = '¶';
337 if (wp_char > 0x7E) // skip space between ~ and ¡
338 wp_char -= 34;
339 if((wp_char < '!') || (wp_char > 0xA3)) // font has 34 chars after ~ // ¾ + 4 chars limit to end of battery at the moment
340 wp_char = 0x82; // ¤
341 wp_start = wp_small_table[wp_char - '!'];
342 wp_end = wp_small_table[1 + wp_char - '!'];
343 }
344
345 void wp_set_char_font_medium(void)
346 {
347 // space is 3E
348 if (wp_char == 0x27) // 0x27 == '
349 wp_char = 0x3B;
350 if (wp_char == '"')
351 wp_char = 0x3C;
352 if (wp_char == 'm')
353 wp_char = 0x3D;
354 if (wp_char == ' ')
355 wp_char = 0x3E;
356 if((wp_char < '.') || (wp_char > 0x3E))
357 wp_char = 0x3E;
358 wp_start = wp_medium_table[wp_char - '.'];
359 wp_end = wp_medium_table[1 + wp_char - '.'];
360 }
361 void wp_set_char_font_large(void)
362 {
363 // space is / = 0x2F
364 if (wp_char == ' ')
365 wp_char = 0x2F;
366 if((wp_char < '.') || (wp_char > '9'))
367 wp_char = 0x2F;
368 wp_start = wp_large_table[wp_char - '.'];
369 wp_end = wp_large_table[1 + wp_char - '.'];
370 }
371 void wordprocessor(void)
372 {
373 #define TOPLIMIT 230
374 #define LEFTLIMIT 155
375
376 if(wp_top > TOPLIMIT)
377 wp_top = TOPLIMIT;
378 if(wp_leftx2 > LEFTLIMIT)
379 wp_leftx2 = LEFTLIMIT;
380
381 wp_set_window();
382 // access to GRAM
383 wp_command = 0x22;
384 wp_write_command();
385 _asm
386 bsf oled_rs
387 _endasm
388 wp_txtptr = 0;
389 wp_char = wp_stringstore[wp_txtptr];
390 /*
391 _asm
392 lfsr 0x2,0x60
393 movff 0xfde,wp_char
394 _endasm
395 */
396 if(!wp_char)
397 {
398 wp_char = ':';
399 wp_txtptr = 25;
400 }
401 _asm
402 clrf TBLPTRU, ACCESS
403 _endasm
404 while((wp_char) && (wp_txtptr < 26))
405 {
406 if(wp_font == 2)
407 wp_set_char_font_large();
408 else if(wp_font == 1)
409 wp_set_char_font_medium();
410 else
411 wp_set_char_font_small();
412 wp_black = 0;
413 for(wp_i = wp_start; wp_i<wp_end;wp_i++)
414 {
415 if(wp_font == 2)
416 wp_data_16bit = wp_large_data[wp_i / 2];
417 else if(wp_font == 1)
418 wp_data_16bit = wp_medium_data[wp_i / 2];
419 else
420 wp_data_16bit = wp_small_data[wp_i / 2];
421 if(wp_i & 1)
422 wp_temp_U8 = wp_data_16bit & 0xFF;
423 else
424 wp_temp_U8 = wp_data_16bit >> 8;
425 if((wp_temp_U8 & 128))
426 {
427 wp_temp_U8 -= 127;
428 if(wp_invert)
429 {
430 while(wp_temp_U8 > 0)
431 {
432 wp_temp_U8--;
433 wp_write_color();
434 }
435 }
436 else
437 {
438 _asm
439 movff wp_black,PORTD
440 _endasm
441 while(wp_temp_U8 > 0)
442 {
443 wp_temp_U8--;
444 _asm
445 bcf oled_rw
446 bsf oled_rw
447 bcf oled_rw
448 bsf oled_rw
449 _endasm
450 }
451 }
452 }
453 else
454 {
455 wp_temp_U8++;
456 if(wp_invert)
457 {
458 _asm
459 movff wp_black,PORTD
460 _endasm
461 while(wp_temp_U8 > 0)
462 {
463 wp_temp_U8--;
464 _asm
465 bcf oled_rw
466 bsf oled_rw
467 bcf oled_rw
468 bsf oled_rw
469 _endasm
470 }
471 }
472 else
473 {
474 while(wp_temp_U8 > 0)
475 {
476 wp_temp_U8--;
477 wp_write_color();
478 }
479 }
480 }
481 }
482 /*
483 _asm
484 movff 0xfde,wp_char
485 _endasm
486 */
487 wp_txtptr++;
488 wp_char = wp_stringstore[wp_txtptr];
489 }
490 wp_command = 0x00;
491 wp_write_command();
492 }