Si-Labs EFM32 Back Up domain and BUrtc demo.
Dependencies: EFM32_BUrtc EFM32_CapSenseSlider EFM32_SegmentLCD mbed
Diff: main.cpp
- Revision:
- 0:dc30d5f06316
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon May 16 23:12:55 2016 +0000 @@ -0,0 +1,97 @@ + +#include "mbed.h" +#include "EFM32_SegmentLCD.h" +#include "EFM32_CapSenseSlider.h" +#include "BUrtc.h" + +silabs::EFM32_SegmentLCD segmentDisplay; +silabs::EFM32_CapSenseSlider capSlider; + +InterruptIn MinMonth(SW0); +InterruptIn HourDate(SW1); + +DigitalOut led1(LED1); +DigitalOut led2(LED2); + +char timebuff[20], lcdTime[8]; +int initialized = false; +int month,date,lcdDate,slider; + +struct tm t; + +void displayRefresh(),timeSet(),dateSet(); + +int main() +{ + // set up BU domain and BUrtc if not started, else restore system RTC from BUrtc + BUrtcInit(); + + // set the reset time + t.tm_sec = 0; // 0-59 + t.tm_min = 0; // 0-59 + t.tm_hour = 0; // 0-23 + t.tm_mday = 17; // 1-31 + t.tm_mon = 4; // 0-11 + t.tm_year = 116; // years since 1900 + + // time setting button interrupts + HourDate.fall(&timeSet); + MinMonth.fall(&timeSet); + capSlider.start(); + capSlider.attach_slide(-1, dateSet); + + while(1) { + + // Sleep while waiting for interrupt + EMU_EnterEM2(true); + // Run display update code on wake up + displayRefresh(); + } +} + +void displayRefresh() +{ + if (!initialized) { + segmentDisplay.Symbol(LCD_SYMBOL_COL3,true); + segmentDisplay.Symbol(LCD_SYMBOL_COL5,true); + SegmentLCD_Symbol(LCD_SYMBOL_DP10, true); + // set time if RTC is reset + if(time(NULL)<10) { + RTCset(mktime(&t)); + } + initialized = true; + } + time_t seconds = time(NULL); + strftime(timebuff, 2,"%d", localtime(&seconds)); + date = atoi(timebuff); + strftime(timebuff, 2,"%m", localtime(&seconds)); + month = atoi(timebuff); + lcdDate = ((date %31)* 100 + (month % 12)); + strftime(lcdTime,8,"%H%M%S", localtime(&seconds)); + + SegmentLCD_Write(lcdTime); + segmentDisplay.Number(lcdDate); + segmentDisplay.Symbol(LCD_SYMBOL_EFM32, seconds & 0x1); + led1=0;led2=0; +} + +void dateSet() { + + // set date by tapping slider, slow and fast settings + slider = capSlider.get_position(); + led2=!led2; + time_t seconds = time(NULL); + seconds=seconds + (86400 * (slider/10)); + RTCset(seconds); +} + +void timeSet() +{ + // set hours and minutes with buttons, set date first, can't go backwards + led1=!led1; + time_t seconds = time(NULL); + if(MinMonth){seconds=seconds+60;} + if(HourDate){seconds=seconds+3600;} + RTCset(seconds); +} +