Wecker-Library
Dependents: Projekt_Wecker_LCD Projekt_Wecker_LCD Projekt_Wecker_LCD
Wecker.cpp
- Committer:
- wolpra98
- Date:
- 2015-04-30
- Revision:
- 0:6f0b18518e88
- Child:
- 1:ade7876100e2
File content as of revision 0:6f0b18518e88:
#include "mbed.h" #include "LCD.h" #include "const.h" #include "RTC8563.h" #include "Wecker.h" char week; int hour, minute, sec; int hrse, hrsz, mine, minz, sece, secz; int ahour, aminute, ahrse, ahrsz, amine, aminz; int nextStd, nextMin; typedef enum {Normal, setAlarm, AlarmOn, Alarm, Sleep} state; state Mode=Normal; Ticker tick1; Timer tim1,tim2; RTC8563 rtc; Serial pc(USBTX, USBRX); I2C i2c(p28, p27); LCD lcd(p11, p6, p7, p8, p9, p10); InterruptIn swStd(P1_16); InterruptIn swMin(P0_23); InterruptIn swSlp(P0_10); Wecker::Wecker() { swStd.rise(this, &Wecker::btn1); swMin.rise(this, &Wecker::btn2); swSlp.rise(this, &Wecker::btn3); //tick1.attach(this, &Wecker::tickHold,0.1); } void Wecker::printTime() { lcd.home(); week = rtc.rtc_read(WEEKDAYS); hour = rtc.rtc_read(HOURS); minute = rtc.rtc_read(MINUTES); sec = rtc.rtc_read(SECONDS); hrsz = ((hour >> 4)&0x03) + 48; hrse = (hour & 0x0F) + 48; minz = (minute >> 4) + 48; mine = (minute & 0x0F) + 48; secz = (sec >> 4) + 48; sece = (sec & 0x0F) + 48; lcd.data(hrsz); lcd.data(hrse); lcd.string(":"); lcd.data(minz); lcd.data(mine); lcd.string(":"); lcd.data(secz); lcd.data(sece); } int Wecker::bcd(int dec) { return ((dec/10)<<4)+(dec%10); } int Wecker::unbcd(int bcd) { return ((bcd>>4)*10)+(bcd%16); } void Wecker::printAlarmTime() { lcd.setcursor(0,2); ahour = rtc.rtc_read(HOUR_ALARM); aminute = rtc.rtc_read(MINUTE_ALARM); ahrsz = ((ahour >> 4)&0x03) + 48; ahrse = (ahour & 0x0F) + 48; aminz = (aminute >> 4) + 48; amine = (aminute & 0x0F) + 48; lcd.string("Alarm:"); lcd.data(ahrsz); lcd.data(ahrse); lcd.string(":"); lcd.data(aminz); lcd.data(amine); lcd.string(":00"); } void Wecker::btn1() { switch (Mode) { case Normal: int nextStd = unbcd(rtc.rtc_read(HOURS)); if (nextStd>=23) nextStd=0; else nextStd++; rtc.rtc_write(HOURS, bcd(nextStd)); while(swStd==1); break; case setAlarm: nextStd = unbcd(rtc.rtc_read(HOUR_ALARM)); if (nextStd>=23) nextStd=0; else nextStd++; rtc.rtc_write(HOUR_ALARM, bcd(nextStd)); while(swStd==1); break; } } void Wecker::btn2() { switch (Mode) { case Normal: nextMin = unbcd(rtc.rtc_read(MINUTES)); if (nextMin>=59) nextMin=0; else nextMin++; rtc.rtc_write(MINUTES, bcd(nextMin)); while(swStd==1); break; case setAlarm: nextMin = unbcd(rtc.rtc_read(MINUTE_ALARM)); if (nextMin>=59) nextMin=0; else nextMin++; rtc.rtc_write(MINUTE_ALARM, bcd(nextMin)); while(swStd==1); break; } } void Wecker::tickHold() { switch (Mode) { case Normal: if (swSlp==1) tim2.start(); if ((swStd==1&&tim2.read()<5.0)||(swMin==1&&tim2.read()<5.0)) { Mode =setAlarm; tim2.stop(); tim2.reset(); } else { tim2.stop(); tim2.reset(); } break; case AlarmOn: if (swSlp==1) tim1.start(); while(swSlp==1); tim1.stop(); if (tim1.read()>=3.0) Mode = Normal; tim1.reset(); break; case Sleep: if (swSlp==1) tim1.start(); while(swSlp==1); tim1.stop(); if (tim1.read()>=3.0) Mode = Normal; tim1.reset(); break; } } void Wecker::btn3() { switch (Mode) { case Normal: tim1.start(); while(swSlp==1); tim1.stop(); if (tim1.read()>=3.0) Mode = Alarm; tim1.reset(); } }