firmware/user.c
author cpresser@slime-ws
Sat, 26 Jul 2008 14:22:38 +0200
changeset 25 96f051df5d60
parent 2 2f55e5dd591d
permissions -rw-r--r--
added eeprom code
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
cpresser@25
    89
unsigned char	ee_display;
cpresser@25
    90
unsigned char	ee_features;
cpresser@25
    91
slime@2
    92
unsigned char	nKeys1, nKeys2;
slime@2
    93
unsigned char	oKeys1, oKeys2;
slime@2
    94
unsigned char	dKeys1, dKeys2;
slime@2
    95
unsigned char	bKeys1;
slime@2
    96
slime@2
    97
slime@2
    98
/** C O D E ********************************************************/
slime@2
    99
void UserInit(void)
slime@2
   100
{
slime@2
   101
	// configure all PortA-Pins as Digital
slime@2
   102
	ADCON0	= 0x00; // disable AD
slime@2
   103
	ADCON1	= 0x0F;	// AD-Converter see page 254
slime@2
   104
	CMCON	= 0x07;	// disable Comperator see page 264
slime@2
   105
	SPPCON	= 0x00; // disable SPP-Port see page 187
slime@2
   106
slime@2
   107
	// first: make ALL ports outputs...
slime@2
   108
	TRISA	= 0x00;
slime@2
   109
	TRISC	= 0x00;
slime@2
   110
	TRISD 	= 0x00;
slime@2
   111
	TRISE	= 0x00;
slime@2
   112
	TRISB	= 0x00; 	PORTB	= 0xFF;
slime@2
   113
	// make sure, PC wont start...
slime@2
   114
	PIN_POWER	= 0;
slime@2
   115
cpresser@25
   116
	// read saved settings
cpresser@25
   117
	ee_display 		= Read_b_eep (EE_ADDR_DISPLAY);
cpresser@25
   118
	ee_features		= Read_b_eep (EE_ADDR_FEATURES);
cpresser@25
   119
slime@2
   120
slime@2
   121
	// reset INT settings...
slime@2
   122
	INTCON			= 0x00;	// first disable all ints..
slime@2
   123
	PIE1			= 0x00; // and also all perephial ints
slime@2
   124
	PIE2			= 0x00;
slime@2
   125
	RCONbits.IPEN	= 1;	// enable interrupt-priority-levels
slime@2
   126
	IPR1			= 0x00;	// perephials are all low-priority
slime@2
   127
	IPR2			= 0x00;
slime@2
   128
slime@2
   129
slime@2
   130
	// init I2C lines and MSSP (taken from AN991)
slime@2
   131
	DDR_I2C_SCL		= 1; 	//Configure SCL as Input	
slime@2
   132
	DDR_I2C_SDA		= 1; 	//Configure SDA as Input
slime@2
   133
	SSPADD			= 0x40;	//Should be 0x31 for 100kHz
slime@2
   134
	SSPSTAT			= 0x80;	//Disable SMBus & Slew Rate Control
slime@2
   135
	SSPCON1			= 0x28;	//Enable MSSP Master
slime@2
   136
	SSPCON2			= 0x00;	//Clear MSSP Conrol Bits
slime@2
   137
slime@2
   138
slime@2
   139
	// portB interrupts (i2c_int on RB5)
slime@2
   140
	INTCON2bits.RBIP	= 0;	//make this a low-priority-interrupt
slime@2
   141
	PIN_I2C_INT			= 1;	//switch pin to high-level (doesnt really work.. its an open collector. BUT i've got pullups)
slime@2
   142
	DDR_I2C_INT			= 1;	//woo woo! this one has to be an input, for interrupts to work
cpresser@25
   143
	if (ee_features && 0x01)
cpresser@25
   144
	{
cpresser@25
   145
		nKeys1 				= 0xFF - LDByteReadI2C(pcf8574A_1);		// make sure to reset i2c_int... just in case...
cpresser@25
   146
		oKeys1				= nKeys1;
cpresser@25
   147
		nKeys2				= 0xFF - LDByteReadI2C(pcf8574A_2);
cpresser@25
   148
		oKeys2				= nKeys2;
cpresser@25
   149
	}
slime@2
   150
	INTCONbits.RBIF		= 0;	// then clear the flag!
slime@2
   151
	INTCONbits.RBIE		= 1;	// Activate PortB interrupts
slime@2
   152
slime@2
   153
slime@2
   154
	// enable alarm
cpresser@25
   155
	if (ee_features && 0x00)
cpresser@25
   156
	{
cpresser@25
   157
		LDByteWriteI2C(pcf8583,0x00,0x04);
cpresser@25
   158
	}
slime@2
   159
slime@2
   160
slime@2
   161
	// Timer3 acts as 'event-ticker'
slime@2
   162
	WriteTimer3(0x0000);
slime@2
   163
	OpenTimer3(TIMER_INT_ON & T3_16BIT_RW & T3_PS_1_8 & T3_SYNC_EXT_OFF & T3_SOURCE_INT);
slime@2
   164
slime@2
   165
slime@2
   166
	// PWM period =   [(period  ) + 1] x 4 x Tosc x TMR2 prescaler
slime@2
   167
	SetOutputPWM1(SINGLE_OUT,PWM_MODE_1);					// since CCP1 is ECCP1.. set its mode
slime@2
   168
	OpenTimer2( TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_1 );	// set Prescaler to 1/4
slime@2
   169
	// Set DutyCycle
slime@2
   170
	SetDCPWM1(gg_pwm1dc << 2);
slime@2
   171
	SetDCPWM2(0x0040);
slime@2
   172
	OpenPWM1(0xFF);												
slime@2
   173
//	OpenPWM2(0xFF);	// Still DOESNT not work :(
slime@2
   174
	// start PWM
slime@2
   175
	DDR_PWM1	= 0;										// make PWM-Pins output
slime@2
   176
	DDR_PWM2	= 0;
slime@2
   177
slime@2
   178
	
slime@2
   179
	// initialize rc5 decoding
slime@2
   180
	rc5_init();
slime@2
   181
	DDR_IR				= 1;	// switch to input...
slime@2
   182
	INTCON3bits.INT2IE	= 1;	// enable int2 (rc5 decoding)
slime@2
   183
	INTCON3bits.INT2IP	= 1;	// as high-priority int.
slime@2
   184
	INTCON2bits.INTEDG2	= 0;	// on falling edge
slime@2
   185
	INTCON3bits.INT2IF 	= 0;	// and clear the flag.
slime@2
   186
slime@2
   187
slime@2
   188
	// interrupts
slime@2
   189
	INTCONbits.GIEH		= 1;	// globally enable high-pri-int
slime@2
   190
	INTCONbits.GIEL		= 1;	// globally enable low-prio-int
slime@2
   191
	
slime@2
   192
	// reset flags
slime@2
   193
	gg_ioflags = FLAG_CLEAR;
slime@2
   194
slime@2
   195
slime@2
   196
	// init & clear Display
cpresser@25
   197
	if (ee_display)
cpresser@25
   198
	{
cpresser@25
   199
		lcd_InitDisplay();			
cpresser@25
   200
		lcd_InitDisplay();			// ugly workaround...
cpresser@25
   201
	}
slime@2
   202
}//end UserInit
slime@2
   203
slime@2
   204
slime@2
   205
slime@2
   206
void Wstring (char *dat,unsigned char len)
slime@2
   207
{
slime@2
   208
	unsigned char i;
slime@2
   209
	for (i=0; i<len; i++)
slime@2
   210
	{
slime@2
   211
		lcd_WriteByte(dat[i]-0x20);
slime@2
   212
	}
slime@2
   213
}
slime@2
   214
slime@2
   215
slime@2
   216
void Wdebug (unsigned char dat)
slime@2
   217
{
slime@2
   218
 // Address Pointer Set
slime@2
   219
/* t6963c_WriteData(0x00);		// byte1
slime@2
   220
 t6963c_WriteData(0x08);		// byte2
slime@2
   221
 t6963c_WriteCommand(0x24);		//set!*/
slime@2
   222
slime@2
   223
 if (dat >= 100) {
slime@2
   224
   lcd_WriteByte((dat / 100) + 0x10);
slime@2
   225
   dat = dat % 100;
slime@2
   226
 } else {
slime@2
   227
   lcd_WriteByte(0x10);
slime@2
   228
 }
slime@2
   229
slime@2
   230
 if (dat >= 10) {
slime@2
   231
   lcd_WriteByte((dat / 10) + 0x10);
slime@2
   232
   dat = dat % 10;
slime@2
   233
 } else {
slime@2
   234
   lcd_WriteByte(0x10);
slime@2
   235
 }
slime@2
   236
 lcd_WriteByte(0x10 + dat);
slime@2
   237
}
slime@2
   238
slime@2
   239
slime@2
   240
void ReadKeys(void)
slime@2
   241
{
slime@2
   242
	// read keys..
slime@2
   243
	nKeys1	= 0xFF - LDByteReadI2C(pcf8574A_1);
slime@2
   244
	nKeys2	= 0xFF - LDByteReadI2C(pcf8574A_2);	
slime@2
   245
slime@2
   246
	if ((nKeys1 != oKeys1) || (nKeys2 != oKeys2))	// something happened
slime@2
   247
	{
slime@2
   248
		gg_keys 		= 0x00;
slime@2
   249
		bKeys1 			= nKeys1;			// backup keys...
slime@2
   250
		dKeys1 			= nKeys1 ^ oKeys1;	// calc diff...
slime@2
   251
		dKeys2 			= nKeys2 ^ oKeys2;
slime@2
   252
				
slime@2
   253
		if (dKeys1 & 0x01)					// rotary event..
slime@2
   254
		{
slime@2
   255
			if (dKeys1 & nKeys1)			// press, not release...
slime@2
   256
			{
slime@2
   257
				if (nKeys1 == 0x05)	gg_keys = RC5_KEY_UP;
slime@2
   258
				else				gg_keys = RC5_KEY_DOWN;
slime@2
   259
			}
slime@2
   260
			else if (dKeys1 & oKeys1) 		// release
slime@2
   261
			{
slime@2
   262
				if (nKeys1 == 0x00)	gg_keys = RC5_KEY_UP;
slime@2
   263
				else				gg_keys = RC5_KEY_DOWN;
slime@2
   264
			}
slime@2
   265
			
slime@2
   266
		}	// done decoding rotary
slime@2
   267
		dKeys1 &= 0xFA;				// remove-rotary bits...
slime@2
   268
		oKeys1 &= 0xFA;
slime@2
   269
		nKeys1 &= 0xFA;
slime@2
   270
			
slime@2
   271
		// expander1
slime@2
   272
		if (dKeys1 & nKeys1)		// button was pressed...
slime@2
   273
		{
slime@2
   274
			switch (dKeys1)
slime@2
   275
			{
slime@2
   276
				case 0x08:		gg_keys = RC5_KEY_LEFT; 	break;
slime@2
   277
				case 0x02:		gg_keys = RC5_KEY_RIGHT;	break;
slime@2
   278
				case 0x10:		gg_keys = RC5_KEY_BACK;		break;
slime@2
   279
				case 0x20:		gg_keys = RC5_KEY_OK;		break;
slime@2
   280
				case 0x40:		gg_keys = RC5_KEY_MENU;		break;
slime@2
   281
				default:		gg_keys = 0x00;
slime@2
   282
			}
slime@2
   283
		}
slime@2
   284
		if (dKeys2 & nKeys2)		// button was pressed...
slime@2
   285
		{
slime@2
   286
			switch (dKeys2)
slime@2
   287
			{
slime@2
   288
				case 0x04:		gg_keys = RC5_KEY_RED;		 break;
slime@2
   289
				case 0x08:		gg_keys = RC5_KEY_GREEN;	 break;
slime@2
   290
				case 0x02:		gg_keys = RC5_KEY_YELLOW;	 break;
slime@2
   291
				case 0x01:		gg_keys = RC5_KEY_BLUE;		 break;
slime@2
   292
				default:		gg_keys = 0x00;
slime@2
   293
			}
slime@2
   294
		}
slime@2
   295
slime@2
   296
/*		if (dKeys2 & oKeys2) 		// release
slime@2
   297
		{
slime@2
   298
			Wdebug (dKeys2);
slime@2
   299
			Wstring(rel,3);
slime@2
   300
		}
slime@2
   301
		if (dKeys1 & oKeys1) 		// release
slime@2
   302
		{
slime@2
   303
			Wdebug (dKeys1);
slime@2
   304
			Wstring(rel,3);
slime@2
   305
		}*/
slime@2
   306
slime@2
   307
		if (gg_keys != 0x00)
slime@2
   308
		{
slime@2
   309
			gg_ioflags	|= FLAG_KEY;
slime@2
   310
		}
slime@2
   311
		// in any case: reset internal key-state
slime@2
   312
		oKeys1 = bKeys1;
slime@2
   313
		oKeys2 = nKeys2;
slime@2
   314
	}
slime@2
   315
}
slime@2
   316
slime@2
   317
void ReadClock(void)
slime@2
   318
{
slime@2
   319
	unsigned char input[16];
slime@2
   320
slime@2
   321
	LDPageReadI2C(pcf8583, 0x00, input, 0x10);
slime@2
   322
	if (input[CLK_ALARM_CTRL] & 0x80) // highest bist it the alarm-if
slime@2
   323
	{
slime@2
   324
		gg_ioflags |= FLAG_ALARM;
slime@2
   325
	}
slime@2
   326
}
slime@2
   327
slime@2
   328
slime@2
   329
void DrawTime (void) {
slime@2
   330
	unsigned char time[0x05];
slime@2
   331
	unsigned char clk[0x10];
slime@2
   332
	unsigned int ram_address;
slime@2
   333
	unsigned int x,y;
slime@2
   334
slime@2
   335
	LDPageReadI2C(pcf8583, 0x00, clk, 0x10);
slime@2
   336
slime@2
   337
	time[0] = ((clk[CLK_HOURS] & 0xF0) >> 4);
slime@2
   338
	time[1] = ((clk[CLK_HOURS] & 0x0F));
slime@2
   339
	time[2] = 0x0A;
slime@2
   340
	time[3] = ((clk[CLK_MIN] & 0xF0) >> 4);
slime@2
   341
	time[4] = ((clk[CLK_MIN] & 0x0F));
slime@2
   342
slime@2
   343
/* D R A W    T I M E */
slime@2
   344
	for (y = 0; y < FONT_HEIGHT; y++)
slime@2
   345
	{
slime@2
   346
		// set RAM address
slime@2
   347
		ram_address = (30 * (y + TIME_Y_START)) + TIME_X_START;
slime@2
   348
		lcd_WriteData((unsigned char)(ram_address % 256));	// lower byte
slime@2
   349
		lcd_WriteData((unsigned char)(ram_address / 256));	// lower byte
slime@2
   350
		lcd_WriteCommand(0x24);								//set!
slime@2
   351
slime@2
   352
		// write 5 chars...
slime@2
   353
		for (x = 0; x < 5; x++)
slime@2
   354
		{
slime@2
   355
			// jump to according position in bitmapfont
slime@2
   356
			ram_address = (FONT_HEIGHT * y) + FONT_WIDTH * (unsigned int)(time[x] & 0x0F);
slime@2
   357
			lcd_WriteByte(bitmapfont[ram_address++]);
slime@2
   358
			lcd_WriteByte(bitmapfont[ram_address++]);
slime@2
   359
			lcd_WriteByte(bitmapfont[ram_address++]);
slime@2
   360
			lcd_WriteByte(bitmapfont[ram_address++]);
slime@2
   361
		}
slime@2
   362
	}
slime@2
   363
slime@2
   364
slime@2
   365
/* D A T E */
slime@2
   366
	lcd_WriteData(0x00);	// byte1
slime@2
   367
 	lcd_WriteData(0x08);	// byte2
slime@2
   368
 	lcd_WriteCommand(0x24);	// set!
slime@2
   369
	lcd_WriteByte(0x00);
slime@2
   370
	lcd_WriteByte(((clk[CLK_YEARDAY]  & 0x30) >> 4) + 0x10);
slime@2
   371
	lcd_WriteByte(( clk[CLK_YEARDAY]  & 0x0F)       + 0x10);
slime@2
   372
	lcd_WriteByte(0x0E);
slime@2
   373
	lcd_WriteByte(((clk[CLK_WEEKDMON] & 0x10) >> 4) + 0x10);
slime@2
   374
	lcd_WriteByte(( clk[CLK_WEEKDMON] & 0x0F)       + 0x10);
slime@2
   375
	lcd_WriteByte(0x0E);
slime@2
   376
	lcd_WriteByte(0x12);	// 2
slime@2
   377
	lcd_WriteByte(0x10);	// 0
slime@2
   378
	lcd_WriteByte(0x10);	// 0
slime@2
   379
	lcd_WriteByte(((clk[CLK_WEEKDMON] & 0xA0) >> 6)  + 0x10 + 0x08); // 8 + x
slime@2
   380
	
slime@2
   381
slime@2
   382
/* T I M E R   I N F O */
slime@2
   383
	lcd_WriteData(0xD2);	// byte1
slime@2
   384
 	lcd_WriteData(0x08);	// byte2
slime@2
   385
 	lcd_WriteCommand(0x24);	// set!
slime@2
   386
	lcd_WriteByte(0x00);	// 
slime@2
   387
	lcd_WriteByte(0x2E);	// N
slime@2
   388
	lcd_WriteByte(0x45);	// e
slime@2
   389
	lcd_WriteByte(0x58);	// x
slime@2
   390
	lcd_WriteByte(0x54);	// t
slime@2
   391
	lcd_WriteByte(0x00);	// 
slime@2
   392
	lcd_WriteByte(0x34);	// T
slime@2
   393
	lcd_WriteByte(0x49);	// i
slime@2
   394
	lcd_WriteByte(0x4D);	// m
slime@2
   395
	lcd_WriteByte(0x45);	// e
slime@2
   396
	lcd_WriteByte(0x52);	// r
slime@2
   397
	lcd_WriteByte(0x1A);	// :
slime@2
   398
	lcd_WriteByte(0x00);	//
slime@2
   399
slime@2
   400
	if (time[CLK_ALARM_CTRL] == 0xB0)		// dated alarm, interrupt enabled
slime@2
   401
	{
slime@2
   402
		lcd_WriteByte(((clk[CLK_YEARDAY + 0x08]  & 0x30) >> 4) + 0x10);
slime@2
   403
		lcd_WriteByte(( clk[CLK_YEARDAY + 0x08]  & 0x0F)       + 0x10);
slime@2
   404
		lcd_WriteByte(0x0E);
slime@2
   405
		lcd_WriteByte(((clk[CLK_WEEKDMON + 0x08] & 0x10) >> 4) + 0x10);
slime@2
   406
		lcd_WriteByte(( clk[CLK_WEEKDMON + 0x08] & 0x0F)       + 0x10);
slime@2
   407
		lcd_WriteByte(0x0E);
slime@2
   408
		lcd_WriteByte(0x12);	// 2
slime@2
   409
		lcd_WriteByte(0x10);	// 0
slime@2
   410
		lcd_WriteByte(0x10);	// 0
slime@2
   411
		lcd_WriteByte(((clk[CLK_WEEKDMON + 0x08] & 0xA0) >> 6)  + 0x10 + 0x08); // 8 + x
slime@2
   412
slime@2
   413
		lcd_WriteByte(0x00);
slime@2
   414
		lcd_WriteByte(((clk[CLK_HOURS] & 0xF0) >> 4) + 0x10);
slime@2
   415
		lcd_WriteByte(( clk[CLK_HOURS] & 0x0F)       + 0x10);
slime@2
   416
		lcd_WriteByte(0x1A);	// :
slime@2
   417
		lcd_WriteByte(((clk[CLK_MIN]   & 0xF0) >> 4) + 0x10);
slime@2
   418
		lcd_WriteByte(( clk[CLK_MIN]   & 0x0F)       + 0x10);
slime@2
   419
	}
slime@2
   420
	else
slime@2
   421
	{
slime@2
   422
		lcd_WriteByte(0x2E);	// N
slime@2
   423
		lcd_WriteByte(0x4F);	// o
slime@2
   424
		lcd_WriteByte(0x4E);	// n
slime@2
   425
		lcd_WriteByte(0x45);	// e
slime@2
   426
		lcd_WriteByte(0x00);	// Pad some spaces... i am just too lazy to clear the whole screen :D
slime@2
   427
		lcd_WriteByte(0x00);
slime@2
   428
		lcd_WriteByte(0x00);
slime@2
   429
		lcd_WriteByte(0x00);
slime@2
   430
		lcd_WriteByte(0x00);
slime@2
   431
		lcd_WriteByte(0x00);
slime@2
   432
		lcd_WriteByte(0x00);
slime@2
   433
		lcd_WriteByte(0x00);
slime@2
   434
		lcd_WriteByte(0x00);
slime@2
   435
		lcd_WriteByte(0x00);
slime@2
   436
		lcd_WriteByte(0x00);
slime@2
   437
		lcd_WriteByte(0x00);
slime@2
   438
		lcd_WriteByte(0x00);
slime@2
   439
		lcd_WriteByte(0x00);
slime@2
   440
		lcd_WriteByte(0x00);
slime@2
   441
		lcd_WriteByte(0x00);
slime@2
   442
	}
slime@2
   443
	
slime@2
   444
slime@2
   445
} //DrawTime