📄 clock_alarm.c
字号:
// in the name of GOD
// project name: Clock & Alarm
// LCD disply & Relay output
// Design by: Atropat (Nader.Munesi@Gmail.com)
#include <mega8.h>
#include <stdio.h>
#include <delay.h>
char sec,min,hour;
char display[20];
char ass,amm,ahh;
char rss1,rss2,rss3;
char da1,da2,da3;
char da12,da22,da32;
char da13,da23,da33;
void setclock();
void setalarm();
#define relay_output PORTB.0
#define clock_set PINC.0
#define alarm_set PINC.1
#define up PINC.2
#define down PINC.3
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
sec=sec+1;
if(sec==60)
{
sec=0;
min=min+1;
}
if(min==60)
{
min=0;
hour=hour+1;
}
if(hour==24)
{
hour=0;
}
}
void main(void)
{
PORTB=0x00;
DDRB=0x01;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 2 initialization
// Clock source: TOSC1 pin
// Clock value: PCK2/128
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x08;
TCCR2=0x05;
TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
lcd_gotoxy(0,0);
sprintf(display,"Clock %02u:%02u:%02u",hour,min,sec);
lcd_puts(display);
if(clock_set==1)
{
delay_ms(20);
if(clock_set==1) setclock();
}
lcd_gotoxy(0,1);
sprintf(display,"Alarm %02u:%02u",ahh,amm);
lcd_puts(display);
if(alarm_set==1)
{
delay_ms(20);
if(alarm_set==1) setalarm();
}
if(hour==ahh)
{
if(min==amm)
{
if(sec==ass)
{
relay_output=1;
lcd_gotoxy(12,1);
sprintf(display,")");
lcd_puts(display);
rss1=sec+10;
da1=sec+1;
da2=sec+2;
da3=sec+3;
}
if(sec==da1)
{
lcd_gotoxy(13,1);
sprintf(display,")");
lcd_puts(display);
}
if(sec==da2)
{
lcd_gotoxy(14,1);
sprintf(display,")");
lcd_puts(display);
}
if(sec==da3)
{
lcd_gotoxy(15,1);
sprintf(display,")");
lcd_puts(display);
}
if(sec==rss1)
{
relay_output=0;
rss2=sec+30;
lcd_gotoxy(12,1);
sprintf(display," ");
lcd_puts(display);
}
if(sec==rss2) //*************
{
relay_output=1;
lcd_gotoxy(12,1);
sprintf(display,")");
lcd_puts(display);
rss3=sec;
rss3=rss3+10;
da12=sec+1;
da22=sec+2;
da32=sec+3;
}
if(sec==da12)
{
lcd_gotoxy(13,1);
sprintf(display,")");
lcd_puts(display);
}
if(sec==da22)
{
lcd_gotoxy(14,1);
sprintf(display,")");
lcd_puts(display);
}
if(sec==da32)
{
lcd_gotoxy(15,1);
sprintf(display,")");
lcd_puts(display);
}
if(sec==rss3)
{
relay_output=0;
lcd_gotoxy(12,1);
sprintf(display," ");
lcd_puts(display);
}
}// for min check
if(min==amm+1)
{
if(sec==20)
{
relay_output=1;
lcd_gotoxy(12,1);
sprintf(display,")");
lcd_puts(display);
da13=sec+1;
da23=sec+2;
da33=sec+3;
}
if(sec>20)
{
if(sec==da13)
{
lcd_gotoxy(13,1);
sprintf(display,")");
lcd_puts(display);
}
if(sec==da23)
{
lcd_gotoxy(14,1);
sprintf(display,")");
lcd_puts(display);
}
if(sec==da33)
{
lcd_gotoxy(15,1);
sprintf(display,")");
lcd_puts(display);
}
}
if(sec==30)
{
relay_output=0;
lcd_gotoxy(12,1);
sprintf(display," ");
lcd_puts(display);
}
}
} // for hour check
}; // for while(1)
} // for main
// end of main program
// ******************** clock setting ***************
void setclock()
{
delay_ms(200);
lcd_gotoxy(0,0);
sprintf(display,"Clock --:mm:ss");
lcd_puts(display);
while(PINC.0==0)
{
if(PINC.2==1)
{
delay_ms(20);
if(PINC.2==1)
{
hour=hour+1;
if(hour==24) hour=0;
lcd_gotoxy(0,0);
sprintf(display,"Clock %02u:mm:ss",hour,min,sec);
lcd_puts(display);
delay_ms(200);
}
}
if(PINC.3==1)
{
delay_ms(20);
if(PINC.3==1)
{
hour=hour-1;
if(hour==255) hour=23;
lcd_gotoxy(0,0);
sprintf(display,"Clock %02u:mm:ss",hour,min,sec);
lcd_puts(display);
delay_ms(200);
}
}
}
delay_ms(500);
lcd_gotoxy(0,0);
sprintf(display,"Clock %02u:--:ss",hour);
lcd_puts(display);
while(PINC.0==0)
{
if(PINC.2==1)
{
delay_ms(20);
if(PINC.2==1)
{
min=min+1;
if(min==60) min=0;
lcd_gotoxy(0,0);
sprintf(display,"Clock %02u:%02u:ss",hour,min,sec);
lcd_puts(display);
delay_ms(200);
}
}
if(PINC.3==1)
{
delay_ms(20);
if(PINC.3==1)
{
min=min-1;
if(min==255) min=59;
lcd_gotoxy(0,0);
sprintf(display,"Clock %02u:%02u:ss",hour,min,sec);
lcd_puts(display);
delay_ms(200);
}
}
}
delay_ms(500);
sec=0;
}
// ****************** Alarm setting *************
void setalarm()
{
delay_ms(200);
lcd_gotoxy(0,1);
sprintf(display,"Alarm --:mm");
lcd_puts(display);
while(alarm_set==0)// set hour of Alarm
{
if(up==1)
{
delay_ms(20);
if(up==1)
{
ahh=ahh+1;
if(ahh==24) ahh=0;
lcd_gotoxy(0,1);
sprintf(display,"Alarm %02u:mm",ahh,amm);
lcd_puts(display);
delay_ms(200);
}
}
if(down==1)
{
delay_ms(20);
if(down==1)
{
ahh=ahh-1;
if(ahh==255) ahh=23;
lcd_gotoxy(0,1);
sprintf(display,"Alarm %02u:mm",ahh,amm);
lcd_puts(display);
delay_ms(200);
}
}
}
delay_ms(500);
lcd_gotoxy(0,1);
sprintf(display,"Alarm %02u:--",ahh);
lcd_puts(display);
while(alarm_set==0)// set min of Alarm
{
if(up==1)
{
delay_ms(20);
if(up==1)
{
amm=amm+1;
if(amm==60) amm=0;
lcd_gotoxy(0,1);
sprintf(display,"Alarm %02u:%02u",ahh,amm);
lcd_puts(display);
delay_ms(200);
}
}
if(down==1)
{
delay_ms(20);
if(down==1)
{
amm=amm-1;
if(amm==255) amm=59;
lcd_gotoxy(0,1);
sprintf(display,"Alarm %02u:%02u",ahh,amm);
lcd_puts(display);
delay_ms(200);
}
}
}
delay_ms(500);
ass=0;
}
// END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -