Brian Pearson
/
LPC1768BirefInterface
Biref interface
main.cpp
- Committer:
- BPPearson
- Date:
- 2016-01-05
- Revision:
- 0:b6f6b0483eff
File content as of revision 0:b6f6b0483eff:
#include "mbed.h" #define COMMAND 0 #define DATA 1 Serial pc(USBTX, USBRX); Serial birefSensor(p9,p10); DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); AnalogOut birefOut(p18); BusInOut databus(p21, p22, p23, p24, p25, p26, p27, p28); DigitalOut registerSelect(p30); DigitalOut readWriteClock(p29); Ticker updateLCD; char rcvBuff[80]; int buffIdx = 0; float birefVal, birefStdDev; void writeToLCD(bool rs, char data){ // set register select pin registerSelect = rs; // set read/write pin to write //readWrite = 0; // set bus as output databus.output(); // put data onto bus databus = data; // pulse read/write clock readWriteClock = 1; wait_us(1); readWriteClock = 0; wait_us(1); // clear data bus databus = 0; //pc.printf("%02x\n", data); } char readFromLCD(bool rs){ char data; // set register select pin registerSelect = rs; // set read/write pin to read //readWrite = 1; // set bus as output databus.input(); // put data onto bus data = databus; // pulse read/write clock readWriteClock = 1; wait_us(10); readWriteClock = 0; return data; } void resetLCD(){ } void initLCD(){ // wait 15 ms to allow LCD to initialise wait_ms(15); // set interface for 8 bit mode writeToLCD(COMMAND, 0x30); // give it time wait_ms(5); // set interface for 8 bit mode again writeToLCD(COMMAND, 0x30); // give it time wait_us(100); // set interface for 8 bit mode again, last one before we can configure the display writeToLCD(COMMAND, 0x30); // give it time wait_us(500); // set interface for 8 bit mode, 2 display lines and 5 x 8 character font writeToLCD(COMMAND, 0x38); // give it time wait_us(100); // display off writeToLCD(COMMAND, 0x08); // give it time wait_us(100); // clear the screen writeToLCD(COMMAND, 0x01); // give it time to finish wait_ms(2); // set entry mode to increment cursor position cursor on write writeToLCD(COMMAND, 0x03); // give it time to finish wait_us(100); // position cursor at home writeToLCD(COMMAND, 0x02); // give it time to finish wait_ms(2); // display on writeToLCD(COMMAND, 0x0C); } void positionCursor(uint8_t x, uint8_t y){ if (x > 7) x = 0; if (y == 1) writeToLCD(COMMAND, 0x80 + 0x40 + x); else writeToLCD(COMMAND, 0x80 + 0x00 + x); wait_us(50); } void displayString(int x, int y, char *str){ // position cursor positionCursor(x, y); // write string to screen for (int i=0; i<strlen(str); i++){ writeToLCD(DATA, str[i]); wait_us(50); } } void updateDisplay(){ char str[20]; sprintf( str, "b %5.3f", birefVal); displayString(0, 0, str); if (birefStdDev <= 0.0) birefStdDev = 0.0001; sprintf( str, "s %5.3f", birefStdDev); displayString(0, 1, str); } void rcvCharISR() { float tempf; char chr = birefSensor.getc(); //led1 = !led1; //pc.printf("%c (%02x)\n", chr, chr); rcvBuff[buffIdx++] = chr; if (buffIdx >= 80) { buffIdx = 0; } if (chr == '\n') { rcvBuff[buffIdx] = '\0'; switch (rcvBuff[0]){ case 'm': sscanf(rcvBuff, "m%f %f\n", &birefVal, &birefStdDev); birefOut = birefVal; break; case 'd': sscanf(rcvBuff, "d%f %f %f %f %f %f \n", &tempf, &tempf, &tempf, &tempf, &birefVal, &birefStdDev); birefOut = birefVal; break; default: ; } buffIdx = 0; } } int main() { initLCD(); birefSensor.baud(115200); pc.printf("Hello\n"); updateLCD.attach(&updateDisplay, 0.5); birefSensor.attach(&rcvCharISR); while(1) { wait(0.02); //wait(1.0); } }