![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Projekt-Alarmclock
Dependencies: LCD RTC8563 Wecker mbed
Diff: main.cpp
- Revision:
- 1:b71a6c225c2b
- Parent:
- 0:bb9c3f242f5a
- Child:
- 2:d3708e92660f
diff -r bb9c3f242f5a -r b71a6c225c2b main.cpp --- a/main.cpp Thu Apr 30 10:38:17 2015 +0000 +++ b/main.cpp Fri May 29 12:01:00 2015 +0000 @@ -4,14 +4,209 @@ #include "RTC8563.h" #include "Wecker.h" +Wecker wecker; -Wecker wecker; +void btnStdr(); +void btnMinr(); +void btnSlpr(); +void btnSlpf(); +void tickControll(); + +typedef enum {Normal, setAlarm, AlarmOn, Alarm, Sleep} state; +state Mode=Normal; +char sMode[2]; + +Ticker tick1; +Timer tim1,tim2,tim3; + +InterruptIn swStd(P0_15); +InterruptIn swMin(P0_23); +InterruptIn swSlp(P0_10); +DigitalIn alarm(P1_28); +DigitalOut myled(LED1); + int main() { wecker.rtc_init(); + swStd.rise(&btnStdr); + swMin.rise(&btnMinr); + swSlp.rise(&btnSlpr); + swSlp.fall(&btnSlpf); + tick1.attach(&tickControll,0.01); while(1) { wecker.printTime(); + wecker.printState(sMode); wecker.printAlarmTime(); wait(0.1); } +} + + + +void btnSlpr() +{ + wait_ms(20); + switch (Mode) { + case Normal: + if(tim1.read()==0) + tim1.start(); + if (swStd==1 || swMin==1) + 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; + break; + } +} + +void btnStdr() +{ + wait_ms(20); + switch(Mode) { + case Normal: + int nextStd = wecker.unbcd(wecker.rtc_read(HOURS)); + if (swSlp != 1) { + 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 btnMinr() +{ + wait_ms(20); + switch(Mode) { + case Normal: + int nextMin = wecker.unbcd(wecker.rtc_read(MINUTES)); + if (swSlp != 1) { + 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==0 && swMin==0) + tim2.start(); + if(tim2.read()>=5.0) { + Mode=Normal; + tim2.stop(); + tim2.reset(); + } + break; + case AlarmOn: + strcpy(sMode,"AO"); + if(alarm==0) + Mode=Alarm; + break; + case Sleep: + if(tim3.read()==0) + tim3.start(); + if(tim3.read()>=300) { + Mode=Alarm; + tim3.stop(); + tim3.reset(); + } + strcpy(sMode,"Sl"); + myled=0; + break; + case Alarm: + if(tim3.read()==0) + tim3.start(); + if(tim3.read()>=300) { + Mode=Sleep; + tim3.stop(); + tim3.reset(); + } + strcpy(sMode,"Al"); + myled=1; + break; + } +} + +void btnSlpf() +{ + switch(Mode) { + case Normal: + if (swStd==1 || swMin==1) + 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; + } + } } \ No newline at end of file