slime@2
|
1 |
/*
|
slime@2
|
2 |
* Project Frontplatte
|
slime@2
|
3 |
*
|
slime@2
|
4 |
* user.c - Handle incoming commands
|
slime@2
|
5 |
*
|
slime@2
|
6 |
* This file is released under the GNU General Public License. Refer
|
slime@2
|
7 |
* to the COPYING file distributed with this package.
|
slime@2
|
8 |
*
|
slime@2
|
9 |
* (c) 2007 Carsten Presser cpresser AT fsing.uni-sb.de
|
slime@2
|
10 |
*/
|
slime@2
|
11 |
|
slime@2
|
12 |
/** I N C L U D E S **********************************************************/
|
slime@2
|
13 |
#include <p18cxxx.h>
|
slime@2
|
14 |
#include "typedefs.h"
|
slime@2
|
15 |
#include <pwm.h>
|
slime@2
|
16 |
#include <timers.h>
|
slime@2
|
17 |
|
slime@2
|
18 |
#include "usb.h"
|
slime@2
|
19 |
|
slime@2
|
20 |
#include "io_cfg.h" // I/O pin mapping
|
slime@2
|
21 |
#include "user.h"
|
slime@2
|
22 |
#include "t6963.h"
|
slime@2
|
23 |
#include "delay.h"
|
slime@2
|
24 |
#include "rc5.h"
|
slime@2
|
25 |
#include "myi2c.h"
|
slime@2
|
26 |
#include "interrupt.h"
|
slime@2
|
27 |
|
slime@2
|
28 |
/** R O M D A T A ***********************************************/
|
slime@2
|
29 |
rom unsigned char bitmapfont[] =
|
slime@2
|
30 |
/*Bitmap-Size: 12 * 4 x 48 */
|
slime@2
|
31 |
/* | 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || : || (undef) | */
|
slime@2
|
32 |
/* Row 0 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
33 |
/* Row 1 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
34 |
/* Row 2 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
35 |
/* Row 3 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
36 |
/* Row 4 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
37 |
/* Row 5 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xfe\x00\x00\x0f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
38 |
/* Row 6 */ "\x00\x0f\xf8\x00\x00\x00\x78\x00\x00\x1f\xfc\x00\x00\x7f\xfc\x00\x00\x00\x0f\x00\x01\xff\xff\xc0\x00\x0f\xfc\x00\x00\x00\x00\x00\x00\x3f\xff\x80\x00\x1f\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
39 |
/* Row 7 */ "\x00\x3f\xfe\x00\x00\x00\x78\x00\x00\x3f\xff\x00\x00\xff\xff\x00\x00\x00\x1f\x00\x01\xff\xff\xc0\x00\x1f\xfe\x00\x03\xff\xff\xf8\x00\x7f\xff\xc0\x00\x7f\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
40 |
/* Row 8 */ "\x00\x7f\xff\x00\x00\x00\x78\x00\x00\xff\xff\x80\x01\xff\xff\x80\x00\x00\x1f\x00\x03\xff\xff\xc0\x00\x7f\xff\x00\x03\xff\xff\xf8\x00\xff\xff\xe0\x00\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
41 |
/* Row 9 */ "\x00\xff\xff\x80\x00\x00\xf8\x00\x01\xff\xff\xc0\x03\xfc\x7f\x80\x00\x00\x3f\x00\x03\xff\xff\xc0\x00\x7f\xff\x80\x03\xff\xff\xf8\x00\xff\x1f\xe0\x00\xff\x3f\xc0\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
42 |
/* Row 10 */ "\x01\xfe\x3f\xc0\x00\x03\xf8\x00\x03\xfe\x3f\xe0\x03\xe0\x0f\xc0\x00\x00\x7f\x00\x03\xe0\x00\x00\x00\xff\x1f\xc0\x03\xff\xff\xf8\x01\xf8\x03\xf0\x01\xf8\x07\xe0\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
43 |
/* Row 11 */ "\x01\xf8\x0f\xc0\x00\x3f\xf8\x00\x03\xf0\x07\xf0\x07\xc0\x07\xc0\x00\x00\x7f\x00\x03\xe0\x00\x00\x01\xfc\x07\xe0\x00\x00\x00\xf8\x01\xf0\x01\xf0\x01\xf0\x03\xf0\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
44 |
/* Row 12 */ "\x03\xf0\x07\xe0\x00\xff\xf8\x00\x07\xe0\x03\xf0\x07\xc0\x07\xc0\x00\x00\xff\x00\x03\xe0\x00\x00\x01\xf8\x03\xe0\x00\x00\x01\xf0\x01\xf0\x01\xf0\x03\xe0\x01\xf0\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
45 |
/* Row 13 */ "\x03\xe0\x03\xe0\x00\xff\xf8\x00\x07\xc0\x01\xf0\x07\x80\x03\xc0\x00\x01\xff\x00\x03\xe0\x00\x00\x03\xf0\x03\xe0\x00\x00\x01\xf0\x01\xe0\x00\xf0\x03\xe0\x01\xf0\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
46 |
/* Row 14 */ "\x03\xe0\x03\xe0\x00\xff\xf8\x00\x07\xc0\x01\xf0\x00\x00\x03\xc0\x00\x01\xef\x00\x03\xe0\x00\x00\x03\xe0\x01\xe0\x00\x00\x03\xe0\x01\xe0\x00\xf0\x03\xe0\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
47 |
/* Row 15 */ "\x07\xc0\x01\xf0\x00\xfe\x78\x00\x07\x80\x00\xf0\x00\x00\x03\xc0\x00\x03\xcf\x00\x03\xe0\x00\x00\x03\xe0\x00\x00\x00\x00\x03\xe0\x01\xf0\x01\xf0\x03\xc0\x00\xf8\x00\x01\x80\x00\x00\x00\x00\x00"
|
slime@2
|
48 |
/* Row 16 */ "\x07\xc0\x01\xf0\x00\x00\x78\x00\x00\x00\x00\xf0\x00\x00\x07\xc0\x00\x07\xcf\x00\x03\xe0\x00\x00\x07\xe0\x00\x00\x00\x00\x07\xe0\x01\xf0\x01\xf0\x03\xc0\x00\xf8\x00\x03\xc0\x00\x00\x00\x00\x00"
|
slime@2
|
49 |
/* Row 17 */ "\x07\xc0\x01\xf0\x00\x00\x78\x00\x00\x00\x01\xf0\x00\x00\x07\xc0\x00\x0f\x8f\x00\x03\xe0\x00\x00\x07\xc0\x00\x00\x00\x00\x07\xc0\x00\xf8\x03\xe0\x03\xc0\x00\xf8\x00\x07\xe0\x00\x00\x00\x00\x00"
|
slime@2
|
50 |
/* Row 18 */ "\x07\xc0\x01\xf0\x00\x00\x78\x00\x00\x00\x01\xf0\x00\x00\x0f\x80\x00\x0f\x0f\x00\x03\xe7\xfc\x00\x07\xc0\x00\x00\x00\x00\x07\xc0\x00\xfe\x0f\xe0\x03\xe0\x00\xf8\x00\x07\xe0\x00\x00\x00\x00\x00"
|
slime@2
|
51 |
/* Row 19 */ "\x07\xc0\x01\xf0\x00\x00\x78\x00\x00\x00\x01\xf0\x00\x00\x7f\x80\x00\x1e\x0f\x00\x03\xff\xfe\x00\x07\xc7\xfc\x00\x00\x00\x0f\x80\x00\x7f\xff\xc0\x03\xe0\x00\x78\x00\x03\xc0\x00\x00\x00\x00\x00"
|
slime@2
|
52 |
/* Row 20 */ "\x07\x80\x00\xf0\x00\x00\x78\x00\x00\x00\x03\xe0\x00\x03\xff\x00\x00\x3e\x0f\x00\x03\xff\xff\x80\x07\xdf\xff\x00\x00\x00\x0f\x80\x00\x3f\xff\x80\x03\xe0\x00\xf8\x00\x01\x80\x00\x00\x00\x00\x00"
|
slime@2
|
53 |
/* Row 21 */ "\x07\x80\x00\xf0\x00\x00\x78\x00\x00\x00\x07\xe0\x00\x03\xfc\x00\x00\x3c\x0f\x00\x03\xff\xff\xc0\x07\xff\xff\x80\x00\x00\x1f\x00\x00\x0f\xfe\x00\x03\xf0\x01\xf8\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
54 |
/* Row 22 */ "\x07\x80\x00\xf0\x00\x00\x78\x00\x00\x00\x0f\xc0\x00\x03\xff\x00\x00\x78\x0f\x00\x03\xfe\x3f\xe0\x07\xff\xff\xc0\x00\x00\x1f\x00\x00\x1f\xff\x00\x01\xf8\x03\xf8\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
55 |
/* Row 23 */ "\x07\x80\x00\xf0\x00\x00\x78\x00\x00\x00\x1f\x80\x00\x03\xff\xc0\x00\xf8\x0f\x00\x03\xf0\x07\xe0\x07\xfe\x3f\xc0\x00\x00\x3e\x00\x00\x3f\xff\x80\x00\xff\x1f\xf8\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
56 |
/* Row 24 */ "\x07\x80\x00\xf0\x00\x00\x78\x00\x00\x00\x3f\x00\x00\x00\x3f\xe0\x00\xf0\x0f\x00\x03\xc0\x03\xf0\x07\xf0\x07\xe0\x00\x00\x3e\x00\x00\x7f\xff\xc0\x00\xff\xff\xf8\x00\x00\x00\x00\x00\x3f\xfc\x00"
|
slime@2
|
57 |
/* Row 25 */ "\x07\x80\x00\xf0\x00\x00\x78\x00\x00\x00\x7e\x00\x00\x00\x07\xe0\x01\xe0\x0f\x00\x00\x00\x01\xf0\x07\xe0\x03\xf0\x00\x00\x7e\x00\x00\xfe\x0f\xe0\x00\x7f\xff\xf8\x00\x00\x00\x00\x00\x3f\xfc\x00"
|
slime@2
|
58 |
/* Row 26 */ "\x07\x80\x00\xf0\x00\x00\x78\x00\x00\x00\xfc\x00\x00\x00\x03\xf0\x03\xe0\x0f\x00\x00\x00\x01\xf0\x07\xc0\x01\xf0\x00\x00\x7c\x00\x01\xf8\x03\xf0\x00\x3f\xfe\xf8\x00\x00\x00\x00\x00\x3f\xfc\x00"
|
slime@2
|
59 |
/* Row 27 */ "\x07\x80\x00\xf0\x00\x00\x78\x00\x00\x03\xf8\x00\x00\x00\x01\xf0\x03\xc0\x0f\x00\x00\x00\x01\xf0\x07\x80\x01\xf0\x00\x00\x7c\x00\x03\xf0\x01\xf8\x00\x0f\xf8\xf8\x00\x01\x80\x00\x00\x3f\xfc\x00"
|
slime@2
|
60 |
/* Row 28 */ "\x07\xc0\x01\xf0\x00\x00\x78\x00\x00\x07\xf0\x00\x00\x00\x01\xf0\x07\x80\x0f\x00\x00\x00\x00\xf0\x07\xc0\x01\xf0\x00\x00\xf8\x00\x03\xe0\x00\xf8\x00\x00\x00\xf8\x00\x03\xc0\x00\x00\x00\x00\x00"
|
slime@2
|
61 |
/* Row 29 */ "\x07\xc0\x01\xf0\x00\x00\x78\x00\x00\x0f\xe0\x00\x00\x00\x00\xf0\x07\xff\xff\xf8\x00\x00\x00\xf0\x07\xc0\x00\xf0\x00\x00\xf8\x00\x03\xe0\x00\xf8\x00\x00\x00\xf8\x00\x07\xe0\x00\x00\x00\x00\x00"
|
slime@2
|
62 |
/* Row 30 */ "\x07\xc0\x01\xf0\x00\x00\x78\x00\x00\x3f\xc0\x00\x00\x00\x00\xf0\x07\xff\xff\xf8\x00\x00\x00\xf0\x07\xc0\x00\xf0\x00\x01\xf0\x00\x03\xc0\x00\x78\x00\x00\x01\xf8\x00\x07\xe0\x00\x00\x00\x00\x00"
|
slime@2
|
63 |
/* Row 31 */ "\x07\xc0\x01\xf0\x00\x00\x78\x00\x00\x7f\x00\x00\x07\x80\x00\xf0\x07\xff\xff\xf8\x07\x80\x01\xf0\x07\xc0\x00\xf0\x00\x01\xf0\x00\x03\xc0\x00\x78\x00\x00\x01\xf0\x00\x03\xc0\x00\x00\x00\x00\x00"
|
slime@2
|
64 |
/* Row 32 */ "\x07\xc0\x01\xf0\x00\x00\x78\x00\x00\xfe\x00\x00\x07\xc0\x01\xf0\x07\xff\xff\xf8\x07\xc0\x01\xf0\x07\xc0\x01\xf0\x00\x03\xe0\x00\x03\xe0\x00\xf8\x01\xe0\x01\xf0\x00\x01\x80\x00\x00\x00\x00\x00"
|
slime@2
|
65 |
/* Row 33 */ "\x03\xe0\x03\xe0\x00\x00\x78\x00\x01\xfc\x00\x00\x07\xc0\x01\xf0\x00\x00\x0f\x00\x07\xc0\x03\xf0\x03\xe0\x01\xf0\x00\x03\xe0\x00\x03\xe0\x00\xf8\x01\xf0\x03\xf0\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
66 |
/* Row 34 */ "\x03\xe0\x03\xe0\x00\x00\x78\x00\x03\xf8\x00\x00\x07\xe0\x03\xf0\x00\x00\x0f\x00\x07\xe0\x03\xe0\x03\xe0\x01\xf0\x00\x07\xe0\x00\x03\xf0\x01\xf8\x01\xf0\x07\xe0\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
67 |
/* Row 35 */ "\x03\xf0\x07\xe0\x00\x00\x78\x00\x07\xf0\x00\x00\x03\xf0\x07\xe0\x00\x00\x0f\x00\x03\xf0\x0f\xe0\x03\xf0\x03\xe0\x00\x07\xc0\x00\x01\xf8\x03\xf0\x01\xf8\x0f\xe0\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
68 |
/* Row 36 */ "\x01\xf8\x0f\xc0\x00\x00\x78\x00\x07\xe0\x00\x00\x03\xfe\x3f\xe0\x00\x00\x0f\x00\x03\xfe\x3f\xc0\x01\xf8\x07\xe0\x00\x07\xc0\x00\x01\xff\x1f\xf0\x00\xfe\x3f\xc0\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
69 |
/* Row 37 */ "\x01\xfe\x3f\xc0\x00\x00\x78\x00\x0f\xff\xff\xf0\x01\xff\xff\xc0\x00\x00\x0f\x00\x01\xff\xff\x80\x00\xff\x3f\xc0\x00\x0f\x80\x00\x00\xff\xff\xe0\x00\x7f\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
70 |
/* Row 38 */ "\x00\xff\xff\x80\x00\x00\x78\x00\x0f\xff\xff\xf0\x00\xff\xff\x80\x00\x00\x0f\x00\x00\xff\xff\x00\x00\xff\xff\xc0\x00\x0f\x80\x00\x00\x7f\xff\xc0\x00\x7f\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
71 |
/* Row 39 */ "\x00\x7f\xff\x00\x00\x00\x78\x00\x0f\xff\xff\xf0\x00\x7f\xfe\x00\x00\x00\x0f\x00\x00\x7f\xfe\x00\x00\x7f\xff\x80\x00\x1f\x00\x00\x00\x3f\xff\x80\x00\x1f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
72 |
/* Row 40 */ "\x00\x3f\xfe\x00\x00\x00\x78\x00\x0f\xff\xff\xf0\x00\x1f\xf8\x00\x00\x00\x0f\x00\x00\x1f\xf8\x00\x00\x1f\xfe\x00\x00\x1f\x00\x00\x00\x0f\xfe\x00\x00\x0f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
73 |
/* Row 41 */ "\x00\x0f\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
74 |
/* Row 42 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
75 |
/* Row 43 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
76 |
/* Row 44 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
77 |
/* Row 45 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
78 |
/* Row 46 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
slime@2
|
79 |
/* Row 47 */ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
|
slime@2
|
80 |
|
slime@2
|
81 |
|
slime@2
|
82 |
|
slime@2
|
83 |
/** V A R I A B L E S **********************************************/
|
slime@2
|
84 |
unsigned char gg_keys;
|
slime@2
|
85 |
unsigned char gg_ioflags;
|
slime@2
|
86 |
unsigned char gg_pwm1dc = 0x00;
|
slime@2
|
87 |
unsigned char gg_mode = MODE_UNMANAGED;
|
slime@2
|
88 |
|
slime@2
|
89 |
unsigned char nKeys1, nKeys2;
|
slime@2
|
90 |
unsigned char oKeys1, oKeys2;
|
slime@2
|
91 |
unsigned char dKeys1, dKeys2;
|
slime@2
|
92 |
unsigned char bKeys1;
|
slime@2
|
93 |
|
slime@2
|
94 |
|
slime@2
|
95 |
/** C O D E ********************************************************/
|
slime@2
|
96 |
void UserInit(void)
|
slime@2
|
97 |
{
|
slime@2
|
98 |
// configure all PortA-Pins as Digital
|
slime@2
|
99 |
ADCON0 = 0x00; // disable AD
|
slime@2
|
100 |
ADCON1 = 0x0F; // AD-Converter see page 254
|
slime@2
|
101 |
CMCON = 0x07; // disable Comperator see page 264
|
slime@2
|
102 |
SPPCON = 0x00; // disable SPP-Port see page 187
|
slime@2
|
103 |
|
slime@2
|
104 |
// first: make ALL ports outputs...
|
slime@2
|
105 |
TRISA = 0x00;
|
slime@2
|
106 |
TRISC = 0x00;
|
slime@2
|
107 |
TRISD = 0x00;
|
slime@2
|
108 |
TRISE = 0x00;
|
slime@2
|
109 |
TRISB = 0x00; PORTB = 0xFF;
|
slime@2
|
110 |
// make sure, PC wont start...
|
slime@2
|
111 |
PIN_POWER = 0;
|
slime@2
|
112 |
|
slime@2
|
113 |
|
slime@2
|
114 |
// reset INT settings...
|
slime@2
|
115 |
INTCON = 0x00; // first disable all ints..
|
slime@2
|
116 |
PIE1 = 0x00; // and also all perephial ints
|
slime@2
|
117 |
PIE2 = 0x00;
|
slime@2
|
118 |
RCONbits.IPEN = 1; // enable interrupt-priority-levels
|
slime@2
|
119 |
IPR1 = 0x00; // perephials are all low-priority
|
slime@2
|
120 |
IPR2 = 0x00;
|
slime@2
|
121 |
|
slime@2
|
122 |
|
slime@2
|
123 |
// init I2C lines and MSSP (taken from AN991)
|
slime@2
|
124 |
DDR_I2C_SCL = 1; //Configure SCL as Input
|
slime@2
|
125 |
DDR_I2C_SDA = 1; //Configure SDA as Input
|
slime@2
|
126 |
SSPADD = 0x40; //Should be 0x31 for 100kHz
|
slime@2
|
127 |
SSPSTAT = 0x80; //Disable SMBus & Slew Rate Control
|
slime@2
|
128 |
SSPCON1 = 0x28; //Enable MSSP Master
|
slime@2
|
129 |
SSPCON2 = 0x00; //Clear MSSP Conrol Bits
|
slime@2
|
130 |
|
slime@2
|
131 |
|
slime@2
|
132 |
// portB interrupts (i2c_int on RB5)
|
slime@2
|
133 |
INTCON2bits.RBIP = 0; //make this a low-priority-interrupt
|
slime@2
|
134 |
PIN_I2C_INT = 1; //switch pin to high-level (doesnt really work.. its an open collector. BUT i've got pullups)
|
slime@2
|
135 |
DDR_I2C_INT = 1; //woo woo! this one has to be an input, for interrupts to work
|
slime@2
|
136 |
nKeys1 = 0xFF - LDByteReadI2C(pcf8574A_1); // make sure to reset i2c_int... just in case...
|
slime@2
|
137 |
oKeys1 = nKeys1;
|
slime@2
|
138 |
nKeys2 = 0xFF - LDByteReadI2C(pcf8574A_2);
|
slime@2
|
139 |
oKeys2 = nKeys2;
|
slime@2
|
140 |
INTCONbits.RBIF = 0; // then clear the flag!
|
slime@2
|
141 |
INTCONbits.RBIE = 1; // Activate PortB interrupts
|
slime@2
|
142 |
|
slime@2
|
143 |
|
slime@2
|
144 |
// enable alarm
|
slime@2
|
145 |
LDByteWriteI2C(pcf8583,0x00,0x04);
|
slime@2
|
146 |
|
slime@2
|
147 |
|
slime@2
|
148 |
// Timer3 acts as 'event-ticker'
|
slime@2
|
149 |
WriteTimer3(0x0000);
|
slime@2
|
150 |
OpenTimer3(TIMER_INT_ON & T3_16BIT_RW & T3_PS_1_8 & T3_SYNC_EXT_OFF & T3_SOURCE_INT);
|
slime@2
|
151 |
|
slime@2
|
152 |
|
slime@2
|
153 |
// PWM period = [(period ) + 1] x 4 x Tosc x TMR2 prescaler
|
slime@2
|
154 |
SetOutputPWM1(SINGLE_OUT,PWM_MODE_1); // since CCP1 is ECCP1.. set its mode
|
slime@2
|
155 |
OpenTimer2( TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_1 ); // set Prescaler to 1/4
|
slime@2
|
156 |
// Set DutyCycle
|
slime@2
|
157 |
SetDCPWM1(gg_pwm1dc << 2);
|
slime@2
|
158 |
SetDCPWM2(0x0040);
|
slime@2
|
159 |
OpenPWM1(0xFF);
|
slime@2
|
160 |
// OpenPWM2(0xFF); // Still DOESNT not work :(
|
slime@2
|
161 |
// start PWM
|
slime@2
|
162 |
DDR_PWM1 = 0; // make PWM-Pins output
|
slime@2
|
163 |
DDR_PWM2 = 0;
|
slime@2
|
164 |
|
slime@2
|
165 |
|
slime@2
|
166 |
// initialize rc5 decoding
|
slime@2
|
167 |
rc5_init();
|
slime@2
|
168 |
DDR_IR = 1; // switch to input...
|
slime@2
|
169 |
INTCON3bits.INT2IE = 1; // enable int2 (rc5 decoding)
|
slime@2
|
170 |
INTCON3bits.INT2IP = 1; // as high-priority int.
|
slime@2
|
171 |
INTCON2bits.INTEDG2 = 0; // on falling edge
|
slime@2
|
172 |
INTCON3bits.INT2IF = 0; // and clear the flag.
|
slime@2
|
173 |
|
slime@2
|
174 |
|
slime@2
|
175 |
// interrupts
|
slime@2
|
176 |
INTCONbits.GIEH = 1; // globally enable high-pri-int
|
slime@2
|
177 |
INTCONbits.GIEL = 1; // globally enable low-prio-int
|
slime@2
|
178 |
|
slime@2
|
179 |
// reset flags
|
slime@2
|
180 |
gg_ioflags = FLAG_CLEAR;
|
slime@2
|
181 |
|
slime@2
|
182 |
|
slime@2
|
183 |
// init & clear Display
|
slime@2
|
184 |
lcd_InitDisplay();
|
slime@2
|
185 |
lcd_InitDisplay(); // ugly workaround...
|
slime@2
|
186 |
}//end UserInit
|
slime@2
|
187 |
|
slime@2
|
188 |
|
slime@2
|
189 |
|
slime@2
|
190 |
void Wstring (char *dat,unsigned char len)
|
slime@2
|
191 |
{
|
slime@2
|
192 |
unsigned char i;
|
slime@2
|
193 |
for (i=0; i<len; i++)
|
slime@2
|
194 |
{
|
slime@2
|
195 |
lcd_WriteByte(dat[i]-0x20);
|
slime@2
|
196 |
}
|
slime@2
|
197 |
}
|
slime@2
|
198 |
|
slime@2
|
199 |
|
slime@2
|
200 |
void Wdebug (unsigned char dat)
|
slime@2
|
201 |
{
|
slime@2
|
202 |
// Address Pointer Set
|
slime@2
|
203 |
/* t6963c_WriteData(0x00); // byte1
|
slime@2
|
204 |
t6963c_WriteData(0x08); // byte2
|
slime@2
|
205 |
t6963c_WriteCommand(0x24); //set!*/
|
slime@2
|
206 |
|
slime@2
|
207 |
if (dat >= 100) {
|
slime@2
|
208 |
lcd_WriteByte((dat / 100) + 0x10);
|
slime@2
|
209 |
dat = dat % 100;
|
slime@2
|
210 |
} else {
|
slime@2
|
211 |
lcd_WriteByte(0x10);
|
slime@2
|
212 |
}
|
slime@2
|
213 |
|
slime@2
|
214 |
if (dat >= 10) {
|
slime@2
|
215 |
lcd_WriteByte((dat / 10) + 0x10);
|
slime@2
|
216 |
dat = dat % 10;
|
slime@2
|
217 |
} else {
|
slime@2
|
218 |
lcd_WriteByte(0x10);
|
slime@2
|
219 |
}
|
slime@2
|
220 |
lcd_WriteByte(0x10 + dat);
|
slime@2
|
221 |
}
|
slime@2
|
222 |
|
slime@2
|
223 |
|
slime@2
|
224 |
void ReadKeys(void)
|
slime@2
|
225 |
{
|
slime@2
|
226 |
// read keys..
|
slime@2
|
227 |
nKeys1 = 0xFF - LDByteReadI2C(pcf8574A_1);
|
slime@2
|
228 |
nKeys2 = 0xFF - LDByteReadI2C(pcf8574A_2);
|
slime@2
|
229 |
|
slime@2
|
230 |
if ((nKeys1 != oKeys1) || (nKeys2 != oKeys2)) // something happened
|
slime@2
|
231 |
{
|
slime@2
|
232 |
gg_keys = 0x00;
|
slime@2
|
233 |
bKeys1 = nKeys1; // backup keys...
|
slime@2
|
234 |
dKeys1 = nKeys1 ^ oKeys1; // calc diff...
|
slime@2
|
235 |
dKeys2 = nKeys2 ^ oKeys2;
|
slime@2
|
236 |
|
slime@2
|
237 |
if (dKeys1 & 0x01) // rotary event..
|
slime@2
|
238 |
{
|
slime@2
|
239 |
if (dKeys1 & nKeys1) // press, not release...
|
slime@2
|
240 |
{
|
slime@2
|
241 |
if (nKeys1 == 0x05) gg_keys = RC5_KEY_UP;
|
slime@2
|
242 |
else gg_keys = RC5_KEY_DOWN;
|
slime@2
|
243 |
}
|
slime@2
|
244 |
else if (dKeys1 & oKeys1) // release
|
slime@2
|
245 |
{
|
slime@2
|
246 |
if (nKeys1 == 0x00) gg_keys = RC5_KEY_UP;
|
slime@2
|
247 |
else gg_keys = RC5_KEY_DOWN;
|
slime@2
|
248 |
}
|
slime@2
|
249 |
|
slime@2
|
250 |
} // done decoding rotary
|
slime@2
|
251 |
dKeys1 &= 0xFA; // remove-rotary bits...
|
slime@2
|
252 |
oKeys1 &= 0xFA;
|
slime@2
|
253 |
nKeys1 &= 0xFA;
|
slime@2
|
254 |
|
slime@2
|
255 |
// expander1
|
slime@2
|
256 |
if (dKeys1 & nKeys1) // button was pressed...
|
slime@2
|
257 |
{
|
slime@2
|
258 |
switch (dKeys1)
|
slime@2
|
259 |
{
|
slime@2
|
260 |
case 0x08: gg_keys = RC5_KEY_LEFT; break;
|
slime@2
|
261 |
case 0x02: gg_keys = RC5_KEY_RIGHT; break;
|
slime@2
|
262 |
case 0x10: gg_keys = RC5_KEY_BACK; break;
|
slime@2
|
263 |
case 0x20: gg_keys = RC5_KEY_OK; break;
|
slime@2
|
264 |
case 0x40: gg_keys = RC5_KEY_MENU; break;
|
slime@2
|
265 |
default: gg_keys = 0x00;
|
slime@2
|
266 |
}
|
slime@2
|
267 |
}
|
slime@2
|
268 |
if (dKeys2 & nKeys2) // button was pressed...
|
slime@2
|
269 |
{
|
slime@2
|
270 |
switch (dKeys2)
|
slime@2
|
271 |
{
|
slime@2
|
272 |
case 0x04: gg_keys = RC5_KEY_RED; break;
|
slime@2
|
273 |
case 0x08: gg_keys = RC5_KEY_GREEN; break;
|
slime@2
|
274 |
case 0x02: gg_keys = RC5_KEY_YELLOW; break;
|
slime@2
|
275 |
case 0x01: gg_keys = RC5_KEY_BLUE; break;
|
slime@2
|
276 |
default: gg_keys = 0x00;
|
slime@2
|
277 |
}
|
slime@2
|
278 |
}
|
slime@2
|
279 |
|
slime@2
|
280 |
/* if (dKeys2 & oKeys2) // release
|
slime@2
|
281 |
{
|
slime@2
|
282 |
Wdebug (dKeys2);
|
slime@2
|
283 |
Wstring(rel,3);
|
slime@2
|
284 |
}
|
slime@2
|
285 |
if (dKeys1 & oKeys1) // release
|
slime@2
|
286 |
{
|
slime@2
|
287 |
Wdebug (dKeys1);
|
slime@2
|
288 |
Wstring(rel,3);
|
slime@2
|
289 |
}*/
|
slime@2
|
290 |
|
slime@2
|
291 |
if (gg_keys != 0x00)
|
slime@2
|
292 |
{
|
slime@2
|
293 |
gg_ioflags |= FLAG_KEY;
|
slime@2
|
294 |
}
|
slime@2
|
295 |
// in any case: reset internal key-state
|
slime@2
|
296 |
oKeys1 = bKeys1;
|
slime@2
|
297 |
oKeys2 = nKeys2;
|
slime@2
|
298 |
}
|
slime@2
|
299 |
}
|
slime@2
|
300 |
|
slime@2
|
301 |
void ReadClock(void)
|
slime@2
|
302 |
{
|
slime@2
|
303 |
unsigned char input[16];
|
slime@2
|
304 |
|
slime@2
|
305 |
LDPageReadI2C(pcf8583, 0x00, input, 0x10);
|
slime@2
|
306 |
if (input[CLK_ALARM_CTRL] & 0x80) // highest bist it the alarm-if
|
slime@2
|
307 |
{
|
slime@2
|
308 |
gg_ioflags |= FLAG_ALARM;
|
slime@2
|
309 |
}
|
slime@2
|
310 |
}
|
slime@2
|
311 |
|
slime@2
|
312 |
|
slime@2
|
313 |
void DrawTime (void) {
|
slime@2
|
314 |
unsigned char time[0x05];
|
slime@2
|
315 |
unsigned char clk[0x10];
|
slime@2
|
316 |
unsigned int ram_address;
|
slime@2
|
317 |
unsigned int x,y;
|
slime@2
|
318 |
|
slime@2
|
319 |
LDPageReadI2C(pcf8583, 0x00, clk, 0x10);
|
slime@2
|
320 |
|
slime@2
|
321 |
time[0] = ((clk[CLK_HOURS] & 0xF0) >> 4);
|
slime@2
|
322 |
time[1] = ((clk[CLK_HOURS] & 0x0F));
|
slime@2
|
323 |
time[2] = 0x0A;
|
slime@2
|
324 |
time[3] = ((clk[CLK_MIN] & 0xF0) >> 4);
|
slime@2
|
325 |
time[4] = ((clk[CLK_MIN] & 0x0F));
|
slime@2
|
326 |
|
slime@2
|
327 |
/* D R A W T I M E */
|
slime@2
|
328 |
for (y = 0; y < FONT_HEIGHT; y++)
|
slime@2
|
329 |
{
|
slime@2
|
330 |
// set RAM address
|
slime@2
|
331 |
ram_address = (30 * (y + TIME_Y_START)) + TIME_X_START;
|
slime@2
|
332 |
lcd_WriteData((unsigned char)(ram_address % 256)); // lower byte
|
slime@2
|
333 |
lcd_WriteData((unsigned char)(ram_address / 256)); // lower byte
|
slime@2
|
334 |
lcd_WriteCommand(0x24); //set!
|
slime@2
|
335 |
|
slime@2
|
336 |
// write 5 chars...
|
slime@2
|
337 |
for (x = 0; x < 5; x++)
|
slime@2
|
338 |
{
|
slime@2
|
339 |
// jump to according position in bitmapfont
|
slime@2
|
340 |
ram_address = (FONT_HEIGHT * y) + FONT_WIDTH * (unsigned int)(time[x] & 0x0F);
|
slime@2
|
341 |
lcd_WriteByte(bitmapfont[ram_address++]);
|
slime@2
|
342 |
lcd_WriteByte(bitmapfont[ram_address++]);
|
slime@2
|
343 |
lcd_WriteByte(bitmapfont[ram_address++]);
|
slime@2
|
344 |
lcd_WriteByte(bitmapfont[ram_address++]);
|
slime@2
|
345 |
}
|
slime@2
|
346 |
}
|
slime@2
|
347 |
|
slime@2
|
348 |
|
slime@2
|
349 |
/* D A T E */
|
slime@2
|
350 |
lcd_WriteData(0x00); // byte1
|
slime@2
|
351 |
lcd_WriteData(0x08); // byte2
|
slime@2
|
352 |
lcd_WriteCommand(0x24); // set!
|
slime@2
|
353 |
lcd_WriteByte(0x00);
|
slime@2
|
354 |
lcd_WriteByte(((clk[CLK_YEARDAY] & 0x30) >> 4) + 0x10);
|
slime@2
|
355 |
lcd_WriteByte(( clk[CLK_YEARDAY] & 0x0F) + 0x10);
|
slime@2
|
356 |
lcd_WriteByte(0x0E);
|
slime@2
|
357 |
lcd_WriteByte(((clk[CLK_WEEKDMON] & 0x10) >> 4) + 0x10);
|
slime@2
|
358 |
lcd_WriteByte(( clk[CLK_WEEKDMON] & 0x0F) + 0x10);
|
slime@2
|
359 |
lcd_WriteByte(0x0E);
|
slime@2
|
360 |
lcd_WriteByte(0x12); // 2
|
slime@2
|
361 |
lcd_WriteByte(0x10); // 0
|
slime@2
|
362 |
lcd_WriteByte(0x10); // 0
|
slime@2
|
363 |
lcd_WriteByte(((clk[CLK_WEEKDMON] & 0xA0) >> 6) + 0x10 + 0x08); // 8 + x
|
slime@2
|
364 |
|
slime@2
|
365 |
|
slime@2
|
366 |
/* T I M E R I N F O */
|
slime@2
|
367 |
lcd_WriteData(0xD2); // byte1
|
slime@2
|
368 |
lcd_WriteData(0x08); // byte2
|
slime@2
|
369 |
lcd_WriteCommand(0x24); // set!
|
slime@2
|
370 |
lcd_WriteByte(0x00); //
|
slime@2
|
371 |
lcd_WriteByte(0x2E); // N
|
slime@2
|
372 |
lcd_WriteByte(0x45); // e
|
slime@2
|
373 |
lcd_WriteByte(0x58); // x
|
slime@2
|
374 |
lcd_WriteByte(0x54); // t
|
slime@2
|
375 |
lcd_WriteByte(0x00); //
|
slime@2
|
376 |
lcd_WriteByte(0x34); // T
|
slime@2
|
377 |
lcd_WriteByte(0x49); // i
|
slime@2
|
378 |
lcd_WriteByte(0x4D); // m
|
slime@2
|
379 |
lcd_WriteByte(0x45); // e
|
slime@2
|
380 |
lcd_WriteByte(0x52); // r
|
slime@2
|
381 |
lcd_WriteByte(0x1A); // :
|
slime@2
|
382 |
lcd_WriteByte(0x00); //
|
slime@2
|
383 |
|
slime@2
|
384 |
if (time[CLK_ALARM_CTRL] == 0xB0) // dated alarm, interrupt enabled
|
slime@2
|
385 |
{
|
slime@2
|
386 |
lcd_WriteByte(((clk[CLK_YEARDAY + 0x08] & 0x30) >> 4) + 0x10);
|
slime@2
|
387 |
lcd_WriteByte(( clk[CLK_YEARDAY + 0x08] & 0x0F) + 0x10);
|
slime@2
|
388 |
lcd_WriteByte(0x0E);
|
slime@2
|
389 |
lcd_WriteByte(((clk[CLK_WEEKDMON + 0x08] & 0x10) >> 4) + 0x10);
|
slime@2
|
390 |
lcd_WriteByte(( clk[CLK_WEEKDMON + 0x08] & 0x0F) + 0x10);
|
slime@2
|
391 |
lcd_WriteByte(0x0E);
|
slime@2
|
392 |
lcd_WriteByte(0x12); // 2
|
slime@2
|
393 |
lcd_WriteByte(0x10); // 0
|
slime@2
|
394 |
lcd_WriteByte(0x10); // 0
|
slime@2
|
395 |
lcd_WriteByte(((clk[CLK_WEEKDMON + 0x08] & 0xA0) >> 6) + 0x10 + 0x08); // 8 + x
|
slime@2
|
396 |
|
slime@2
|
397 |
lcd_WriteByte(0x00);
|
slime@2
|
398 |
lcd_WriteByte(((clk[CLK_HOURS] & 0xF0) >> 4) + 0x10);
|
slime@2
|
399 |
lcd_WriteByte(( clk[CLK_HOURS] & 0x0F) + 0x10);
|
slime@2
|
400 |
lcd_WriteByte(0x1A); // :
|
slime@2
|
401 |
lcd_WriteByte(((clk[CLK_MIN] & 0xF0) >> 4) + 0x10);
|
slime@2
|
402 |
lcd_WriteByte(( clk[CLK_MIN] & 0x0F) + 0x10);
|
slime@2
|
403 |
}
|
slime@2
|
404 |
else
|
slime@2
|
405 |
{
|
slime@2
|
406 |
lcd_WriteByte(0x2E); // N
|
slime@2
|
407 |
lcd_WriteByte(0x4F); // o
|
slime@2
|
408 |
lcd_WriteByte(0x4E); // n
|
slime@2
|
409 |
lcd_WriteByte(0x45); // e
|
slime@2
|
410 |
lcd_WriteByte(0x00); // Pad some spaces... i am just too lazy to clear the whole screen :D
|
slime@2
|
411 |
lcd_WriteByte(0x00);
|
slime@2
|
412 |
lcd_WriteByte(0x00);
|
slime@2
|
413 |
lcd_WriteByte(0x00);
|
slime@2
|
414 |
lcd_WriteByte(0x00);
|
slime@2
|
415 |
lcd_WriteByte(0x00);
|
slime@2
|
416 |
lcd_WriteByte(0x00);
|
slime@2
|
417 |
lcd_WriteByte(0x00);
|
slime@2
|
418 |
lcd_WriteByte(0x00);
|
slime@2
|
419 |
lcd_WriteByte(0x00);
|
slime@2
|
420 |
lcd_WriteByte(0x00);
|
slime@2
|
421 |
lcd_WriteByte(0x00);
|
slime@2
|
422 |
lcd_WriteByte(0x00);
|
slime@2
|
423 |
lcd_WriteByte(0x00);
|
slime@2
|
424 |
lcd_WriteByte(0x00);
|
slime@2
|
425 |
lcd_WriteByte(0x00);
|
slime@2
|
426 |
}
|
slime@2
|
427 |
|
slime@2
|
428 |
|
slime@2
|
429 |
} //DrawTime
|