firmware/user.c
author slime@unimatrix01.gamma-quadrant.de
Tue, 29 Jan 2008 22:31:52 +0100
changeset 2 2f55e5dd591d
child 25 96f051df5d60
permissions -rw-r--r--
inital checkin
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