test code for our MBED board

Dependencies:   mbed lwip

Committer:
lolpcc
Date:
Wed May 04 08:30:52 2011 +0000
Revision:
1:6877bb99aa17
Parent:
0:9edfcca7cd25

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lolpcc 0:9edfcca7cd25 1 #include "mbed.h"
lolpcc 1:6877bb99aa17 2
lolpcc 1:6877bb99aa17 3 #include "main.h"
lolpcc 1:6877bb99aa17 4 #include "i2c.h"
lolpcc 1:6877bb99aa17 5 #include "useful.h"
lolpcc 1:6877bb99aa17 6 #include "pca9685_reg.h" /* Light Driver Chip */
lolpcc 0:9edfcca7cd25 7
lolpcc 0:9edfcca7cd25 8 I2C i2c(p9, p10); // sda, scl
lolpcc 0:9edfcca7cd25 9
lolpcc 1:6877bb99aa17 10 #define PIO 0x40
lolpcc 1:6877bb99aa17 11 #define RELAYS 0x40
lolpcc 0:9edfcca7cd25 12 #define LCD 0xC6
lolpcc 1:6877bb99aa17 13 #define BAT 0x76 /* Batron LCD device */
lolpcc 1:6877bb99aa17 14 #define BATKBD 0x42 /* batron Keyboard */
lolpcc 0:9edfcca7cd25 15 #define SEVEN_SEG 0x70
lolpcc 1:6877bb99aa17 16 #define ASCII_OFFSET 0x80
lolpcc 1:6877bb99aa17 17
lolpcc 1:6877bb99aa17 18
lolpcc 0:9edfcca7cd25 19 /******************************************/
lolpcc 0:9edfcca7cd25 20 /* */
lolpcc 0:9edfcca7cd25 21 /* Probe the I2C bus, and show the */
lolpcc 0:9edfcca7cd25 22 /* user what we have found */
lolpcc 0:9edfcca7cd25 23 /* */
lolpcc 0:9edfcca7cd25 24 /* */
lolpcc 0:9edfcca7cd25 25 /* */
lolpcc 0:9edfcca7cd25 26 /******************************************/
lolpcc 0:9edfcca7cd25 27 void i2c_probe(void)
lolpcc 0:9edfcca7cd25 28 {
lolpcc 1:6877bb99aa17 29 lprintf("Searching for I2C devices...\n\r");
lolpcc 1:6877bb99aa17 30
lolpcc 0:9edfcca7cd25 31 int count = 0;
lolpcc 0:9edfcca7cd25 32 for (int address=4; address<256; address+=2) {
lolpcc 0:9edfcca7cd25 33 if (!i2c.write(address, NULL, 0)) { // 0 returned is ok
lolpcc 1:6877bb99aa17 34 lprintf(" - I2C device found at address 0x%02X\n\r", address);
lolpcc 0:9edfcca7cd25 35 count++;
lolpcc 0:9edfcca7cd25 36 }
lolpcc 0:9edfcca7cd25 37 }
lolpcc 1:6877bb99aa17 38 lprintf("%d devices found\n\r", count);
lolpcc 0:9edfcca7cd25 39 }
lolpcc 0:9edfcca7cd25 40
lolpcc 0:9edfcca7cd25 41 /******************************************/
lolpcc 0:9edfcca7cd25 42 /* */
lolpcc 1:6877bb99aa17 43 /* Should drive the I2C based LCD */
lolpcc 1:6877bb99aa17 44 /* Display If attached */
lolpcc 0:9edfcca7cd25 45 /* */
lolpcc 0:9edfcca7cd25 46 /* */
lolpcc 0:9edfcca7cd25 47 /* */
lolpcc 0:9edfcca7cd25 48 /******************************************/
lolpcc 0:9edfcca7cd25 49 char init_lcd(void)
lolpcc 0:9edfcca7cd25 50 {
lolpcc 0:9edfcca7cd25 51 char buf[4];
lolpcc 0:9edfcca7cd25 52 buf[0]=0;
lolpcc 0:9edfcca7cd25 53 buf[1]=19;
lolpcc 0:9edfcca7cd25 54 return(i2c.write(LCD,buf,2));
lolpcc 0:9edfcca7cd25 55 }
lolpcc 0:9edfcca7cd25 56 char clear_lcd(void)
lolpcc 0:9edfcca7cd25 57 {
lolpcc 0:9edfcca7cd25 58 char buf[4];
lolpcc 0:9edfcca7cd25 59 buf[0]=0;
lolpcc 0:9edfcca7cd25 60 buf[1]=12;
lolpcc 0:9edfcca7cd25 61 return(i2c.write(LCD,buf,2));
lolpcc 0:9edfcca7cd25 62 }
lolpcc 0:9edfcca7cd25 63 char set_lcd(char line, char col)
lolpcc 0:9edfcca7cd25 64 {
lolpcc 0:9edfcca7cd25 65 char buf[4];
lolpcc 0:9edfcca7cd25 66 buf[0]=0;
lolpcc 0:9edfcca7cd25 67 buf[1]=3;
lolpcc 0:9edfcca7cd25 68 buf[2]=line;
lolpcc 0:9edfcca7cd25 69 buf[3]=col;
lolpcc 0:9edfcca7cd25 70 return(i2c.write(LCD,buf,4));
lolpcc 0:9edfcca7cd25 71 }
lolpcc 0:9edfcca7cd25 72 char write_lcd(char *str)
lolpcc 0:9edfcca7cd25 73 {
lolpcc 0:9edfcca7cd25 74 char buf[0x60];
lolpcc 0:9edfcca7cd25 75 if(strlen(str)>50){
lolpcc 1:6877bb99aa17 76 lprintf("Line length to long\n\r");
lolpcc 0:9edfcca7cd25 77 return(0);
lolpcc 0:9edfcca7cd25 78 }
lolpcc 0:9edfcca7cd25 79 sprintf(buf,"%c%s",'\0',str);
lolpcc 0:9edfcca7cd25 80 buf[0]=0;
lolpcc 0:9edfcca7cd25 81 return(i2c.write(LCD,buf,strlen(str)+1));
lolpcc 0:9edfcca7cd25 82 }
lolpcc 1:6877bb99aa17 83
lolpcc 0:9edfcca7cd25 84 /******************************************/
lolpcc 0:9edfcca7cd25 85 /* */
lolpcc 1:6877bb99aa17 86 /* Read key presses from the keyboard */
lolpcc 1:6877bb99aa17 87 /* Attached to the LCD interface */
lolpcc 1:6877bb99aa17 88 /* It returns 0 if no key is pressed */
lolpcc 1:6877bb99aa17 89 /* or the ascii value of the key press */
lolpcc 0:9edfcca7cd25 90 /* */
lolpcc 0:9edfcca7cd25 91 /******************************************/
lolpcc 0:9edfcca7cd25 92 char read_keyboard(void)
lolpcc 0:9edfcca7cd25 93 {
lolpcc 0:9edfcca7cd25 94 char buf[10];
lolpcc 0:9edfcca7cd25 95 i2c.read(LCD,buf,4);
lolpcc 0:9edfcca7cd25 96 if(buf[1]!=0){
lolpcc 0:9edfcca7cd25 97 switch(buf[1]){
lolpcc 0:9edfcca7cd25 98 case 0x01 :
lolpcc 0:9edfcca7cd25 99 return('1');
lolpcc 0:9edfcca7cd25 100 case 0x02 :
lolpcc 0:9edfcca7cd25 101 return('2');
lolpcc 0:9edfcca7cd25 102 case 0x04 :
lolpcc 0:9edfcca7cd25 103 return('3');
lolpcc 0:9edfcca7cd25 104 case 0x08 :
lolpcc 0:9edfcca7cd25 105 return('4');
lolpcc 0:9edfcca7cd25 106 case 0x10 :
lolpcc 0:9edfcca7cd25 107 return('5');
lolpcc 0:9edfcca7cd25 108 case 0x20 :
lolpcc 0:9edfcca7cd25 109 return('6');
lolpcc 0:9edfcca7cd25 110 case 0x40 :
lolpcc 0:9edfcca7cd25 111 return('7');
lolpcc 0:9edfcca7cd25 112 case 0x80 :
lolpcc 0:9edfcca7cd25 113 return('8');
lolpcc 0:9edfcca7cd25 114 }
lolpcc 0:9edfcca7cd25 115 }
lolpcc 0:9edfcca7cd25 116 if(buf[2]!=0){
lolpcc 0:9edfcca7cd25 117 switch(buf[2]){
lolpcc 0:9edfcca7cd25 118 case 0x01 :
lolpcc 0:9edfcca7cd25 119 return('9');
lolpcc 0:9edfcca7cd25 120 case 0x02 :
lolpcc 0:9edfcca7cd25 121 return('*');
lolpcc 0:9edfcca7cd25 122 case 0x04 :
lolpcc 0:9edfcca7cd25 123 return('0');
lolpcc 0:9edfcca7cd25 124 case 0x08 :
lolpcc 0:9edfcca7cd25 125 return('#');
lolpcc 0:9edfcca7cd25 126 }
lolpcc 0:9edfcca7cd25 127 }
lolpcc 0:9edfcca7cd25 128 return('\0');
lolpcc 0:9edfcca7cd25 129 }
lolpcc 0:9edfcca7cd25 130 /******************************************/
lolpcc 0:9edfcca7cd25 131 /* */
lolpcc 1:6877bb99aa17 132 /* Blocking key press, will wait for */
lolpcc 1:6877bb99aa17 133 /* the user to press a key */
lolpcc 1:6877bb99aa17 134 /* */
lolpcc 1:6877bb99aa17 135 /******************************************/
lolpcc 1:6877bb99aa17 136 char blocking_read_keyboard(void)
lolpcc 1:6877bb99aa17 137 {
lolpcc 1:6877bb99aa17 138 char c = 0;
lolpcc 1:6877bb99aa17 139 while((c=read_keyboard())==0)
lolpcc 1:6877bb99aa17 140 while((read_keyboard())==c);
lolpcc 1:6877bb99aa17 141 wait(0.5);
lolpcc 1:6877bb99aa17 142 return(c);
lolpcc 1:6877bb99aa17 143 }
lolpcc 1:6877bb99aa17 144
lolpcc 1:6877bb99aa17 145 /******************************************/
lolpcc 1:6877bb99aa17 146 /* */
lolpcc 1:6877bb99aa17 147 /* 1 - 8, Relays On, */
lolpcc 0:9edfcca7cd25 148 /* */
lolpcc 1:6877bb99aa17 149 /******************************************/
lolpcc 1:6877bb99aa17 150 void relay_operate(char r)
lolpcc 1:6877bb99aa17 151 {
lolpcc 1:6877bb99aa17 152 char buf[0x60];
lolpcc 1:6877bb99aa17 153
lolpcc 1:6877bb99aa17 154 switch(r){
lolpcc 1:6877bb99aa17 155 case 0 : /* Turn off the relays */
lolpcc 1:6877bb99aa17 156 buf[0]=0x00;
lolpcc 1:6877bb99aa17 157 break;
lolpcc 1:6877bb99aa17 158 case 1 :
lolpcc 1:6877bb99aa17 159 buf[0]=0x01;
lolpcc 1:6877bb99aa17 160 break;
lolpcc 1:6877bb99aa17 161 case 2 :
lolpcc 1:6877bb99aa17 162 buf[0]=0x02;
lolpcc 1:6877bb99aa17 163 break;
lolpcc 1:6877bb99aa17 164 case 3 :
lolpcc 1:6877bb99aa17 165 buf[0]=0x04;
lolpcc 1:6877bb99aa17 166 break;
lolpcc 1:6877bb99aa17 167 case 4 :
lolpcc 1:6877bb99aa17 168 buf[0]=0x08;
lolpcc 1:6877bb99aa17 169 break;
lolpcc 1:6877bb99aa17 170 case 5 :
lolpcc 1:6877bb99aa17 171 buf[0]=0x10;
lolpcc 1:6877bb99aa17 172 break;
lolpcc 1:6877bb99aa17 173 case 6 :
lolpcc 1:6877bb99aa17 174 buf[0]=0x20;
lolpcc 1:6877bb99aa17 175 break;
lolpcc 1:6877bb99aa17 176 case 7 :
lolpcc 1:6877bb99aa17 177 buf[0]=0x40;
lolpcc 1:6877bb99aa17 178 break;
lolpcc 1:6877bb99aa17 179 case 8 :
lolpcc 1:6877bb99aa17 180 buf[0]=0x80;
lolpcc 1:6877bb99aa17 181 break;
lolpcc 1:6877bb99aa17 182 default :
lolpcc 1:6877bb99aa17 183 lprintf("Unknown Relay %d\n\r",r);
lolpcc 1:6877bb99aa17 184 return;
lolpcc 1:6877bb99aa17 185 }
lolpcc 1:6877bb99aa17 186 i2c.write(RELAYS,buf,1);
lolpcc 1:6877bb99aa17 187 }
lolpcc 1:6877bb99aa17 188
lolpcc 1:6877bb99aa17 189 /******************************************/
lolpcc 1:6877bb99aa17 190 /* */
lolpcc 1:6877bb99aa17 191 /* Read and Write the PIO latch */
lolpcc 1:6877bb99aa17 192 /* */
lolpcc 1:6877bb99aa17 193 /******************************************/
lolpcc 1:6877bb99aa17 194 void pio_write(unsigned char r, unsigned char d)
lolpcc 1:6877bb99aa17 195 {
lolpcc 1:6877bb99aa17 196 unsigned char buf[0x60];
lolpcc 1:6877bb99aa17 197
lolpcc 1:6877bb99aa17 198 buf[0]=d;
lolpcc 1:6877bb99aa17 199 i2c.write(r,(char *)buf,1);
lolpcc 1:6877bb99aa17 200 }
lolpcc 1:6877bb99aa17 201 void pio_read(unsigned char d)
lolpcc 1:6877bb99aa17 202 {
lolpcc 1:6877bb99aa17 203 unsigned char r;
lolpcc 1:6877bb99aa17 204 unsigned char buf[0x60];
lolpcc 1:6877bb99aa17 205
lolpcc 1:6877bb99aa17 206 i2c.read(d,(char *)buf,1);
lolpcc 1:6877bb99aa17 207 r = buf[0];
lolpcc 1:6877bb99aa17 208
lolpcc 1:6877bb99aa17 209 lprintf("Returned value from the PIO was 0x%02x\n\r",r);
lolpcc 1:6877bb99aa17 210 }
lolpcc 1:6877bb99aa17 211
lolpcc 1:6877bb99aa17 212 /******************************************/
lolpcc 1:6877bb99aa17 213 /* */
lolpcc 1:6877bb99aa17 214 /* Philips PCA9685 I2C Driver, 16 channel */
lolpcc 1:6877bb99aa17 215 /* Lighting controler chip, we have 4 */
lolpcc 1:6877bb99aa17 216 /* running in this system, so we need to */
lolpcc 1:6877bb99aa17 217 /* think how the channels map ?? */
lolpcc 1:6877bb99aa17 218 /* */
lolpcc 1:6877bb99aa17 219 /******************************************/
lolpcc 1:6877bb99aa17 220
lolpcc 1:6877bb99aa17 221 /******************************************/
lolpcc 1:6877bb99aa17 222 /* */
lolpcc 1:6877bb99aa17 223 /* Init code for the PCA9685 */
lolpcc 0:9edfcca7cd25 224 /* */
lolpcc 0:9edfcca7cd25 225 /******************************************/
lolpcc 1:6877bb99aa17 226
lolpcc 1:6877bb99aa17 227 void init_pca9685(unsigned char address)
lolpcc 1:6877bb99aa17 228 {
lolpcc 1:6877bb99aa17 229 unsigned char buf[30];
lolpcc 1:6877bb99aa17 230
lolpcc 1:6877bb99aa17 231 lprintf("Setting up channel %d\n\r",address);
lolpcc 1:6877bb99aa17 232
lolpcc 1:6877bb99aa17 233 buf[0] = PCA9685_MODE1;
lolpcc 1:6877bb99aa17 234 buf[1] = PCA9685_AI;
lolpcc 1:6877bb99aa17 235 buf[2] = PCA9685_OUTDRV;
lolpcc 1:6877bb99aa17 236 i2c.write(address,(char *) buf, 3);
lolpcc 1:6877bb99aa17 237 }
lolpcc 1:6877bb99aa17 238
lolpcc 1:6877bb99aa17 239 /******************************************/
lolpcc 1:6877bb99aa17 240 /* */
lolpcc 1:6877bb99aa17 241 /* Send data to a given channle of a */
lolpcc 1:6877bb99aa17 242 /* given PCA9685 chip */
lolpcc 1:6877bb99aa17 243 /* */
lolpcc 1:6877bb99aa17 244 /******************************************/
lolpcc 1:6877bb99aa17 245
lolpcc 1:6877bb99aa17 246 void pca9685_led(unsigned char addr, int led, unsigned char *values)
lolpcc 1:6877bb99aa17 247 {
lolpcc 1:6877bb99aa17 248 unsigned char buf[5];
lolpcc 1:6877bb99aa17 249
lolpcc 1:6877bb99aa17 250 if (led == PCA9685_ALL_LEDS) {
lolpcc 1:6877bb99aa17 251 buf[0] = PCA9685_ALL_LED_ON_L;
lolpcc 1:6877bb99aa17 252 } else {
lolpcc 1:6877bb99aa17 253 buf[0] = PCA9685_BASE(led);
lolpcc 1:6877bb99aa17 254 }
lolpcc 1:6877bb99aa17 255
lolpcc 1:6877bb99aa17 256 buf[1] = values[0];
lolpcc 1:6877bb99aa17 257 buf[2] = values[1];
lolpcc 1:6877bb99aa17 258 buf[3] = values[2];
lolpcc 1:6877bb99aa17 259 buf[4] = values[3];
lolpcc 1:6877bb99aa17 260 i2c.write(addr, (char *)buf, 5);
lolpcc 1:6877bb99aa17 261 }
lolpcc 1:6877bb99aa17 262
lolpcc 1:6877bb99aa17 263 /******************************************/
lolpcc 1:6877bb99aa17 264 /* */
lolpcc 1:6877bb99aa17 265 /* Calculate the register values for a */
lolpcc 1:6877bb99aa17 266 /* givern brightness percentage */
lolpcc 1:6877bb99aa17 267 /* */
lolpcc 1:6877bb99aa17 268 /******************************************/
lolpcc 1:6877bb99aa17 269
lolpcc 1:6877bb99aa17 270 void pca9685_brightness(int percent, unsigned char *values)
lolpcc 0:9edfcca7cd25 271 {
lolpcc 1:6877bb99aa17 272 unsigned int on, off;
lolpcc 1:6877bb99aa17 273
lolpcc 1:6877bb99aa17 274 if (percent == 0) {
lolpcc 1:6877bb99aa17 275 values[PCA9685_LED_ON_H] = 0;
lolpcc 1:6877bb99aa17 276 values[PCA9685_LED_OFF_H] = PCA9685_LED_OFF;
lolpcc 1:6877bb99aa17 277 return;
lolpcc 1:6877bb99aa17 278 }
lolpcc 1:6877bb99aa17 279 if (percent == 100) {
lolpcc 1:6877bb99aa17 280 values[PCA9685_LED_ON_H] = PCA9685_LED_ON;
lolpcc 1:6877bb99aa17 281 values[PCA9685_LED_OFF_H] = 0;
lolpcc 1:6877bb99aa17 282 return;
lolpcc 1:6877bb99aa17 283 }
lolpcc 1:6877bb99aa17 284 on = 0;
lolpcc 1:6877bb99aa17 285 off = (4096 * percent) / 100;
lolpcc 1:6877bb99aa17 286 values[PCA9685_LED_ON_L] = on & 0xff;
lolpcc 1:6877bb99aa17 287 values[PCA9685_LED_ON_H] = (on >> 8) & 0xf;
lolpcc 1:6877bb99aa17 288 values[PCA9685_LED_OFF_L] = off & 0xff;
lolpcc 1:6877bb99aa17 289 values[PCA9685_LED_OFF_H] = (off >> 8) & 0xf;
lolpcc 0:9edfcca7cd25 290 }
lolpcc 1:6877bb99aa17 291
lolpcc 1:6877bb99aa17 292 /******************************************/
lolpcc 1:6877bb99aa17 293 /* */
lolpcc 1:6877bb99aa17 294 /* Set a given channel to a given level */
lolpcc 1:6877bb99aa17 295 /* */
lolpcc 1:6877bb99aa17 296 /******************************************/
lolpcc 1:6877bb99aa17 297 void channel_light(unsigned char ch, unsigned char lev)
lolpcc 1:6877bb99aa17 298 {
lolpcc 1:6877bb99aa17 299 char chip,led; /* Chip Number, channel number */
lolpcc 1:6877bb99aa17 300 unsigned char v[4]; /* register data for givern level */
lolpcc 1:6877bb99aa17 301
lolpcc 1:6877bb99aa17 302 led = ch%16;
lolpcc 1:6877bb99aa17 303 v[0]=0;
lolpcc 1:6877bb99aa17 304 v[1]=0;
lolpcc 1:6877bb99aa17 305 v[2]=0;
lolpcc 1:6877bb99aa17 306 v[3]=0;
lolpcc 1:6877bb99aa17 307
lolpcc 1:6877bb99aa17 308 if(lev > 100){
lolpcc 1:6877bb99aa17 309 lprintf("Level percentage range 0 - 100 (Trying for %d)\n\r",lev);
lolpcc 1:6877bb99aa17 310 return;
lolpcc 1:6877bb99aa17 311 }
lolpcc 1:6877bb99aa17 312
lolpcc 1:6877bb99aa17 313 switch(ch/16){
lolpcc 1:6877bb99aa17 314 case 0 :
lolpcc 1:6877bb99aa17 315 chip=LEDDRV1;
lolpcc 1:6877bb99aa17 316 break;
lolpcc 1:6877bb99aa17 317 case 1 :
lolpcc 1:6877bb99aa17 318 chip=LEDDRV2;
lolpcc 1:6877bb99aa17 319 break;
lolpcc 1:6877bb99aa17 320 case 2 :
lolpcc 1:6877bb99aa17 321 chip=LEDDRV3;
lolpcc 1:6877bb99aa17 322 break;
lolpcc 1:6877bb99aa17 323 case 3 :
lolpcc 1:6877bb99aa17 324 chip=LEDDRV4;
lolpcc 1:6877bb99aa17 325 break;
lolpcc 1:6877bb99aa17 326 case 4 :
lolpcc 1:6877bb99aa17 327 chip=LEDDRV5;
lolpcc 1:6877bb99aa17 328 break;
lolpcc 1:6877bb99aa17 329 case 5 :
lolpcc 1:6877bb99aa17 330 chip=LEDDRV6;
lolpcc 1:6877bb99aa17 331 break;
lolpcc 1:6877bb99aa17 332 default :
lolpcc 1:6877bb99aa17 333 lprintf("Error unknown chip %d\n\r",ch/16);
lolpcc 1:6877bb99aa17 334 return;
lolpcc 1:6877bb99aa17 335 }
lolpcc 1:6877bb99aa17 336
lolpcc 1:6877bb99aa17 337 lprintf("Setting channel %d to brightness leven %d chip = %d(%d),%d\n\r",
lolpcc 1:6877bb99aa17 338 ch,lev,chip,ch/16,led);
lolpcc 1:6877bb99aa17 339 pca9685_brightness(lev,v); /* Calculate the brightness level */
lolpcc 1:6877bb99aa17 340 lprintf("Brightness level is %02x,%02x,%02x,%02x\n\r",v[0],v[1],v[2],v[3]);
lolpcc 1:6877bb99aa17 341 pca9685_led(chip,led,v); /* Send to chip */
lolpcc 1:6877bb99aa17 342 }
lolpcc 1:6877bb99aa17 343
lolpcc 0:9edfcca7cd25 344 /******************************************/
lolpcc 0:9edfcca7cd25 345 /* */
lolpcc 0:9edfcca7cd25 346 /* Send some data to the seven segment */
lolpcc 0:9edfcca7cd25 347 /* display device, showing the user */
lolpcc 0:9edfcca7cd25 348 /* what the SAA1064 can do */
lolpcc 0:9edfcca7cd25 349 /* */
lolpcc 0:9edfcca7cd25 350 /* */
lolpcc 0:9edfcca7cd25 351 /******************************************/
lolpcc 0:9edfcca7cd25 352
lolpcc 0:9edfcca7cd25 353 /* mapping of bit pattern to number 0-9 */
lolpcc 0:9edfcca7cd25 354 char sseg_map[15]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67};
lolpcc 0:9edfcca7cd25 355
lolpcc 0:9edfcca7cd25 356 void test_seven_seg(char loop)
lolpcc 0:9edfcca7cd25 357 {
lolpcc 0:9edfcca7cd25 358 unsigned char buf[10];
lolpcc 0:9edfcca7cd25 359 char a,b,c;
lolpcc 0:9edfcca7cd25 360
lolpcc 0:9edfcca7cd25 361 buf[0]=0;
lolpcc 0:9edfcca7cd25 362 buf[1]=0x27;
lolpcc 0:9edfcca7cd25 363 c=0;
lolpcc 0:9edfcca7cd25 364 i2c.write(SEVEN_SEG,(char *)buf,7);
lolpcc 0:9edfcca7cd25 365 while(c!=loop){
lolpcc 0:9edfcca7cd25 366 a = 1;
lolpcc 0:9edfcca7cd25 367 b = 0;
lolpcc 0:9edfcca7cd25 368 while(b!=8){
lolpcc 0:9edfcca7cd25 369 buf[2]=a<<b;
lolpcc 0:9edfcca7cd25 370 buf[3]=a<<b;
lolpcc 0:9edfcca7cd25 371 buf[4]=a<<b;
lolpcc 0:9edfcca7cd25 372 buf[5]=a<<b;
lolpcc 0:9edfcca7cd25 373 i2c.write(SEVEN_SEG,(char *)buf,7);
lolpcc 0:9edfcca7cd25 374 wait(0.5);
lolpcc 0:9edfcca7cd25 375 b++;
lolpcc 0:9edfcca7cd25 376 }
lolpcc 0:9edfcca7cd25 377 c++;
lolpcc 0:9edfcca7cd25 378 }
lolpcc 0:9edfcca7cd25 379 }
lolpcc 0:9edfcca7cd25 380
lolpcc 1:6877bb99aa17 381 void sseg_four_digits(int a)
lolpcc 1:6877bb99aa17 382 {
lolpcc 1:6877bb99aa17 383 int index = 4;
lolpcc 1:6877bb99aa17 384 int val = a;
lolpcc 1:6877bb99aa17 385 char pt[5];
lolpcc 1:6877bb99aa17 386
lolpcc 1:6877bb99aa17 387 pt[1] = 0;
lolpcc 1:6877bb99aa17 388 pt[2] = 0;
lolpcc 1:6877bb99aa17 389 pt[3] = 0;
lolpcc 1:6877bb99aa17 390 pt[4] = 0;
lolpcc 1:6877bb99aa17 391
lolpcc 1:6877bb99aa17 392 do {
lolpcc 1:6877bb99aa17 393 register unsigned short temp;
lolpcc 1:6877bb99aa17 394
lolpcc 1:6877bb99aa17 395 temp = val / 10;
lolpcc 1:6877bb99aa17 396 pt[index] = (char)(val - (temp * 10));
lolpcc 1:6877bb99aa17 397 val = temp;
lolpcc 1:6877bb99aa17 398 index -= 1;
lolpcc 1:6877bb99aa17 399
lolpcc 1:6877bb99aa17 400 } while ( val > 0 );
lolpcc 1:6877bb99aa17 401
lolpcc 1:6877bb99aa17 402 print_seven_seg(sseg_map[pt[1]],sseg_map[pt[2]],sseg_map[pt[3]],sseg_map[pt[4]]);
lolpcc 1:6877bb99aa17 403 }
lolpcc 1:6877bb99aa17 404
lolpcc 0:9edfcca7cd25 405 void print_seven_seg(unsigned char a,unsigned char b,unsigned char c,unsigned char d)
lolpcc 0:9edfcca7cd25 406 {
lolpcc 0:9edfcca7cd25 407 unsigned char buf[10];
lolpcc 0:9edfcca7cd25 408
lolpcc 0:9edfcca7cd25 409 buf[0]=0;
lolpcc 0:9edfcca7cd25 410 buf[1]=0x27;
lolpcc 0:9edfcca7cd25 411 buf[2]=a;
lolpcc 0:9edfcca7cd25 412 buf[3]=b;
lolpcc 1:6877bb99aa17 413 buf[4]=c;
lolpcc 1:6877bb99aa17 414 buf[5]=d;
lolpcc 0:9edfcca7cd25 415 i2c.write(SEVEN_SEG,(char *)buf,7);
lolpcc 0:9edfcca7cd25 416 }
lolpcc 0:9edfcca7cd25 417
lolpcc 1:6877bb99aa17 418 /******************************************/
lolpcc 1:6877bb99aa17 419 /* */
lolpcc 1:6877bb99aa17 420 /* Test code to drive the Batron LCD */
lolpcc 1:6877bb99aa17 421 /* */
lolpcc 1:6877bb99aa17 422 /******************************************/
lolpcc 1:6877bb99aa17 423
lolpcc 1:6877bb99aa17 424 void batron_lcd_init(void)
lolpcc 1:6877bb99aa17 425 {
lolpcc 1:6877bb99aa17 426 char buf[0x60];
lolpcc 1:6877bb99aa17 427
lolpcc 1:6877bb99aa17 428 lprintf("Init Batron LCD at %02x\n\r",BAT);
lolpcc 1:6877bb99aa17 429
lolpcc 1:6877bb99aa17 430 buf[0]=0x00;
lolpcc 1:6877bb99aa17 431 buf[1]=0x34;
lolpcc 1:6877bb99aa17 432 buf[2]=0x0c;
lolpcc 1:6877bb99aa17 433 buf[3]=0x06;
lolpcc 1:6877bb99aa17 434 buf[4]=0x35;
lolpcc 1:6877bb99aa17 435 buf[5]=0x04;
lolpcc 1:6877bb99aa17 436 buf[6]=0x10;
lolpcc 1:6877bb99aa17 437 buf[7]=0x42;
lolpcc 1:6877bb99aa17 438 buf[8]=0x9f;
lolpcc 1:6877bb99aa17 439 buf[9]=0x34;
lolpcc 1:6877bb99aa17 440 buf[10]=0x80;
lolpcc 1:6877bb99aa17 441 buf[11]=0x02;
lolpcc 1:6877bb99aa17 442
lolpcc 1:6877bb99aa17 443 i2c.write(BAT,(char *)buf,12);
lolpcc 1:6877bb99aa17 444 batron_clear();
lolpcc 1:6877bb99aa17 445 }
lolpcc 1:6877bb99aa17 446 void batron(char *str)
lolpcc 1:6877bb99aa17 447 {
lolpcc 1:6877bb99aa17 448 lprintf("Testing Batron LCD, Clearing Display\n\r");
lolpcc 1:6877bb99aa17 449
lolpcc 1:6877bb99aa17 450 batron_clear();
lolpcc 1:6877bb99aa17 451
lolpcc 1:6877bb99aa17 452 lprintf("Sending %s\n",str);
lolpcc 1:6877bb99aa17 453
lolpcc 1:6877bb99aa17 454 batron_lcd_write(str);
lolpcc 1:6877bb99aa17 455 }
lolpcc 1:6877bb99aa17 456
lolpcc 1:6877bb99aa17 457 char batron_lcd_write(char *b)
lolpcc 0:9edfcca7cd25 458 {
lolpcc 1:6877bb99aa17 459 char buf[0x60];
lolpcc 1:6877bb99aa17 460 int a;
lolpcc 1:6877bb99aa17 461
lolpcc 1:6877bb99aa17 462 buf[0]=0x00;
lolpcc 1:6877bb99aa17 463 buf[1]=0x80;
lolpcc 1:6877bb99aa17 464 i2c.write(BAT,(char *)buf,2);
lolpcc 1:6877bb99aa17 465
lolpcc 1:6877bb99aa17 466 a=0;
lolpcc 1:6877bb99aa17 467 buf[0]=0x40;
lolpcc 1:6877bb99aa17 468
lolpcc 1:6877bb99aa17 469 while(a!=strlen(b)){
lolpcc 1:6877bb99aa17 470 buf[a+1]=ascii_to_lcd(b[a]);
lolpcc 1:6877bb99aa17 471 a++;
lolpcc 1:6877bb99aa17 472 }
lolpcc 1:6877bb99aa17 473 buf[a+1]=0x00;
lolpcc 1:6877bb99aa17 474
lolpcc 1:6877bb99aa17 475 i2c.write(BAT,buf,strlen(b)+1);
lolpcc 1:6877bb99aa17 476
lolpcc 1:6877bb99aa17 477 buf[0]=0x80;
lolpcc 1:6877bb99aa17 478 buf[1]=0x02;
lolpcc 1:6877bb99aa17 479 i2c.write(BAT,(char *)buf,2);
lolpcc 1:6877bb99aa17 480 return(0);
lolpcc 1:6877bb99aa17 481 }
lolpcc 1:6877bb99aa17 482
lolpcc 1:6877bb99aa17 483 char ascii_to_lcd(char ch)
lolpcc 1:6877bb99aa17 484 {
lolpcc 1:6877bb99aa17 485 char c;
lolpcc 1:6877bb99aa17 486
lolpcc 1:6877bb99aa17 487 c = 0xA0; // default: white space
lolpcc 1:6877bb99aa17 488
lolpcc 1:6877bb99aa17 489 if((ch>=' ') & (ch<='?'))
lolpcc 1:6877bb99aa17 490 c = ASCII_OFFSET + ch;
lolpcc 1:6877bb99aa17 491 if((ch>='A') & (ch<='Z'))
lolpcc 1:6877bb99aa17 492 c = ASCII_OFFSET + ch;
lolpcc 1:6877bb99aa17 493 if((ch>='a') & (ch<='z'))
lolpcc 1:6877bb99aa17 494 c = ASCII_OFFSET + ch;
lolpcc 1:6877bb99aa17 495 return c;
lolpcc 1:6877bb99aa17 496 }
lolpcc 1:6877bb99aa17 497 void batron_clear(void)
lolpcc 1:6877bb99aa17 498 {
lolpcc 1:6877bb99aa17 499 batron_clear_line(0); // clear 1st line
lolpcc 1:6877bb99aa17 500 batron_clear_line(1); // clear 2nd line
lolpcc 1:6877bb99aa17 501
lolpcc 1:6877bb99aa17 502 return;
lolpcc 1:6877bb99aa17 503 }
lolpcc 1:6877bb99aa17 504 char batron_clear_line(char row)
lolpcc 1:6877bb99aa17 505 {
lolpcc 1:6877bb99aa17 506 char i=0, state;
lolpcc 1:6877bb99aa17 507 do
lolpcc 1:6877bb99aa17 508 //state = LCD_put_xy(LCD_ascii_to_lcd(0x20), row, i);
lolpcc 1:6877bb99aa17 509 state = batron_put_xy(0xA0, row, i);
lolpcc 1:6877bb99aa17 510 while((i++<16));
lolpcc 1:6877bb99aa17 511 return state;
lolpcc 1:6877bb99aa17 512 }
lolpcc 1:6877bb99aa17 513 char batron_put_xy(char ddram_byte, char row, char column)
lolpcc 1:6877bb99aa17 514 {
lolpcc 1:6877bb99aa17 515 char buf[0x10];
lolpcc 1:6877bb99aa17 516 char adr;
lolpcc 1:6877bb99aa17 517
lolpcc 1:6877bb99aa17 518 if(row == 0) // line offset
lolpcc 1:6877bb99aa17 519 adr = column;
lolpcc 1:6877bb99aa17 520 else
lolpcc 1:6877bb99aa17 521 adr = 0x40 + column;
lolpcc 0:9edfcca7cd25 522
lolpcc 1:6877bb99aa17 523 buf[0] = 0x00; // Enter function setting
lolpcc 1:6877bb99aa17 524 buf[1] = 0x80 + adr; // LCD adr counter set to "adr"
lolpcc 1:6877bb99aa17 525
lolpcc 1:6877bb99aa17 526 i2c.write(BAT,(char *)buf,2);
lolpcc 1:6877bb99aa17 527
lolpcc 1:6877bb99aa17 528 buf[0] = 0x40; // write to DDRAM
lolpcc 1:6877bb99aa17 529 buf[1] = ddram_byte;
lolpcc 1:6877bb99aa17 530
lolpcc 1:6877bb99aa17 531 i2c.write(BAT,(char *)buf,2);
lolpcc 1:6877bb99aa17 532
lolpcc 1:6877bb99aa17 533 return(0);
lolpcc 1:6877bb99aa17 534 }
lolpcc 1:6877bb99aa17 535 /******************************************/
lolpcc 1:6877bb99aa17 536 /* */
lolpcc 1:6877bb99aa17 537 /* Test code for a matrix KBD built on a */
lolpcc 1:6877bb99aa17 538 /* PCF8574 I2C driver */
lolpcc 1:6877bb99aa17 539 /* State, 0 - test, 1 - wait till a press */
lolpcc 1:6877bb99aa17 540 /* Out on the lower nibble, in upper */
lolpcc 1:6877bb99aa17 541 /* */
lolpcc 1:6877bb99aa17 542 /******************************************/
lolpcc 1:6877bb99aa17 543
lolpcc 1:6877bb99aa17 544 char pcf8574_kbd(char state)
lolpcc 1:6877bb99aa17 545 {
lolpcc 1:6877bb99aa17 546 char buf[0x60];
lolpcc 1:6877bb99aa17 547
lolpcc 1:6877bb99aa17 548 char r = 0;
lolpcc 1:6877bb99aa17 549
lolpcc 1:6877bb99aa17 550 buf[0]=0xf0;
lolpcc 1:6877bb99aa17 551 i2c.write(BATKBD,(char *)buf,1);
lolpcc 1:6877bb99aa17 552 while(r==0){
lolpcc 1:6877bb99aa17 553 i2c.read(BATKBD,(char *)buf,1);
lolpcc 1:6877bb99aa17 554 if((buf[0] & 0xf0)!=0xf0){
lolpcc 1:6877bb99aa17 555 buf[0]=0xfe;
lolpcc 1:6877bb99aa17 556 i2c.write(BATKBD,(char *)buf,1);
lolpcc 1:6877bb99aa17 557 i2c.read(BATKBD,(char *)buf,1);
lolpcc 1:6877bb99aa17 558 if((buf[0] & 0xf0)!=0xf0)
lolpcc 1:6877bb99aa17 559 r = pcf8584_sub_kbd(buf[0]);
lolpcc 1:6877bb99aa17 560 buf[0]=0xfd;
lolpcc 1:6877bb99aa17 561 i2c.write(BATKBD,(char *)buf,1);
lolpcc 1:6877bb99aa17 562 i2c.read(BATKBD,(char *)buf,1);
lolpcc 1:6877bb99aa17 563 if((buf[0] & 0xf0)!=0xf0)
lolpcc 1:6877bb99aa17 564 r = pcf8584_sub_kbd(buf[0]);
lolpcc 1:6877bb99aa17 565 buf[0]=0xfb;
lolpcc 1:6877bb99aa17 566 i2c.write(BATKBD,(char *)buf,1);
lolpcc 1:6877bb99aa17 567 i2c.read(BATKBD,(char *)buf,1);
lolpcc 1:6877bb99aa17 568 if((buf[0] & 0xf0)!=0xf0)
lolpcc 1:6877bb99aa17 569 r = pcf8584_sub_kbd(buf[0]);
lolpcc 1:6877bb99aa17 570 buf[0]=0xf7;
lolpcc 1:6877bb99aa17 571 i2c.write(BATKBD,(char *)buf,1);
lolpcc 1:6877bb99aa17 572 i2c.read(BATKBD,(char *)buf,1);
lolpcc 1:6877bb99aa17 573 if((buf[0] & 0xf0)!=0xf0)
lolpcc 1:6877bb99aa17 574 r = pcf8584_sub_kbd(buf[0]);
lolpcc 1:6877bb99aa17 575 } else {
lolpcc 1:6877bb99aa17 576 buf[0]=0xf0;
lolpcc 1:6877bb99aa17 577 i2c.write(BATKBD,(char *)buf,1);
lolpcc 1:6877bb99aa17 578 }
lolpcc 1:6877bb99aa17 579 if(state==0)
lolpcc 1:6877bb99aa17 580 return(r);
lolpcc 1:6877bb99aa17 581 wait(0.2);
lolpcc 1:6877bb99aa17 582 }
lolpcc 1:6877bb99aa17 583
lolpcc 1:6877bb99aa17 584 return(r);
lolpcc 1:6877bb99aa17 585 }
lolpcc 1:6877bb99aa17 586 char pcf8584_sub_kbd(unsigned char d)
lolpcc 1:6877bb99aa17 587 {
lolpcc 1:6877bb99aa17 588 lprintf("Raw Code %02x, ",d);
lolpcc 1:6877bb99aa17 589 switch(d){
lolpcc 1:6877bb99aa17 590 case 0xee :
lolpcc 1:6877bb99aa17 591 return('c');
lolpcc 1:6877bb99aa17 592 case 0xed :
lolpcc 1:6877bb99aa17 593 return('d');
lolpcc 1:6877bb99aa17 594 case 0xeb :
lolpcc 1:6877bb99aa17 595 return('e');
lolpcc 1:6877bb99aa17 596 case 0xe7 :
lolpcc 1:6877bb99aa17 597 return('f');
lolpcc 1:6877bb99aa17 598 case 0xde :
lolpcc 1:6877bb99aa17 599 return('b');
lolpcc 1:6877bb99aa17 600 case 0xdd :
lolpcc 1:6877bb99aa17 601 return('9');
lolpcc 1:6877bb99aa17 602 case 0xdb :
lolpcc 1:6877bb99aa17 603 return('6');
lolpcc 1:6877bb99aa17 604 case 0xd7 :
lolpcc 1:6877bb99aa17 605 return('3');
lolpcc 1:6877bb99aa17 606 case 0xbe :
lolpcc 1:6877bb99aa17 607 return('0');
lolpcc 1:6877bb99aa17 608 case 0xbd :
lolpcc 1:6877bb99aa17 609 return('8');
lolpcc 1:6877bb99aa17 610 case 0xbb :
lolpcc 1:6877bb99aa17 611 return('5');
lolpcc 1:6877bb99aa17 612 case 0xb7 :
lolpcc 1:6877bb99aa17 613 return('2');
lolpcc 1:6877bb99aa17 614 case 0x7e :
lolpcc 1:6877bb99aa17 615 return('a');
lolpcc 1:6877bb99aa17 616 case 0x7d :
lolpcc 1:6877bb99aa17 617 return('7');
lolpcc 1:6877bb99aa17 618 case 0x7b :
lolpcc 1:6877bb99aa17 619 return('4');
lolpcc 1:6877bb99aa17 620 case 0x77 :
lolpcc 1:6877bb99aa17 621 return('1');
lolpcc 1:6877bb99aa17 622 default :
lolpcc 1:6877bb99aa17 623 lprintf("Strange key value passed 0X%02x\n\r",d);
lolpcc 1:6877bb99aa17 624 return(0);
lolpcc 1:6877bb99aa17 625 }
lolpcc 0:9edfcca7cd25 626 }