#include"main.h"
#include"delay.h"
#include"ds1302.h"
sbit ADD_KEY=P3^1;
sbit SUB_KEY=P3^3;
#define DATA P0 //数码管显示口
#define SHOW P2 //数码管选择端口
//共阴极数码管段码表
uchar code DIS_CODE[]={0x3F,0x06,0x5B,0x4F,
0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
uchar g_save_time; //需要保存时间标志
uchar g_has_set; //修改时间标志
uchar g_set_flag; //设定时间标志
/******************************
*函数:指定数码管显示数据
*参数:_show指定的数码管
_data要显示的数据
****************************/
void display_num(uchar _show,uchar _data)
{
SHOW=_show; //数码管位选
DATA=DIS_CODE[_data]; //数码管段选
delay_ms(1);
}
/*函数:显示年、月、日、时、分、秒、星期
*参数: str_time 要显示的时间*/
void show_time(SYSTEM_TIME str_time)
{
uchar tmp=0;
static uchar FLASH=10; //用静态变量实现闪烁的效果
display_num(0,2); //年(高2位)
display_num(1,0);
tmp=str_time.year;
if(g_set_flag!=1||FLASH==0)
{
display_num(2,(tmp/10));
display_num(3,(tmp%10));
}
tmp=str_time.month;
if(g_set_flag!=2||FLASH==0)
{
if(tmp>9)
{
display_num(4,(tmp/10)); //月
}
display_num(5,(tmp%10));
}
tmp=str_time.date;
if(g_set_flag!=3||FLASH==0)
{
if(tmp>9)
{
display_num(6,(tmp/10)); //日
}
display_num(7,(tmp%10));
}
tmp=str_time.hour;
if(g_set_flag!=4||FLASH==0)
{
if(tmp>9)
{
display_num(8,(tmp/10)); //时
}
display_num(9,(tmp%10));
}
tmp=str_time.min;
if(g_set_flag!=5||FLASH==0)
{
if(tmp>9)
{
display_num(10,(tmp/10)); //分
}
display_num(11,(tmp%10));
}
tmp=str_time.sec;
if(g_set_flag!=6||FLASH==0)
{
if(tmp>9)
{
display_num(12,(tmp/10)); //秒
}
display_num(13,(tmp%10));
}
tmp=str_time.day;
if(g_set_flag!=7||FLASH==0)
{
display_num(14,tmp); //星期
}
if(FLASH--==0)
{
FLASH=10;
}
}
/**************************
*函数;扫描键盘,修改时间值
*参数:str_time原来的时间
*返回值:str_time修改后的时间
****************************/
SYSTEM_TIME scan_key(SYSTEM_TIME str_time)
{
if(ADD_KEY==0)
{
g_has_set=1;
switch(g_set_flag)
{
case 1:
str_time.year++;
break;
case 2:
str_time.month++;
break;
case 3:
str_time.date++;
break;
case 4:
str_time.hour++;
break;
case 5:
str_time.min++;
break;
case 6:
str_time.sec++;
break;
case 7:
str_time.day++;
break;
default:
break;
}
}
if(SUB_KEY==0)
{
g_has_set=1;
switch(g_set_flag)
{
case 1:
str_time.year--;
break;
case 2:
str_time.month--;
break;
case 3:
str_time.date--;
break;
case 4:
str_time.hour--;
break;
case 5:
str_time.min--;
break;
case 6:
str_time.sec--;
break;
case 7:
str_time.day--;
break;
default:
break;
}
}
if(str_time.year>99)
str_time.year=0;
if(str_time.month>12)
str_time.month=1;
if(str_time.date>31)
str_time.date=1;
if(str_time.hour>23)
str_time.hour=0;
if(str_time.min>59)
str_time.min=0;
if(str_time.sec>59)
str_time.sec=0;
if(str_time.day>7)
str_time.day=1;
return (str_time);
}
/**********************
*函数:外部0中断,设定键中断响应
*参数:空
***********************/
void int0_inter() interrupt 0
{
if(g_has_set==0) //ADD、SUB键未按过
{
g_set_flag++; //设定时间标志加1
if(g_set_flag>7)
{
g_set_flag=1;
}
}else
{
g_save_time=1; //ADD、SUB键已按过,要保存数据
}
}
/***************************************
*函数:主函数,从DS1302读取数据显示,可修改数据,并将修改后的
* 数据保存到DS1302
*参数:空
****************************************/
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(); //DS1302端口初始化
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); //修改DS1302的时间
g_save_time=0; //修改标志量
g_has_set=0;
g_set_flag=0;
}
}
}
|