Sie sind auf Seite 1von 60

/****************************************************/

Project : bai tap lon


Version : v1
Date : 3/14/2012
Author : hung-nguyen van
Company : edabk
Comments:
bai tap lon mon vi xi ly

Chip type

: ATmega16

Program type

: Application

Clock frequency

: 8.000000 MHz

Memory model

: Small

External RAM size : 0


Data Stack size

: 256

*****************************************************/

#include <mega16.h>
#include <delay.h>
#asm
.equ __i2c_port=0x15 ;PORTC
.equ __sda_bit=1
.equ __scl_bit=0
#endasm

#include <i2c.h>

// DS1307 Real Time Clock functions


#include <ds1307.h>

#ifndef cbi
#define cbi(port, bit)

(port) &= ~(1 << (bit))

#endif
#ifndef sbi
#define sbi(port, bit)

(port) |= (1 << (bit))

#endif

// Alphanumeric LCD Module functions


#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>

/*---dinh nghia cac port va pin----*/


#define BAO_DONG_PORT
#define BAO_DONG_PIN

PORTD
5

/*---dinh nghia cac marco---*/

#define LEVEL0

0x0F41 //-1

#define LEVEL1

0x0A2C

#define LEVEL2

0x0516

#define LEVEL3

0x0001 //+1

/*---marco cho led---*/


#define LED_DDR

DDRC

#define LED_PORT

PORTC

#define LED_SET_PORT

0xF0

#define LED1_PIN

#define LED2_PIN

#define LED3_PIN

#define LED4_PIN

#define LED_PORT_7

PORTA

/*----external interrupt---*/
#define INT1

#define INT0

#define TOIE2

#define OCIE2

#define TOIE0

#define OCIE0

/*-------ADC Bits-------*/
#define REFS0

#define AVCC_MODE

(1<<REFS0)

#define ADC_VFF_TYPE

AVCC_MODE

#define ADEN

#define ADSC

#define ADIE

#define ADPS2

#define ADPS1

#define ADPS0

#define _24H_MODE

0x40

#define AM_PM

0x20

#define DO
#define C

0
1

//*********************dinh nghia kieu du lieu***************************************

/*Dinh nghia kieu du lieu----*/


typedef unsigned char uint8_t ;
typedef char int8_t;
typedef unsigned int uint16_t;

typedef enum
{
TEM_LEVEL1=35, // nho hon 35 oC

TEM_LEVEL2=50, //nho hon 50 oC


TEM_LEVEL3=60, //nho hon 60 oC
TEM_LEVEL4=70 //nho hon 70 oC
} TEM_LEVEL;

typedef enum
{
OFF,
ON,
CURRENT_ON
}ON_OFF_ENUM;

typedef enum
{
Change_All,
Change_Second,
Change_Min,
Change_Hour,
Change_Date,
Change_Month,
Change_Year
} CHANGE_ENUM;

///*Dinh nghia bien toan cuc----*/

//TIME_STRUCT time_info;

uint8_t status;//bien trang thai cua he thong

CHANGE_ENUM change;
ON_OFF_ENUM alarm,on,off;

uint16_t temp_level_curent;

uint16_t on_level;
int8_t second;//giay
int8_t min;//phut
int8_t hour;//gio
//int8_t hour;//gio
// int8_t day;
int8_t date;//ngay
int8_t month;//thang
int8_t year;//nam
int8_t alarm_min;
int8_t on_min;//phut
int8_t off_min;//phut
int8_t alarm_hour;
int8_t on_hour;//phut
int8_t off_hour;//phut
uint8_t temp;//nhiet do

uint8_t chr[10]={0x80,0xF2,0x48,0x60,0x32,0x24,0x04,0xF0,0x00,0x20};//font thoi gian


uint8_t font_temp[2]={0x38,0x8C};
static uint8_t val1,val2=3,val3;//bient toan cuc su dung trong cac ham con (val2 dung cho cac ham
switch)
static uint8_t lcd_switch;
static uint8_t status_alarm ;
static uint8_t scan;

/*------dinh nghia 1 so xau co ban----*/


int8_t set_time[]="menu:set time";
int8_t set_alarm[]="menu:alarm clock";
int8_t set_off[]="menu:turn off";
int8_t set_on[]="menu:turn on";
int8_t space[]=" ";

/*---giao thuc ham co ban---*/


void Set_Timer();
void Lcd_Display(CHANGE_ENUM chang);
void Lcd_Display_Set1(void);
void Lcd_Display_Set2(void);
void Led_Scan_Time(void);//quet led thoi gian
void Led_Scan_Temp(void);//quet led nhiet do
void Led_Scan_Date(void);//quet ngay
uint16_t Fan_Adjust(uint8_t tem);//dieu chinh toc do quat
void Time_Update(void);\

void Lcd_TurnOn(void);
void Delay_500ms(void);

/*----ham lien quan toi tinh toan nhet do----*/


uint8_t Compute_Temp(uint16_t temperature);//tinh ga tri nhiet do tu thanh ghi ADCW

/*ham khoi tao e thong*/


void Timer0_Init();//khoi tao timer 0;
void Timer1_Init(unsigned int level);//khoi tao timer 1 voi muc do quat gio
void Timer2_Init();//khoi tao Timer 2
void Int_Init();//khoi tao ngat ngoai
void Adc_Init(void);//khoi tao ADC

// External Interrupt 0 service routine


interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
if(alarm==CURRENT_ON){ PORTD.5=0;alarm=OFF;}
else
status=8;
}

// Timer 0 output compare interrupt service routine


interrupt [TIM0_OVF] void timer0_ovf_isr(void)

{
// Place your code here
++val1;
if(alarm==CURRENT_ON)
{
if((++status_alarm)&1)
if(!(val1%19)) PORTD.5^=1;
if(second==45)
{
alarm=OFF;
PORTD.5=0;
}
}
if(val1==100)
{
val1=0;
if(status!=8) status=2;
PORTD.3^=1;
if(++lcd_switch>20) PORTD.6=0;
}
Led_Scan_Time();
TCNT0=0xD9;
}

interrupt [TIM0_COMP] void timer0_comp_isr(void)

{
// Place your code here
++val1;
if(alarm==CURRENT_ON)
{
if((++status_alarm)&1)
if(!(val1%19)) PORTD.5^=1;
}
if(val1==200)
{
val1=0;
PORTD.3^=1;
if(status!=8) status=2;
if(++lcd_switch>20) PORTD.6=0;
}
if((scan)&1)
Led_Scan_Temp();
else
Led_Scan_Date();
TCNT0=0xD9;
}

// Timer 2 overflow interrupt service routine


interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{

val3++;
if(!(val3%15))
{
if(val3==15)
{
Lcd_Display_Set1();
}
else {Lcd_Display_Set2(); }
if(val3==30) val3=0;
}
TCNT2=0x00;
}

// Timer 2 output compare interrupt service routine


/*interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
// Place your code here

} */

// ADC interrupt service routine


interrupt [ADC_INT] void adc_isr(void)
{
uint16_t adc_data;

uint16_t level;
adc_data=ADCW;
temp=Compute_Temp(adc_data);
level=Fan_Adjust(temp);
if(level!=temp_level_curent)
{
temp_level_curent=level;
Timer1_Init(temp_level_curent);
}
}

// Declare your global variables here

void main(void)
{
/*----doan du lieu----*/
uint8_t val;
// Port A initialization
PORTA=0xFE;
DDRA=0xFE;

// Port B initialization
PORTB=0x00;
DDRB=0xFF;

// Port C initialization
PORTC=0xFF;
DDRC=0xFC;

// Port D initialization
PORTD=0xDF;
DDRD=0x78;
lcd_init(16);
Timer0_Init();
//cai dat timer1
temp_level_curent=LEVEL1;
Timer1_Init(temp_level_curent);
Timer2_Init();
//khoi tao I2C
i2c_init();
//khoi tao rtc
//rtc_init(0,1,0);//xung ra 1Hz
Int_Init();
Adc_Init();
val=rtc_read(0);
val&=0x7F;
rtc_write(0,val);
change=Change_All;
// LCD module initialization
#asm("sei")

while (1)
{
switch(status)
{
case 8: {Set_Timer(); status=0;} break;
case 2:{
Time_Update();status=0;
}

}
}
}

/*---timer0 init---*/
void Timer0_Init(void)
{
TCNT0=0xD9;
TCCR0=0x05;//prescaler=1024
OCR0=0xFF;
TIMSK|=(1<<TOIE0);
}

/*---timer1 init----*/
void Timer1_Init(unsigned int level)
{

TCCR1A=0x32;
TCCR1B=0x1D;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x0F;
ICR1L=0x42;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=(uint8_t)(level>>8);
OCR1BL=(uint8_t)level;
}

/*----Timer2 Init---*/
void Timer2_Init(void)
{
ASSR=0x00;
TCCR2=0x07;
TCNT2=0x00;
OCR2=0x00;
// TIMSK|=(1<<TOIE2);//|(1<<OCIE2);
}

/*---khoi tao ngat ngoi----*/


void Int_Init(void)

{
//falling edge
GICR|=(1<<INT0);;//enable interrupt flag
MCUCR=0x0A; //xay ra ngat khi co canh xuong tren chan INT1,INT0
MCUCSR=0x00;
GIFR=0x00;//co ngat
}

/*---------------------Descrepton-------------------------------functoin name: Adc_Init


input: none
function:configuration ADC mode
+ signal channel ADC0
+ prescale: 256
+ trigger:none
+ interrupt :enable
+ reference Voltage :AVCC with external Capacitor at AVFF pin
+ Auto Trigger: Disable
-----------------------------------------------------------------*/

void Adc_Init(void)
{
ADMUX=ADC_VFF_TYPE&0xff;
ADCSRA|=(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}

uint16_t Fan_Adjust(uint8_t tem)


{
if(tem>TEM_LEVEL4)
{
//bao dong tai day
sbi(BAO_DONG_PORT,BAO_DONG_PIN);
return LEVEL3;
}
else
{
cbi(BAO_DONG_PORT,BAO_DONG_PIN);
if(tem>TEM_LEVEL3)
{
return LEVEL3;
}
else
if(tem>TEM_LEVEL2)
{
return LEVEL2;
}
else
if(tem>TEM_LEVEL1)
{
return LEVEL1;

}
else
{
return LEVEL0;
}
}
}

void Led_Scan_Temp(void)
{
static char index1;
uint8_t chuc,don_vi;

//dua tat ca ve 0
sbi(LED_PORT,LED1_PIN);
sbi(LED_PORT,LED2_PIN);
sbi(LED_PORT,LED3_PIN);
sbi(LED_PORT,LED4_PIN);
switch(index1++)
{

case 0:{
chuc=temp/10;
LED_PORT_7=chr[chuc];
cbi(LED_PORT,LED1_PIN);

}break;
case 1:{

/*---hien thi gio hang don vi----*/


don_vi=temp%10;
LED_PORT_7=chr[don_vi];
cbi(LED_PORT,LED2_PIN);
}break;

case 2:{
/*---hien thi phut-hang chuc----*/
LED_PORT_7=font_temp[0];
cbi(LED_PORT,LED3_PIN);
} break;

case 3:{
/*---hien thi phut hang don vi---*/
LED_PORT_7=font_temp[1];
cbi(LED_PORT,LED4_PIN);
index1=0;
}

}
}

void Led_Scan_Time(void)
{
static char index;
uint8_t chuc,don_vi;

//dua tat ca ve 0
sbi(LED_PORT,LED1_PIN);
sbi(LED_PORT,LED2_PIN);
sbi(LED_PORT,LED3_PIN);
sbi(LED_PORT,LED4_PIN);
switch(index++)
{

case 0:{
chuc=hour/10;
LED_PORT_7=chr[chuc];
cbi(LED_PORT,LED1_PIN);

}break;
case 1:{

/*---hien thi gio hang don vi----*/


don_vi=hour%10;
LED_PORT_7=chr[don_vi];

cbi(LED_PORT,LED2_PIN);
}break;

case 2:{
/*---hien thi phut-hang chuc----*/
chuc=min/10;
LED_PORT_7=chr[chuc];
cbi(LED_PORT,LED3_PIN);
} break;

case 3:{
/*---hien thi phut hang don vi---*/
don_vi=min%10;
LED_PORT_7=chr[don_vi];
cbi(LED_PORT,LED4_PIN);
index=0;
}

}
}
void Led_Scan_Date(void)
{
static char index3;
uint8_t chuc,don_vi;

//dua tat ca ve 0
sbi(LED_PORT,LED1_PIN);
sbi(LED_PORT,LED2_PIN);
sbi(LED_PORT,LED3_PIN);
sbi(LED_PORT,LED4_PIN);
switch(index3++)
{

case 0:{
chuc=date/10;
LED_PORT_7=chr[chuc];
cbi(LED_PORT,LED1_PIN);

}break;
case 1:{

/*---hien thi gio hang don vi----*/


don_vi=date%10;
LED_PORT_7=chr[don_vi];
cbi(LED_PORT,LED2_PIN);
}break;

case 2:{
/*---hien thi phut-hang chuc----*/
chuc=month/10;

LED_PORT_7=chr[chuc];
cbi(LED_PORT,LED3_PIN);
} break;

case 3:{
/*---hien thi phut hang don vi---*/
don_vi=month%10;
LED_PORT_7=chr[don_vi];
cbi(LED_PORT,LED4_PIN);
index3=0;
}

}
}

void Lcd_Display(CHANGE_ENUM chang)


{
//x=0..39, y=0...3;
int8_t time;
switch(chang)
{
case Change_All:
{
lcd_clear();
lcd_gotoxy(2,0);//lcd_putint8_t('a');

time=hour;//r&0x1F;
delay_ms(1);
lcd_putchar(time/10+'0');
delay_ms(1);
lcd_putchar(time%10+'0');
delay_ms(1);
lcd_putchar(':');
delay_ms(1);
time=(min)&0x7F;
lcd_putchar(time/10+'0');
delay_ms(1);
lcd_putchar(time%10+'0');
delay_ms(1);
lcd_putchar(':');
delay_ms(1);
lcd_putchar(second/10+'0');
delay_ms(1);
lcd_putchar(second%10+'0'); delay_ms(1);
//hien thi ngay thang

lcd_gotoxy(3,1);
lcd_putchar(date/10+'0'); delay_ms(1);
lcd_putchar((date%10)+'0'); delay_ms(1);
lcd_putchar('/');
lcd_putchar(month/10+'0');delay_ms(1);

lcd_putchar(month%10+'0'); delay_ms(1);
lcd_putchar('/');delay_ms(1);
lcd_putchar(0x32);
lcd_putchar(0x30);
lcd_putchar(year/10+'0');delay_ms(1);
lcd_putchar(year%10+'0'); delay_ms(1);
} break;

case Change_Year:
{
lcd_gotoxy(12,1); delay_ms(1);
lcd_putchar(year/10+'0');delay_ms(1);
lcd_putchar(year%10+'0'); delay_ms(1);
}
case Change_Month:
{
lcd_gotoxy(7,1); delay_ms(1);
lcd_putchar(month/10+'0');delay_ms(1);
lcd_putchar(month%10+'0'); delay_ms(1);
}
case Change_Date:
{
lcd_gotoxy(3,1); delay_ms(1);
lcd_putchar(date/10+'0'); delay_ms(1);
lcd_putchar((date%10)+'0'); delay_ms(1);

}
case Change_Hour:
{
lcd_gotoxy(2,0);delay_ms(1);
lcd_putchar(hour/10+'0'); delay_ms(1);
lcd_putchar(hour%10+'0');delay_ms(1);
}
case Change_Min:
{
lcd_gotoxy(5,0); delay_ms(1);
lcd_putchar(min/10+'0');delay_ms(1);
lcd_putchar(min%10+'0');delay_ms(1);
}
case Change_Second:
{
lcd_gotoxy(8,0);delay_ms(1);
lcd_putchar(second/10+'0');delay_ms(1);
lcd_putchar(second%10+'0');
lcd_putchar(' ');
lcd_putchar(temp/10+'0');
lcd_putchar(temp%10+'0');
lcd_putsf("oC");

lcd_gotoxy(0,1);
if(alarm==ON) lcd_putchar('A');

else lcd_putchar(' ');

lcd_gotoxy(14,1);
if(on==ON) lcd_putchar('O');
else lcd_putchar(' ');

if(off==ON) lcd_putchar('F');
else lcd_putchar(' ');
}

void Lcd_Display_Set1(void)
{
switch(val2)
{
case 1:

case 2:

case 3:
{
lcd_clear();

lcd_gotoxy(2,0);
lcd_puts(set_time);
lcd_gotoxy(4,1);//lcd_putchar('a');
lcd_putchar(hour/10+'0');
lcd_putchar(hour%10+'0');
lcd_putchar(':');
lcd_putchar(min/10+'0');
lcd_putchar(min%10+'0');
lcd_putchar(':');
lcd_putchar(second/10+'0');
lcd_putchar(second%10+'0');
}
break;
case 4:

case 5:

case 6:
{
lcd_clear();
lcd_gotoxy(2,0);
lcd_puts(set_time);
lcd_gotoxy(2,1);
lcd_putchar(date/10+'0');
lcd_putchar(date%10+'0');

lcd_putchar('/');
lcd_putchar(month/10+'0');
lcd_putchar(month%10+'0');
lcd_putchar('/');
lcd_putchar(0x32);
lcd_putchar(0x30);
lcd_putchar(year/10+'0');
lcd_putchar(year%10+'0');
}
break;
case 7:
{
lcd_clear();
//lcd_gotoxy(2,0);
lcd_puts(set_alarm);
lcd_gotoxy(6,1);
if(alarm==ON) lcd_putsf("ON");
else if(alarm==OFF) lcd_putsf("OFF");
} break;
case 8:

case 9:
{

lcd_clear();

//lcd_gotoxy(2,0);
lcd_puts(set_alarm);
lcd_gotoxy(6,1);
lcd_putchar(alarm_hour/10+'0');
lcd_putchar(alarm_hour%10+'0');
lcd_putchar(':');
lcd_putchar(alarm_min/10+'0');
lcd_putchar(alarm_min%10+'0');

}
break;

case 10:
{
lcd_clear();
lcd_gotoxy(2,0);
lcd_puts(set_on);
lcd_gotoxy(6,1);
if(on==ON) lcd_putsf("ON");
else if(on==OFF) lcd_putsf("OFF");
} break;
case 11:

case 12:
{

lcd_clear();
lcd_gotoxy(2,0);
lcd_puts(set_on);
lcd_gotoxy(6,1);
lcd_putchar(on_hour/10+'0');
lcd_putchar(on_hour%10+'0');
lcd_putchar(':');
lcd_putchar(on_min/10+'0');
lcd_putchar(on_min%10+'0');

}
break;
case 13:
{
lcd_clear();
lcd_gotoxy(2,0);
lcd_puts(set_on);
lcd_gotoxy(4,1);
lcd_putsf("LEVEL:");
lcd_putchar(on_level+'0');
}break;

case 14:
{

lcd_clear();
lcd_gotoxy(2,0);
lcd_puts(set_off);
lcd_gotoxy(6,1);
if(off==ON) lcd_putsf("ON");
else if(off==OFF) lcd_putsf("OFF");
} break;
case 15:
case 16:
{

lcd_clear();
lcd_gotoxy(2,0);
lcd_puts(set_off);
lcd_gotoxy(6,1);
lcd_putchar(off_hour/10+'0');
lcd_putchar(off_hour%10+'0');
lcd_putchar(':');
lcd_putchar(off_min/10+'0');
lcd_putchar(off_min%10+'0');

}
}

void Lcd_Display_Set2(void)
{
switch(val2)
{
case 1:
{
lcd_gotoxy(4,1);
lcd_puts(space);
}
break;
case 2:
{
lcd_gotoxy(7,1);
lcd_puts(space);
}
break;
case 3:
{
lcd_gotoxy(10,1);
lcd_puts(space);
}
break;
case 4:
{

lcd_gotoxy(2,1);
lcd_puts(space);
}
break;
case 5:
{
lcd_gotoxy(5,1);
lcd_puts(space);//tao khoang trang
}
break;
case 6:
{
lcd_gotoxy(10,1);
lcd_puts(space);
}
break;
case 7:
{
lcd_gotoxy(6,1);
lcd_puts(space);
lcd_puts(space);
}
break;
case 8:
{

lcd_gotoxy(6,1);
lcd_puts(space);
}
break;
case 9:
{
lcd_gotoxy(9,1);
lcd_puts(space);
}
break;
case 10:
{
lcd_gotoxy(6,1);
lcd_puts(space);
lcd_puts(space);
}
break;
case 11:
{
lcd_gotoxy(6,1);
lcd_puts(space);
}
break;
case 12:
{

lcd_gotoxy(9,1);
lcd_puts(space);
}
break;
case 13:
{
lcd_gotoxy(10,1);
lcd_putchar(' ');
}break;
case 14:
{
lcd_gotoxy(6,1);
lcd_puts(space);
lcd_puts(space);
}
break;
case 15:
{
lcd_gotoxy(6,1);
lcd_puts(space);
}
break;

case 16:
{

lcd_gotoxy(9,1);
lcd_puts(space);
}

}
}

void Set_Timer()
{
uint8_t i;
GICR&=(~(1<<INT0));//disable interrupt
TIMSK|=(1<<TOIE2);//cho phep Timer 2 ngat tran
val2=1;
i=1;
while(1)
{
while(PIND.2==0);
Lcd_TurnOn();
Delay_500ms();
switch(i)
{
case 1:
{

while((PIND.2!=0)&&PIND.7!=0)

if(PIND.0==0)
{
Lcd_TurnOn();
if(++hour==24) hour=0;
Delay_500ms();
while(PIND.0==0)
{
//

Delay_500ms();

//

if(PIND.0==0)

//

{if(++hour==24) hour=0;}
}
rtc_set_time(hour,min,second);
}
if(PIND.1==0)
{

if(hour==0) hour=23;
hour--;
Lcd_TurnOn();
Delay_500ms();
while(PIND.1==0)
{

//

if(PIND.1==0)

//

//

if(hour==0) hour=23;

//

hour--;

//

}
}
rtc_set_time(hour,min,second);
}
}
}
break;
case 2:
{
val2=2;
while((PIND.2!=0)&&PIND.7!=0)
{

if(PIND.0==0)
{
if(++min==60) min=0;
Lcd_TurnOn();
Delay_500ms();
while(PIND.0==0);
rtc_set_time(hour,min,second);
}

if(PIND.1==0)
{
if(min==0) min=60;
min--;
Lcd_TurnOn();
Delay_500ms();
while(PIND.1==0);
rtc_set_time(hour,min,second);
}
}
}
break;
case 3:
{
val2=3;
while((PIND.2!=0)&&PIND.7!=0)
{

if(PIND.0==0)
{
if(++second==60) second=0;
Lcd_TurnOn();
Delay_500ms();
while(PIND.0==0);
rtc_set_time(hour,min,second);

}
if(PIND.1==0)
{
if(second==0) second =60;
second--;
Lcd_TurnOn();
Delay_500ms();
while(PIND.1==0);
rtc_set_time(hour,min,second);
}
}
}
break;
case 6:
{
val2=6;
while((PIND.2!=0)&&PIND.7!=0)
{

if(PIND.0==0)
{
if(year==99) continue;
year++;
Lcd_TurnOn();
Delay_500ms();

while(PIND.0==0);
rtc_set_date(date,month,year);
}
if(PIND.1==0)
{
if(year==0) continue;
year--;
Lcd_TurnOn();
Delay_500ms();
while(PIND.1==0);
rtc_set_date(date,month,year);
}
}
}
break;
case 5:
{
val2=5;
while((PIND.2!=0)&&PIND.7!=0)
{

if(PIND.0==0)
{
if(month++==13) month=1;
Lcd_TurnOn();

Delay_500ms();
while(PIND.0==0);
rtc_set_date(date,month,year);
}
if(PIND.1==0)
{
month--;
if(month==0) month=12;
Lcd_TurnOn();
Delay_500ms();
while(PIND.1==0);
rtc_set_date(date,month,year);
}
}
}
break;
case 4: {
val2=4;
while((PIND.2!=0)&&PIND.7!=0)
{

if(PIND.0==0)
{
date++;
if(month==2)

if(year%4)
{if(date==29) date=1; }
else if(date==30) date=1;

if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
if(date==32) date=1;
}
else if(month==4||month==6||month==9||month==11)
{
if(date==31) date=1;
}
Lcd_TurnOn();
Delay_500ms();
while(PIND.0==0);
rtc_set_date(date,month,year);
}
if(PIND.1==0)
{
if(month==2)
if(year%4)
{if(date==1) date=29; }
else if(date==1) date=30;

if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{

if(date==1) date=32;
}
else if(month==4||month==6||month==9||month==11)
{
if(date==1) date=31;
}
date--;
Lcd_TurnOn();
Delay_500ms();
while(PIND.1==0);
rtc_set_date(date,month,year);
}
}
}
break;
case 7: {
val2=7;
while((PIND.2!=0)&&PIND.7!=0)
{

if(PIND.0==0)
{
if(alarm==ON) alarm=OFF;
else alarm=ON;
Lcd_TurnOn();

Delay_500ms();
while(PIND.0==0);
}
if(PIND.1==0)
{
if(alarm==ON) alarm=OFF;
else alarm=ON;
Lcd_TurnOn();
Delay_500ms();
while(PIND.1==0);
}
}
if(alarm==OFF) i=9;
}
break;
case 8: {
val2=8;
while((PIND.2!=0)&&PIND.7!=0)
{

if(PIND.0==0)
{
alarm_hour++;
if(alarm_hour==24) hour=0;
Lcd_TurnOn();

Delay_500ms();
while(PIND.0==0);
}
if(PIND.1==0)
{
if(alarm_hour==0) alarm_hour=24;
alarm_hour--;
Lcd_TurnOn();
Delay_500ms();
while(PIND.1==0);
}
}
}
break;
case 9: {
val2=9;
while((PIND.2!=0)&&PIND.7!=0)
{

if(PIND.0==0)
{
alarm_min++;
if(alarm_min==60) alarm_min=0;
Lcd_TurnOn();
Delay_500ms();

while(PIND.0==0);
}
if(PIND.1==0)
{
if(alarm_min==0) alarm_min=60;
alarm_min--;
Lcd_TurnOn();
Delay_500ms();
while(PIND.1==0);
}
}
}
break;
case 10:
{
val2=10;
while((PIND.2!=0)&&PIND.7!=0)
{

if(PIND.0==0)
{
if(on==ON) on=OFF;
else on=ON;
Lcd_TurnOn();
Delay_500ms();

while(PIND.0==0);
}
if(PIND.1==0)
{
if(on==ON) on=OFF;
else on=ON;
Lcd_TurnOn();
Delay_500ms();
while(PIND.1==0);
}
}
if(on==OFF) i=13;
}
break;
case 11:
{
val2=11;
while((PIND.2!=0)&&PIND.7!=0)
{

if(PIND.0==0)
{
on_hour++;
if(on_hour==24) on_hour=0;
Lcd_TurnOn();

Delay_500ms();
while(PIND.0==0);
}
if(PIND.1==0)
{
if(on_hour==0) on_hour=24;
on_hour--;
Lcd_TurnOn();
Delay_500ms();
while(PIND.1==0);
}
}
}
break;

case 12:
{
val2=12;
while((PIND.2!=0)&&PIND.7!=0)
{

if(PIND.0==0)
{
on_min++;
if(on_min==60) on_min=0;

Lcd_TurnOn();
Delay_500ms();
while(PIND.0==0);
}
if(PIND.1==0)
{
if(on_min==0) on_min=60;
on_min--;
Lcd_TurnOn();
Delay_500ms();
while(PIND.1==0);
}
}
}
break;
case 13:
{
on_level=1;
val2=13;
while((PIND.2!=0)&&PIND.7!=0)
{

if(PIND.0==0)
{
if(++on_level==4) on_level=1;

Lcd_TurnOn();
Delay_500ms();
while(PIND.0==0);
}
if(PIND.1==0)
{
if(on_level==1) on_level=4;
on_level--;
Lcd_TurnOn();
Delay_500ms();
while(PIND.1==0);
}
}
switch(on_level)
{
case 1: on_level=LEVEL1; break;
case 2: on_level=LEVEL2; break;
case 3: on_level=LEVEL3; break;
}
}
break;

case 14: {
val2=14;
while((PIND.2!=0)&&PIND.7!=0)

if(PIND.0==0)
{
if(off==ON) off=OFF;
else off=ON;
Lcd_TurnOn();
Delay_500ms();
while(PIND.0==0);
}
if(PIND.1==0)
{
if(off==ON) off=OFF;
else off=ON;
Lcd_TurnOn();
Delay_500ms();
while(PIND.1==0);
}
}
if(off==OFF) i=16;
}
break;
case 15: {
val2=15;
while((PIND.2!=0)&&PIND.7!=0)

if(PIND.0==0)
{
off_hour++;
if(off_hour==24) off_hour=0;
Lcd_TurnOn();
Delay_500ms();
while(PIND.0==0);
}
if(PIND.1==0)
{
if(off_hour==0) off_hour=24;
off_hour--;
Lcd_TurnOn();
Delay_500ms();
while(PIND.1==0);
}
}
}
break;
case 16:
{
val2=16;
while((PIND.2!=0)&&PIND.7!=0)

if(PIND.0==0)
{
off_min++;
if(off_min==60) off_min=0;
Lcd_TurnOn();
Delay_500ms();
while(PIND.0==0);
}
if(PIND.1==0)
{
if(off_min==0) off_min=60;
off_min--;
Lcd_TurnOn();
Delay_500ms();
while(PIND.1==0);
}
}
}
break;
}
if(++i==17) break;
if(PIND.7==0) break;
}

// TIMSK|=(1<<TOIE0);//disable ngat tran TIM0


//TIMSK&=(~(1<<OCIE0);//disable ngat so sanh TIM0
GICR|=(1<<INT0);
TIMSK&=(~(1<<TOIE2));//cho phep Timer 2 ngat tran
change=Change_All;
}
/*-----------------Description-------------------------------function name: Compute_Temp
input: value of ADCW register
out: Temperature
------------------------------------------------------------*/

uint8_t Compute_Temp(uint16_t temperature)


{
uint8_t data;
data=(temperature-559);
data=data/2-data/60;
return data;
}

void Time_Update(void)
{
if(status!=8)
{
rtc_get_date(&date,&month,&year);

rtc_get_time(&hour,&min,&second);
}
Lcd_Display(change);
if(second==59)
{
change=Change_Min;
if(min==59)
{
change=Change_Hour;
if(hour==23)
{
change=Change_Date;
if(date==28||date==29||date==30||date==32)
{
change=Change_Month;
if(month==12) change=Change_Year;
}
}
}
}
else change=Change_Second;
if(second==30||second==0)
{
TIMSK&=(~(1<<TOIE0));
TIMSK|=1<<OCIE0;

++scan ;
}
if(second==35||second==5)
{
TIMSK|=1<<TOIE0;
TIMSK&=(~(1<<OCIE0));
}
//kiem tra alarm
if(alarm==ON)
{
if(alarm_hour==hour)
if(alarm_min==min)
{
PORTD.5=1;
alarm=CURRENT_ON;
}
}
//kiem tra ON
if(on==ON)
{
if(on_hour==hour)
if(on_min==min)
{
Timer1_Init(on_level);
on=CURRENT_ON;

}
}
//kiem tra off
if(off==ON)
{
if(off_hour==hour)
if(off_min==min)
{
Timer1_Init(LEVEL0);
off=OFF;
}
}

ADCSRA|=(1<<ADSC); //update nhiet do


}

void Lcd_TurnOn(void)
{
lcd_switch=0;
PORTD.6=1;
}
void Delay_500ms(void)
{
unsigned int i=65535;
char j;

for(j=0;j<4;j++)
while(i--)
{

}
}

Das könnte Ihnen auch gefallen