malcolm lear
/
LabmbedV30
Labmbed device drivers
Diff: main.cpp
- Revision:
- 0:416329806e55
- Child:
- 1:04e1ee8faa04
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Jan 11 11:19:03 2017 +0000 @@ -0,0 +1,105 @@ +// Demo Program for Labmbed Board + +#include "mbed.h" +#include "TextLCD.h" + +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); +I2C i2c(p9, p10); // I2C: SDA, SCL + +int led_bits = 0; // global LED status used for readback +const int tmp102addr = 0x92; // TMP102 temperature I2C address + + +void initleds() { + lat = 0; // latch must start low + spi.format(16,0); // SPI 16 bit data, low state, high going clock + spi.frequency(1000000); // 1MHz clock rate +} + +void setleds(int ledall) { + led_bits = ledall; + spi.write((led_bits & 0x03ff) | ((led_bits & 0xa800) >> 1) | ((led_bits & 0x5400) << 1)); + lat = 1; // latch pulse start + lat = 0; // latch pulse end +} + +void setled(int ledno, int ledstate) { + ledno = ((ledno - 1) & 0x0007) + 1; // limit led number + ledno = (8 - ledno) * 2; // offset of led state in 'led_bits' + ledstate = ledstate & 0x0003; // limit led state + ledstate = ledstate << ledno; + int statemask = 0x0003; + statemask = ((statemask << ledno) ^ 0xffff); + led_bits = ((led_bits & statemask) | ledstate); + setleds(led_bits); +} + +int readled(int ledno) { + ledno = ((ledno - 1) & 0x0007) + 1; // limit led number + ledno = (8 - ledno) * 2; // offset of led state in 'led_bits' + int ledstate = led_bits; + ledstate = ledstate >> ledno; + return (ledstate & 0x0003); +} + +int readleds() { + return led_bits; +} + +//int readswitch(int switchno) { +//} + +//int readswitches(int switchno) { +//} + +//int readkey(int keyno) { +//} + +//int readkeyrow(int keyrow) { +//} + +//int readkeys() { +//} + +float readtemp() { + char cmd[2]; + cmd[0] = 0x01; + cmd[1] = 0x00; + i2c.write(tmp102addr, cmd, 2); + wait(0.5); + cmd[0] = 0x00; + i2c.write(tmp102addr, cmd, 1); + i2c.read(tmp102addr, cmd, 2); + return (float((cmd[0]<<8)|cmd[1]) / 256.0); +} + +int main() { + + initleds(); + + while(1) { + + setled (5,2); + setled (6,1); + setled (7,3); + + int led = readled(6); + lcd.printf(" \n"); + lcd.printf("LED6 = %d\n", led); + wait(3); + + setleds(0x5555); + led = readleds(); + lcd.printf(" \n"); + lcd.printf("LEDs = %d\n", led); + wait(3); + + float temp = readtemp(); + lcd.printf(" \n"); + lcd.printf("Temp = %f\n", temp); + wait(3); + + } +}