#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "lib/lcd/lcd_hd44780_avr.h"
#include "lib/keypad/keypad.h"
#define MICRO_DDR DDRD
#define MICRO_PORT PORTD
#define MICRO_POS PD0
#define GRILL_DDR DDRD
#define GRILL_PORT PORTD
#define GRILL_POS PD1
#define BUZZER_DDR DDRB
#define BUZZER_PORT PORTB
#define BUZZER_POS PB1
#define ON 1
#define OFF 0
#define TYPE_MICRO 1
#define TYPE_GRILL 2
void Init();
void SetMicro(uint8_t state);
void SetGrill(uint8_t state);
void SetTime();
void CountDown();
void SetBuzzer(uint8_t);
void Beep();
volatile uint8_t m=0;
volatile uint8_t s=0;
volatile uint8_t timer_running=0;
uint8_t type=TYPE_MICRO;
int main(void)
{
Init();
while(1)
{
LCDClear();
LCDWriteFStringXY(3,0,PSTR("* Press *"));
LCDWriteFStringXY(1,1,PSTR("Micro or Grill"));
uint8_t k=GetKeypadCmd(1);
switch(k)
{
case KEY_MICRO:
{
Beep();
type=TYPE_MICRO;
SetTime();
timer_running=1;
if(type==TYPE_MICRO)
SetMicro(ON);
else
SetGrill(ON);
CountDown();
break;
}
case KEY_GRILL:
{
Beep();
type=TYPE_GRILL;
SetTime();
timer_running=1;
if(type==TYPE_MICRO)
SetMicro(ON);
else
SetGrill(ON);
CountDown();
break;
}
case KEY_START:
{
Beep();
//QUICK START
type=TYPE_MICRO;
if(!timer_running)
{
s=30;
timer_running=1;
SetMicro(ON);
CountDown();
break;
}
}
}
}
}
void Beep()
{
SetBuzzer(ON);
_delay_ms(25);
SetBuzzer(OFF);
_delay_ms(25);
}
void Init()
{
//Set relay io lines as out put
MICRO_DDR|=(1<<MICRO_POS); //Microwave relay
GRILL_DDR|=(1<<GRILL_POS); //Grill relay
//Set Buzzer line as output
BUZZER_DDR|=(1<<BUZZER_POS);
//Initialize LCD Module
LCDInit(LS_NONE);
//Initiallize keypad lib
KeypadInit();
//Init TIMER1 for main timer operation
TCCR1B=(1<<WGM12)|(1<<CS12)|(1<<CS10); //CTC Mode prescaller 1024
OCR1A=976;
TIMSK|=(1<<OCIE1A);
}
ISR(TIMER1_COMPA_vect)
{
if(!timer_running)
return;
if(s==0)
{
if(m==0)
{
//off
timer_running=0;
}
else
{
m--;
s=59;
}
}
else
{
s--;
}
}
void SetMicro(uint8_t state)
{
if(state==ON)
{
MICRO_PORT|=(1<<MICRO_POS);
}
else
{
MICRO_PORT&=~(1<<MICRO_POS);
}
}
void SetBuzzer(uint8_t state)
{
if(state==ON)
{
BUZZER_PORT|=(1<<BUZZER_POS);
}
else
{
BUZZER_PORT&=~(1<<BUZZER_POS);
}
}
void SetGrill(uint8_t state)
{
if(state==ON)
{
GRILL_PORT|=(1<<GRILL_POS);
}
else
{
GRILL_PORT&=~(1<<GRILL_POS);
}
}
void SetTime()
{
uint8_t sec=0;
LCDClear();
while(1)
{
if(type==TYPE_MICRO)
{
LCDWriteFStringXY(0,0,PSTR("MICRO"));
}
else
{
LCDWriteFStringXY(0,0,PSTR("GRILL"));
}
LCDWriteFStringXY(6,0,PSTR("MM:SS "));
LCDWriteIntXY
(6,1,min,2); LCDWriteIntXY(9,1,sec,2);
LCDWriteFStringXY(8,1,PSTR(":"));
uint8_t
key=GetKeypadCmd
(1);
{
case KEY_TS:
if(min<90)
{
Beep();
sec+=10;
if(sec==60)
{
sec=0;
}
}
break;
case KEY_M:
{
if(min<90)
{
Beep();
}
break;
}
case KEY_TM:
{
if(min<90)
{
if(min>=90)
{
sec=0;
}
else
Beep();
}
break;
}
case KEY_STOP:
Beep();
sec=0;
break;
case KEY_GRILL:
Beep();
type=TYPE_GRILL;
break;
case KEY_MICRO:
Beep();
type=TYPE_MICRO;
break;
case KEY_START:
{
if(min>0 || sec>0)
{
Beep();
s=sec;
return;
}
}
}
}
}
void CountDown()
{
LCDClear();
while(1)
{
uint8_t k=GetKeypadCmd(0);
if(k==KEY_STOP)
{
//Pause
timer_running=0;
SetMicro(OFF);
SetGrill(OFF);
LCDWriteFStringXY(7,0,PSTR("PAUSED!"));
LCDWriteFStringXY(6,1,PSTR("Press Start"));
Beep();
while(1)
{
k=GetKeypadCmd(1);
if(k==KEY_START)
{
Beep();
break;
}
}
timer_running=1;
if(type==TYPE_MICRO)
SetMicro(ON);
else
SetGrill(ON);
LCDClear();
}
else if(k==KEY_START)
{
if(m<=89)
{
if(s<30)
{
s+=30;
if(s>=60)
{
m++;
s=s-60;
}
Beep();
}
}
}
if(m==0 && s==0)
{
LCDClear();
LCDWriteFStringXY(0,5,PSTR("Ready !"));
SetMicro(OFF);
SetGrill(OFF);
//Alert
for(uint8_t i=0;i<4;i++)
{
SetBuzzer(ON);
_delay_ms(500);
SetBuzzer(OFF);
_delay_ms(500);
}
GetKeypadCmd(1);
Beep();
return;
}
LCDWriteIntXY(0,1,m,2);
if(s%2)
{
LCDWriteStringXY(2,1,":");
}
else
{
LCDWriteStringXY(2,1," ");
}
LCDWriteIntXY(3,1,s,2);
if(type==TYPE_MICRO)
{
LCDWriteFStringXY(0,0,PSTR("MICRO"));
}
else
{
LCDWriteFStringXY(0,0,PSTR("GRILL"));
}
}
}
I2luY2x1ZGUgPGF2ci9pby5oPgojaW5jbHVkZSA8YXZyL3BnbXNwYWNlLmg+CiNpbmNsdWRlIDx1dGlsL2RlbGF5Lmg+CiNpbmNsdWRlIDxhdnIvaW50ZXJydXB0Lmg+CgojaW5jbHVkZSAibGliL2xjZC9sY2RfaGQ0NDc4MF9hdnIuaCIKI2luY2x1ZGUgImxpYi9rZXlwYWQva2V5cGFkLmgiCgojZGVmaW5lIE1JQ1JPX0REUglERFJECiNkZWZpbmUgTUlDUk9fUE9SVAlQT1JURAojZGVmaW5lIE1JQ1JPX1BPUwlQRDAKCiNkZWZpbmUgR1JJTExfRERSCUREUkQKI2RlZmluZSBHUklMTF9QT1JUCVBPUlRECiNkZWZpbmUgR1JJTExfUE9TCVBEMQoKI2RlZmluZSBCVVpaRVJfRERSCUREUkIKI2RlZmluZSBCVVpaRVJfUE9SVAlQT1JUQgojZGVmaW5lIEJVWlpFUl9QT1MJUEIxCgojZGVmaW5lIE9OCTEKI2RlZmluZSBPRkYgMAoKI2RlZmluZSBUWVBFX01JQ1JPCTEKI2RlZmluZSBUWVBFX0dSSUxMCTIKCnZvaWQgSW5pdCgpOwp2b2lkIFNldE1pY3JvKHVpbnQ4X3Qgc3RhdGUpOwp2b2lkIFNldEdyaWxsKHVpbnQ4X3Qgc3RhdGUpOwoKdm9pZCBTZXRUaW1lKCk7CnZvaWQgQ291bnREb3duKCk7Cgp2b2lkIFNldEJ1enplcih1aW50OF90KTsKdm9pZCBCZWVwKCk7Cgp2b2xhdGlsZSB1aW50OF90IG09MDsKdm9sYXRpbGUgdWludDhfdCBzPTA7CnZvbGF0aWxlIHVpbnQ4X3QgdGltZXJfcnVubmluZz0wOwoKdWludDhfdCB0eXBlPVRZUEVfTUlDUk87CgppbnQgbWFpbih2b2lkKQp7CglJbml0KCk7CgkKCXdoaWxlKDEpCgl7CgkJTENEQ2xlYXIoKTsKCQkKCQlMQ0RXcml0ZUZTdHJpbmdYWSgzLDAsUFNUUigiKiBQcmVzcyAqIikpOwoJCUxDRFdyaXRlRlN0cmluZ1hZKDEsMSxQU1RSKCJNaWNybyBvciBHcmlsbCIpKTsKCQkKCQl1aW50OF90IGs9R2V0S2V5cGFkQ21kKDEpOwoJCQoJCXN3aXRjaChrKQoJCXsKCQkJY2FzZSBLRVlfTUlDUk86CgkJCXsKCQkJCUJlZXAoKTsKCQkJCXR5cGU9VFlQRV9NSUNSTzsKCQkJCVNldFRpbWUoKTsKCQkJCXRpbWVyX3J1bm5pbmc9MTsKCQkJCQoJCQkJaWYodHlwZT09VFlQRV9NSUNSTykKCQkJCQlTZXRNaWNybyhPTik7CgkJCQllbHNlCgkJCQkJU2V0R3JpbGwoT04pOwoJCQkJCgkJCQlDb3VudERvd24oKTsKCQkJCQoJCQkJYnJlYWs7CgkJCX0KCQkJY2FzZSBLRVlfR1JJTEw6CgkJCXsKCQkJCUJlZXAoKTsKCQkJCXR5cGU9VFlQRV9HUklMTDsKCQkJCVNldFRpbWUoKTsKCQkJCXRpbWVyX3J1bm5pbmc9MTsKCQkJCQoJCQkJaWYodHlwZT09VFlQRV9NSUNSTykKCQkJCQlTZXRNaWNybyhPTik7CgkJCQllbHNlCgkJCQkJU2V0R3JpbGwoT04pOwoJCQkJCgkJCQlDb3VudERvd24oKTsKCQkJCWJyZWFrOwoJCQl9CgkJCWNhc2UgS0VZX1NUQVJUOgoJCQl7CgkJCQlCZWVwKCk7CgkJCQkvL1FVSUNLIFNUQVJUCgkJCQl0eXBlPVRZUEVfTUlDUk87CgkJCQlpZighdGltZXJfcnVubmluZykKCQkJCXsKCQkJCQlzPTMwOwoJCQkJCXRpbWVyX3J1bm5pbmc9MTsJCgkJCQkJU2V0TWljcm8oT04pOwoJCQkJCUNvdW50RG93bigpOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJCgkJCX0KCQl9CgkJCgl9Cn0Kdm9pZCBCZWVwKCkKewoJU2V0QnV6emVyKE9OKTsKCV9kZWxheV9tcygyNSk7CglTZXRCdXp6ZXIoT0ZGKTsKCV9kZWxheV9tcygyNSk7Cn0Kdm9pZCBJbml0KCkKewoJLy9TZXQgcmVsYXkgaW8gbGluZXMgYXMgb3V0IHB1dAoJTUlDUk9fRERSfD0oMTw8TUlDUk9fUE9TKTsJLy9NaWNyb3dhdmUgcmVsYXkKCUdSSUxMX0REUnw9KDE8PEdSSUxMX1BPUyk7CS8vR3JpbGwgcmVsYXkKCQoJLy9TZXQgQnV6emVyIGxpbmUgYXMgb3V0cHV0CglCVVpaRVJfRERSfD0oMTw8QlVaWkVSX1BPUyk7CgkKCS8vSW5pdGlhbGl6ZSBMQ0QgTW9kdWxlCglMQ0RJbml0KExTX05PTkUpOwoJCgkvL0luaXRpYWxsaXplIGtleXBhZCBsaWIKCUtleXBhZEluaXQoKTsKCQoJLy9Jbml0IFRJTUVSMSBmb3IgbWFpbiB0aW1lciBvcGVyYXRpb24KCVRDQ1IxQj0oMTw8V0dNMTIpfCgxPDxDUzEyKXwoMTw8Q1MxMCk7IC8vQ1RDIE1vZGUgcHJlc2NhbGxlciAxMDI0CglPQ1IxQT05NzY7CglUSU1TS3w9KDE8PE9DSUUxQSk7Cn0KSVNSKFRJTUVSMV9DT01QQV92ZWN0KQp7CglpZighdGltZXJfcnVubmluZykKCQlyZXR1cm47CgkKCWlmKHM9PTApCgl7CgkJaWYobT09MCkKCQl7CgkJCS8vb2ZmCgkJCXRpbWVyX3J1bm5pbmc9MDsKCQl9CgkJZWxzZQoJCXsKCQkJbS0tOwoJCQlzPTU5OwoJCX0KCX0KCWVsc2UKCXsKCQlzLS07Cgl9CgkKfQp2b2lkIFNldE1pY3JvKHVpbnQ4X3Qgc3RhdGUpCnsKCWlmKHN0YXRlPT1PTikKCXsKCQlNSUNST19QT1JUfD0oMTw8TUlDUk9fUE9TKTsKCX0KCWVsc2UKCXsKCQlNSUNST19QT1JUJj1+KDE8PE1JQ1JPX1BPUyk7Cgl9Cn0Kdm9pZCBTZXRCdXp6ZXIodWludDhfdCBzdGF0ZSkKewoJaWYoc3RhdGU9PU9OKQoJewoJCUJVWlpFUl9QT1JUfD0oMTw8QlVaWkVSX1BPUyk7Cgl9CgllbHNlCgl7CgkJQlVaWkVSX1BPUlQmPX4oMTw8QlVaWkVSX1BPUyk7Cgl9Cn0Kdm9pZCBTZXRHcmlsbCh1aW50OF90IHN0YXRlKQp7CglpZihzdGF0ZT09T04pCgl7CgkJR1JJTExfUE9SVHw9KDE8PEdSSUxMX1BPUyk7Cgl9CgllbHNlCgl7CgkJR1JJTExfUE9SVCY9figxPDxHUklMTF9QT1MpOwoJfQp9Cgp2b2lkIFNldFRpbWUoKQp7Cgl1aW50OF90IG1pbj0wOwoJdWludDhfdCBzZWM9MDsKCQoJTENEQ2xlYXIoKTsKCQoJd2hpbGUoMSkKCXsKCQlpZih0eXBlPT1UWVBFX01JQ1JPKQoJCXsKCQkJTENEV3JpdGVGU3RyaW5nWFkoMCwwLFBTVFIoIk1JQ1JPIikpOwoJCX0JCQkKCQllbHNlCgkJewoJCQlMQ0RXcml0ZUZTdHJpbmdYWSgwLDAsUFNUUigiR1JJTEwiKSk7CgkJfQkJCQoJCQkKCQlMQ0RXcml0ZUZTdHJpbmdYWSg2LDAsUFNUUigiTU06U1MgICAgICAiKSk7CgkJCgkJTENEV3JpdGVJbnRYWSg2LDEsbWluLDIpOwoJCUxDRFdyaXRlSW50WFkoOSwxLHNlYywyKTsKCQkKCQlMQ0RXcml0ZUZTdHJpbmdYWSg4LDEsUFNUUigiOiIpKTsKCQkKCQl1aW50OF90IGtleT1HZXRLZXlwYWRDbWQoMSk7CgkJCgkJc3dpdGNoKGtleSkKCQl7CgkJCWNhc2UgS0VZX1RTOgoJCQkJaWYobWluPDkwKQoJCQkJewoJCQkJCUJlZXAoKTsKCQkJCQlzZWMrPTEwOwoJCQkJCWlmKHNlYz09NjApCgkJCQkJewoJCQkJCQlzZWM9MDsKCQkJCQkJbWluKys7CgkJCQkJCQoJCQkJCQlpZihtaW49PTkxKQoJCQkJCQltaW49OTA7CgkJCQkJfQoJCQkJCQoJCQkJfQoJCQkJCgkJCQlicmVhazsKCQkJY2FzZSBLRVlfTToKCQkJewoJCQkJCgkJCQlpZihtaW48OTApCgkJCQl7CgkJCQkJbWluKys7CgkJCQkJQmVlcCgpOwoJCQkJfQkJCQkJCgkJCQlicmVhazsKCQkJfQoJCQkKCQkJY2FzZSBLRVlfVE06CgkJCXsKCQkJCWlmKG1pbjw5MCkKCQkJCXsKCQkJCQltaW4rPTEwOwoJCQkJCWlmKG1pbj49OTApCgkJCQkJewoJCQkJCQltaW49OTA7CgkJCQkJCXNlYz0wOwoJCQkJCX0JCgkJCQkJZWxzZQoJCQkJCQlCZWVwKCk7CgkJCQl9CgkJCQkKCQkJCWJyZWFrOwoJCQl9CgkJCQoJCQljYXNlIEtFWV9TVE9QOgoJCQkJQmVlcCgpOwoJCQkJbWluPTA7CgkJCQlzZWM9MDsKCQkJYnJlYWs7CgkJCQoJCQljYXNlIEtFWV9HUklMTDoKCQkJCUJlZXAoKTsKCQkJCXR5cGU9VFlQRV9HUklMTDsKCQkJCWJyZWFrOwoJCQkKCQkJY2FzZSBLRVlfTUlDUk86CgkJCQlCZWVwKCk7CgkJCQl0eXBlPVRZUEVfTUlDUk87CgkJCQlicmVhazsKCQkJCgkJCWNhc2UgS0VZX1NUQVJUOgoJCQl7CgkJCQlpZihtaW4+MCB8fCBzZWM+MCkKCQkJCXsKCQkJCQlCZWVwKCk7CgkJCQkJbT1taW47CgkJCQkJcz1zZWM7CgkJCQkJcmV0dXJuOwoJCQkJCQoJCQkJfQoJCQkJCgkJCX0JCQkJCgkJCQkKCQl9CgoJCQoJfQp9Cgp2b2lkIENvdW50RG93bigpCnsKCUxDRENsZWFyKCk7CgkKCXdoaWxlKDEpCgl7CgkJdWludDhfdCBrPUdldEtleXBhZENtZCgwKTsKCQkKCQlpZihrPT1LRVlfU1RPUCkKCQl7CgkJCS8vUGF1c2UKCQkJdGltZXJfcnVubmluZz0wOwoJCQkKCQkJU2V0TWljcm8oT0ZGKTsKCQkJU2V0R3JpbGwoT0ZGKTsKCQkJCgkJCUxDRFdyaXRlRlN0cmluZ1hZKDcsMCxQU1RSKCJQQVVTRUQhIikpOwoJCQlMQ0RXcml0ZUZTdHJpbmdYWSg2LDEsUFNUUigiUHJlc3MgU3RhcnQiKSk7CgkJCQoJCQlCZWVwKCk7CgkJCQoJCQl3aGlsZSgxKQoJCQl7CgkJCQlrPUdldEtleXBhZENtZCgxKTsKCQkJCQoJCQkJaWYoaz09S0VZX1NUQVJUKQoJCQkJewoJCQkJCUJlZXAoKTsKCQkJCQlicmVhazsJCgkJCQl9CQkJCQkKCQkJfQoJCQkKCQkJdGltZXJfcnVubmluZz0xOwoJCQkKCQkJaWYodHlwZT09VFlQRV9NSUNSTykKCQkJCVNldE1pY3JvKE9OKTsKCQkJZWxzZQoJCQkJU2V0R3JpbGwoT04pOwoJCQkJCgkJCUxDRENsZWFyKCk7CgkJCgkJfQoJCWVsc2UgaWYoaz09S0VZX1NUQVJUKQoJCXsKCQkJCWlmKG08PTg5KQoJCQkJewoJCQkJCWlmKHM8MzApCgkJCQkJewoJCQkJCQlzKz0zMDsKCQkJCQkJaWYocz49NjApCgkJCQkJCXsKCQkJCQkJCW0rKzsKCQkJCQkJCXM9cy02MDsKCQkJCQkJCQoJCQkJCQl9CgkJCQkJCUJlZXAoKTsKCQkJCQkJCgkJCQkJfQkKCQkJCQkKCQkJCX0KCQl9CgkJCgkJaWYobT09MCAmJiBzPT0wKQoJCXsKCQkJTENEQ2xlYXIoKTsKCQkJTENEV3JpdGVGU3RyaW5nWFkoMCw1LFBTVFIoIlJlYWR5ICEiKSk7CgkJCQoJCQkKCQkJCgkJCVNldE1pY3JvKE9GRik7CgkJCVNldEdyaWxsKE9GRik7CgkJCQoJCQkvL0FsZXJ0CgkJCWZvcih1aW50OF90IGk9MDtpPDQ7aSsrKQoJCQl7CgkJCQlTZXRCdXp6ZXIoT04pOwoJCQkJX2RlbGF5X21zKDUwMCk7CgkJCQlTZXRCdXp6ZXIoT0ZGKTsKCQkJCV9kZWxheV9tcyg1MDApOwoJCQl9CgkJCQoJCQlHZXRLZXlwYWRDbWQoMSk7CgkJCQoJCQlCZWVwKCk7CgkJCQoJCQlyZXR1cm47CgkJfQoJCUxDRFdyaXRlSW50WFkoMCwxLG0sMik7CgkJaWYocyUyKQoJCXsKCQkJTENEV3JpdGVTdHJpbmdYWSgyLDEsIjoiKTsKCQl9CgkJZWxzZQoJCXsKCQkJTENEV3JpdGVTdHJpbmdYWSgyLDEsIiAiKTsKCQl9CgkJCgkJTENEV3JpdGVJbnRYWSgzLDEscywyKTsKCQkKCQlpZih0eXBlPT1UWVBFX01JQ1JPKQoJCXsKCQkJTENEV3JpdGVGU3RyaW5nWFkoMCwwLFBTVFIoIk1JQ1JPIikpOwoJCX0KCQllbHNlCgkJewoJCQlMQ0RXcml0ZUZTdHJpbmdYWSgwLDAsUFNUUigiR1JJTEwiKSk7CgkJfQoJfQoJCn0=
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "lib/lcd/lcd_hd44780_avr.h"
#include "lib/keypad/keypad.h"
#define MICRO_DDR DDRD
#define MICRO_PORT PORTD
#define MICRO_POS PD0
#define GRILL_DDR DDRD
#define GRILL_PORT PORTD
#define GRILL_POS PD1
#define BUZZER_DDR DDRB
#define BUZZER_PORT PORTB
#define BUZZER_POS PB1
#define ON 1
#define OFF 0
#define TYPE_MICRO 1
#define TYPE_GRILL 2
void Init();
void SetMicro(uint8_t state);
void SetGrill(uint8_t state);
void SetTime();
void CountDown();
void SetBuzzer(uint8_t);
void Beep();
volatile uint8_t m=0;
volatile uint8_t s=0;
volatile uint8_t timer_running=0;
uint8_t type=TYPE_MICRO;
int main(void)
{
Init();
while(1)
{
LCDClear();
LCDWriteFStringXY(3,0,PSTR("* Press *"));
LCDWriteFStringXY(1,1,PSTR("Micro or Grill"));
uint8_t k=GetKeypadCmd(1);
switch(k)
{
case KEY_MICRO:
{
Beep();
type=TYPE_MICRO;
SetTime();
timer_running=1;
if(type==TYPE_MICRO)
SetMicro(ON);
else
SetGrill(ON);
CountDown();
break;
}
case KEY_GRILL:
{
Beep();
type=TYPE_GRILL;
SetTime();
timer_running=1;
if(type==TYPE_MICRO)
SetMicro(ON);
else
SetGrill(ON);
CountDown();
break;
}
case KEY_START:
{
Beep();
//QUICK START
type=TYPE_MICRO;
if(!timer_running)
{
s=30;
timer_running=1;
SetMicro(ON);
CountDown();
break;
}
}
}
}
}
void Beep()
{
SetBuzzer(ON);
_delay_ms(25);
SetBuzzer(OFF);
_delay_ms(25);
}
void Init()
{
//Set relay io lines as out put
MICRO_DDR|=(1<<MICRO_POS); //Microwave relay
GRILL_DDR|=(1<<GRILL_POS); //Grill relay
//Set Buzzer line as output
BUZZER_DDR|=(1<<BUZZER_POS);
//Initialize LCD Module
LCDInit(LS_NONE);
//Initiallize keypad lib
KeypadInit();
//Init TIMER1 for main timer operation
TCCR1B=(1<<WGM12)|(1<<CS12)|(1<<CS10); //CTC Mode prescaller 1024
OCR1A=976;
TIMSK|=(1<<OCIE1A);
}
ISR(TIMER1_COMPA_vect)
{
if(!timer_running)
return;
if(s==0)
{
if(m==0)
{
//off
timer_running=0;
}
else
{
m--;
s=59;
}
}
else
{
s--;
}
}
void SetMicro(uint8_t state)
{
if(state==ON)
{
MICRO_PORT|=(1<<MICRO_POS);
}
else
{
MICRO_PORT&=~(1<<MICRO_POS);
}
}
void SetBuzzer(uint8_t state)
{
if(state==ON)
{
BUZZER_PORT|=(1<<BUZZER_POS);
}
else
{
BUZZER_PORT&=~(1<<BUZZER_POS);
}
}
void SetGrill(uint8_t state)
{
if(state==ON)
{
GRILL_PORT|=(1<<GRILL_POS);
}
else
{
GRILL_PORT&=~(1<<GRILL_POS);
}
}
void SetTime()
{
uint8_t min=0;
uint8_t sec=0;
LCDClear();
while(1)
{
if(type==TYPE_MICRO)
{
LCDWriteFStringXY(0,0,PSTR("MICRO"));
}
else
{
LCDWriteFStringXY(0,0,PSTR("GRILL"));
}
LCDWriteFStringXY(6,0,PSTR("MM:SS "));
LCDWriteIntXY(6,1,min,2);
LCDWriteIntXY(9,1,sec,2);
LCDWriteFStringXY(8,1,PSTR(":"));
uint8_t key=GetKeypadCmd(1);
switch(key)
{
case KEY_TS:
if(min<90)
{
Beep();
sec+=10;
if(sec==60)
{
sec=0;
min++;
if(min==91)
min=90;
}
}
break;
case KEY_M:
{
if(min<90)
{
min++;
Beep();
}
break;
}
case KEY_TM:
{
if(min<90)
{
min+=10;
if(min>=90)
{
min=90;
sec=0;
}
else
Beep();
}
break;
}
case KEY_STOP:
Beep();
min=0;
sec=0;
break;
case KEY_GRILL:
Beep();
type=TYPE_GRILL;
break;
case KEY_MICRO:
Beep();
type=TYPE_MICRO;
break;
case KEY_START:
{
if(min>0 || sec>0)
{
Beep();
m=min;
s=sec;
return;
}
}
}
}
}
void CountDown()
{
LCDClear();
while(1)
{
uint8_t k=GetKeypadCmd(0);
if(k==KEY_STOP)
{
//Pause
timer_running=0;
SetMicro(OFF);
SetGrill(OFF);
LCDWriteFStringXY(7,0,PSTR("PAUSED!"));
LCDWriteFStringXY(6,1,PSTR("Press Start"));
Beep();
while(1)
{
k=GetKeypadCmd(1);
if(k==KEY_START)
{
Beep();
break;
}
}
timer_running=1;
if(type==TYPE_MICRO)
SetMicro(ON);
else
SetGrill(ON);
LCDClear();
}
else if(k==KEY_START)
{
if(m<=89)
{
if(s<30)
{
s+=30;
if(s>=60)
{
m++;
s=s-60;
}
Beep();
}
}
}
if(m==0 && s==0)
{
LCDClear();
LCDWriteFStringXY(0,5,PSTR("Ready !"));
SetMicro(OFF);
SetGrill(OFF);
//Alert
for(uint8_t i=0;i<4;i++)
{
SetBuzzer(ON);
_delay_ms(500);
SetBuzzer(OFF);
_delay_ms(500);
}
GetKeypadCmd(1);
Beep();
return;
}
LCDWriteIntXY(0,1,m,2);
if(s%2)
{
LCDWriteStringXY(2,1,":");
}
else
{
LCDWriteStringXY(2,1," ");
}
LCDWriteIntXY(3,1,s,2);
if(type==TYPE_MICRO)
{
LCDWriteFStringXY(0,0,PSTR("MICRO"));
}
else
{
LCDWriteFStringXY(0,0,PSTR("GRILL"));
}
}
}