该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
void main(void)
{
uchar key_ val = 0;
SYSTEM_TIME str_time;
g_save_time = 0;
g_has_set = 0;
g_set_flag = 0;
ds1302_init();
IT0=1;
EX0=1;
EA=1;
key_val=P3;
while(1)
{
if(g_set_flag == 0)
{
str_time = read_time();
}
if(g_set_flag != 0 && key_val != P3)
{
key_val = P3;
str_time = scan_key(str_time);
}
show_time(str_time);
if(g_save_time != 0)
{
set_time(str_time);
g_save_time=0;
g_has_set=0;
g_set_flag=0;
}
}
#ifndef _DELAY_H
#define _DELAY_H
void delay_ms(unit timer);
#endif
#include
void delay_ms(unit timer)
{
uchar j = 0;
while(timer--)
{
for(j = 124; j>0; j--)
{
;
}
}
}
#ifndef _DS1302_H
#define _DS1302_H
#define _DS1302_SEC 0x80
#define _DS1302_MIN 0x82
#define _DS1302_HOUR 0x84
#define _DS1302_DATE 0x86
#define _DS1302_MONTH 0x88
#define _DS1302_DAY 0x8A
#define _DS1302_YEAR 0x8C
#define _DS1302_WRITE 0x8E
#define _DS1302_POWER 0x90
#define _DS1302_ENABLE 0x00
#define _DS1302_DISABLE 0x80
void ds1302_init(void);
void write_ds1302(uchar addr, uchar dat);
uchar read_ds1302(uchar addr);
SYSTEM_TIME read_time(void);
void set_time(SYSTEM_TIME str_time);
#endif
#include
#include
sbit DS_RST = P1^0;
sbit DS_SCLK = P1^1;
sbit DS_IO = P1^2;
extern uchar g_set_flag;
#define BCD2DED(X) (((X&0x70)>>4)*10 + (X&0x0F))
#define DEC2BCD(X) ((X/10)<<4 | (X%10))
void ds1302_init(void)
{
DS_RST = 0;
DS_SCLK = 0;
DS_IO = 0;
}
void write_byte(uchar dat)
{
uchar i = 0;
for(i=0; i<8; i++)
{
DS_IO = (dat&1);
DS_SCLK = 0;
_nop_(),_nop_();
DS_SCLK = 1;
_nop_(),_nop_();
dat >>=1;
}
}
uchar read_byte(void)
{
uchar i = 0;
uchar dat = 0;
uchar tmp = 0;
for(i=0; i<8; i++)
{
DS_SCLK = 1;
_nop_(),_nop_();
DS_SCLK = 0;
_nop_(),_nop_();
tmp = DS_IO;
dat >>=1;
dat |= (tmp<<7);
}
dat=BCD2DEC(dat);
return(dat);
}
uchar read_ds1302(uchar addr)
{
uchar tmp;
DS_RST = 0;
DS_SCLK = 0;
DS_RST = 1;
write_byte(addr);
tmp = read_byte();
DS_SCLK = 0;
DS_RST = 0;
return(tmp);
}
void write_ds1302(uchar addr, uchar dat)
{
uchar tmp = 0;
tmp = DEC2BCD(dat);
DS_RST = 0;
DS_SCLK = 0;
DS_RST = 1;
write_byte(addr);
write_byte(tmp);
DS_SCLK = 0;
DS_RST = 0;
}
SYSTEM_TIME read_time(void)
{
SYSTEM_TIME str_time;
str_time.year = read_ds1302(DS1302_YEAR|0x01);
str_time.month = read_ds1302(DS1302_MONTH|0x01);
str_time.date = read_ds1302(DS1302_DATE|0x01);
str_time.hour = read_ds1302(DS1302_HOUR|0x01);
str_time.min = read_ds1302(DS1302_MIN|0x01);
str_time.sec = read_ds1302(DS1302_SEC|0x01);
str_time.day = read_ds1302(DS1302_DAY|0x01);
return(str_time);
}
void set_time(SYSRTEM_TIME str_time)
{
switch(g_set_flag)
{
case 1:
write_ds1302(DS1302_YEAR, str_time.year);
break;
case 2:
write_ds1302(DS1302_MONTH, str_time.month);
break;
case 3:
write_ds1302(DS1302_DATE, str_time.date);
break;
case 4:
write_ds1302(DS1302_HOUR, str_time.hour);
break;
case 5:
write_ds1302(DS1302_MIN, str_time.min);
break;
case 6:
write_ds1302(DS1302_SEC, str_time.sec);
break;
case 7:
write_ds1302(DS1302_DAY, str_time.day);
break;
default :
break;
}
}