#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;
}
}
}
|