malcolm lear
/
LabmbedV30
Labmbed device drivers
Diff: main.cpp
- Revision:
- 3:8eee79f59b30
- Parent:
- 2:caa0e6b2b436
- Child:
- 4:e2310d494d19
--- a/main.cpp Thu Jan 12 09:16:08 2017 +0000 +++ b/main.cpp Thu Jan 12 15:33:58 2017 +0000 @@ -6,6 +6,13 @@ TextLCD lcd(p15, p16, p17, p18, p19, p20); // LCD: RS, E, D4-D7 SPI spi(p5, p6, p7); // SPI: MOSI, MISO, SCLK (MISO not used with LCD) DigitalOut lat(p8); // data latch for LED driver TLC59281 +DigitalOut sel0(p26); // input select bits: +DigitalOut sel1(p25); // " +DigitalOut sel2(p24); // " +DigitalIn in0(p14); // input from switches, keypad etc +DigitalIn in1(p13); // " +DigitalIn in2(p12); // " +DigitalIn in3(p11); // " I2C i2c(p9, p10); // I2C: SDA, SCL int led_bits = 0; // global LED status used for readback @@ -47,20 +54,45 @@ return led_bits; // return LED status } -//int readswitch(int switchno) { -//} +void selinput(int input) { + sel0 = input & 0x0001; // set sel[0:2] pins + sel1 = (input >> 1) & 0x0001; // + sel2 = (input >> 2) & 0x0001; // +} -//int readswitches(int switchno) { -//} +int readswitches() { + selinput(5); // select least significant 4 switches in[3:0] + int switches = in0 + (in1 << 1) + (in2 << 2) + (in3 << 3); + selinput(4); // select most significant 4 switches in[3:0] + return (switches + (in0 << 4)+ (in1 << 5) + (in2 << 6) + (in3 << 7)); +} -//int readkey(int keyno) { -//} +int readswitch(int switchno) { + switchno = ((switchno - 1) & 0x0007) + 1; // limit switch number + switchno = 8 - switchno; // offset of switch state in readswitches() + int switchstate = readswitches(); + switchstate = switchstate >> switchno; // shift selected switch state into ls bit + return (switchstate & 0x0001); // mask out and return switch state +} -//int readkeyrow(int keyrow) { -//} +int readkeys() { + selinput(0); // select keypad top row + int keys = (in0 << 15) + (in1 << 14) + (in2 << 13) + (in3 << 12); + selinput(1); // select keypad second row + keys = keys + (in0 << 3) + (in1 << 6) + (in2 << 9) + (in3 << 11); + selinput(2); // select keypad third row + keys = keys + (in0 << 2) + (in1 << 5) + (in2 << 8) + in3; + selinput(3); // select keypad forth row + keys = keys + (in0 << 1) + (in1 << 4) + (in2 << 7) + (in3 << 10); + return (keys ^ 0xffff); // return inverted (key press active high) +} -//int readkeys() { -//} +int readkey(int keyno) { + keyno = keyno & 0x000f; // limit key number 0 to 15 (0 to F) + int keystate = readkeys(); + keystate = keystate >> keyno; // shift selected key state into ls bit + return (keystate & 0x0001); // mask out and return key state +} float readtemp() { char cmd[3]; @@ -84,12 +116,26 @@ for (b = 0; b < 4; b++ ) { for (a = 1; a < 9; a++ ) { setled (a,b); - wait(.5); + wait(.1); } } - float temp = readtemp(); - lcd.printf(" \n"); - lcd.printf("Temp = %f\n", temp); - wait(3); + for (a= 1; a < 9; a++ ) { + setled (a,(readswitch(a) * 3)); + } + float temp = readtemp(); + lcd.printf(" "); + lcd.printf("Temp = %f\n", temp); + wait(1); + int switches = readswitches(); + lcd.printf(" "); + lcd.printf("Switches = %d\n", switches); + wait(1); + int keys = readkeys(); + lcd.printf(" "); + lcd.printf("Keys = %d\n", keys); + wait(1); + int key = readkey(5); + lcd.printf(" "); + lcd.printf("Key5 = %d\n", key); } }