Projekt-Alarmclock
Dependencies: LCD RTC8563 Wecker mbed
main.cpp
- Committer:
- wolpra98
- Date:
- 2015-06-25
- Revision:
- 2:d3708e92660f
- Parent:
- 1:b71a6c225c2b
File content as of revision 2:d3708e92660f:
#include "mbed.h" #include "LCD.h" #include "const.h" #include "RTC8563.h" #include "Wecker.h" Wecker wecker; void btnStdf(); void btnMinf(); void btnSlpr(); void btnSlpf(); void tickControll(); void blink(); typedef enum {Normal, setAlarm, AlarmOn, Alarm, Sleep} state; state Mode=Normal; char sMode[2]; Ticker tick1; Timer tim1,tim2,tim3; InterruptIn swStd(p22); InterruptIn swMin(p23); InterruptIn swSlp(p21); DigitalOut alarmOut(p24,0); DigitalIn alarm(P1_28); DigitalOut myled(LED1); const int SlpAlTime = (60)*5; int main() { swMin.mode(PullUp); swStd.mode(PullUp); swSlp.mode(PullUp); alarmOut=0; while(swSlp==1); alarmOut=0; wait(1); wecker.rtc_init(); swMin.mode(PullUp); swStd.mode(PullUp); swSlp.mode(PullUp); swStd.fall(&btnStdf); swMin.fall(&btnMinf); swSlp.rise(&btnSlpr); swSlp.fall(&btnSlpf); tick1.attach(&tickControll,0.01); while(1) { wecker.printTime(); wecker.printState(sMode); wecker.printAlarmTime(); wait(0.1); } } void btnSlpf() { wait_ms(20); switch (Mode) { case Normal: if(tim1.read()==0) tim1.start(); if (swStd==0 || swMin==0) Mode = setAlarm; break; case AlarmOn: if (tim1.read()==0) tim1.start(); break; case Sleep: if (tim1.read()==0) tim1.start(); break; case Alarm: Mode=Sleep; tim3.stop(); tim3.reset(); break; } } void btnStdf() { wait_ms(20); switch(Mode) { case Normal: int nextStd = wecker.unbcd(wecker.rtc_read(HOURS)); if (swSlp != 0) { if (nextStd>=23) nextStd=0; else nextStd++; wecker.rtc_write(HOURS, wecker.bcd(nextStd)); } break; case setAlarm: tim2.stop(); tim2.reset(); nextStd = wecker.unbcd(wecker.rtc_read(HOUR_ALARM)); if (nextStd>=23) nextStd=0; else nextStd++; wecker.rtc_write(HOUR_ALARM, wecker.bcd(nextStd)); break; case Alarm: Mode=Sleep; tim3.stop(); tim3.reset(); break; } } void btnMinf() { wait_ms(20); switch(Mode) { case Normal: int nextMin = wecker.unbcd(wecker.rtc_read(MINUTES)); if (swSlp != 0) { if (nextMin>=59) nextMin=0; else nextMin++; wecker.rtc_write(MINUTES, wecker.bcd(nextMin)); } break; case setAlarm: tim2.stop(); tim2.reset(); nextMin = wecker.unbcd(wecker.rtc_read(MINUTE_ALARM)); if (nextMin>=59) nextMin=0; else nextMin++; wecker.rtc_write(MINUTE_ALARM, wecker.bcd(nextMin)); break; case Alarm: tim3.stop(); tim3.reset(); Mode=Sleep; break; } } void tickControll() { switch(Mode) { case Normal: strcpy(sMode,"No"); break; case setAlarm: strcpy(sMode,"sA"); if(swStd==1 && swMin==1) tim2.start(); if(tim2.read()>=5.0) { Mode=Normal; tim2.stop(); tim2.reset(); } break; case AlarmOn: strcpy(sMode,"AO"); if(alarm==0) Mode=Alarm; //else if((wecker.rtc_read(MINUTE_ALARM) == wecker.rtc_read(MINUTES)) && (wecker.rtc_read(HOUR_ALARM)==wecker.rtc_read(HOURS))) // Mode=Alarm; break; case Sleep: if(tim3.read()==0) tim3.start(); if(tim3.read()>=SlpAlTime) { Mode=Alarm; tim3.stop(); tim3.reset(); } strcpy(sMode,"Sl"); alarmOut=0; break; case Alarm: if(tim3.read()==0) tim3.start(); if(tim3.read()>=SlpAlTime) { Mode=Sleep; tim3.stop(); tim3.reset(); } strcpy(sMode,"Al"); alarmOut=1; break; } } void btnSlpr() { switch(Mode) { case Normal: if (swStd==0 || swMin==0) Mode = setAlarm; if(tim1.read()!=0) { tim1.stop(); if (tim1.read()>=3.0) { Mode = AlarmOn; wecker.rtc_write(CONTROL2, 0x02); } tim1.reset(); } break; case AlarmOn: tim1.stop(); if (tim1.read()>=3.0) { Mode = Normal; wecker.rtc_write(CONTROL2, 0); } tim1.reset(); break; case Sleep: tim1.stop(); if (tim1.read()>=3.0) { Mode = Normal; tim3.stop(); tim3.reset(); } wecker.rtc_write(CONTROL2, 0); tim1.reset(); break; } }