#include <reg52.h>
#include <stdio.h>
#include "delay.h"
#include "string.h"
#include "ds1302.h"
#include "LCD1602.H"
#include "NONGLICONVERSION.H"
#define uchar unsigned char
#define uint unsigned int
sbit key1=P1^0;//日期設置;時間設置;模式選擇
sbit key2=P1^1;//加
sbit key3=P1^2;//減
sbit key4=P1^3;//確認;復位
sbit bell=P1^7;//鬧鐘
uint count;
bit flag,dp;
uchar displaytemp[16];//定義顯示區域臨時存儲數組
code uchar tab[] = {'0','1','2','3','4','5','6','7','8','9'};
uchar timeUPtab[6] = {99,12,31,24,59,59};
uchar timeDOWNtab[6] = {0,1,1,0,0,0};
uchar timetab[6] = {20,11,6,16,4,23}; //年 月 日? 時 分 秒
uchar state;
//狀態0:工作狀態
//狀態1:年調整
//狀態2:月調整
//狀態3:日調整
//狀態4:時調整
//狀態5:分調整
//狀態6:秒調整
//****************函數聲明************************************//
void InitTIMER0(void);//定時器初始化
void KeyDo();//按鍵操作函數
void Read_time();//時間處理函數
void display(); // 顯函數
void Conver_week(bit c,uchar year,uchar month,uchar day);
void Conversion(bit c,uchar year,uchar month,uchar day);
//***********************************************************************//
void Read_time()
{
uchar i = 0;
Read_RTC();//讀日歷
for(i=0;i<6;i++)
timetab[i] = l_tmpdate[i];
}
void Set_time()
{
uchar i;
for(i=0;i<6;i++)
{
? l_tmpdate[i]=timetab[i];
? Set_RTC(i);
}
}
void NL_read(uchar nian,uchar yue,uchar ri)
{
uchar tmp;
tmp=nian/10;
nian=nian%10;
nian=nian+tmp*16; //十進制轉BCD處理
tmp=yue/10;
yue=yue%10;
yue=yue+tmp*16; //十進制轉BCD處理
tmp=ri/10;
ri=ri%10;
ri=ri+tmp*16; //十進制轉BCD處理
Conversion(0,nian,yue,ri);
tmp=year_moon/16;
year_moon=year_moon%16;
year_moon=year_moon+tmp*10;//BCD轉十進制
tmp=month_moon/16;
month_moon=month_moon%16;
month_moon=month_moon+tmp*10;//BCD轉十進制
tmp=day_moon/16;
day_moon=day_moon%16;
day_moon=day_moon+tmp*10;//BCD轉十進制
}
void display() // 顯函數
{
uchar displaytemp1[8]={0,0,0,0,0,0,0,0};
uchar displaytemp2[8]={0,0,0,0,0,0,0,0};
// 分狀態顯示
switch(state)
{
case 0:
{
sprintf(displaytemp1,"? -? -? ");//日期
displaytemp1[0]=tab[timetab[0]/10];
displaytemp1[1]=tab[timetab[0]%10];
displaytemp1[3]=tab[timetab[1]/10];
displaytemp1[4]=tab[timetab[1]%10];
displaytemp1[6]=tab[timetab[2]/10];
displaytemp1[7]=tab[timetab[2]%10];
displaytemp2[0]=tab[timetab[3]/10];
displaytemp2[1]=tab[timetab[3]%10];
displaytemp2[2]=':';
displaytemp2[3]=tab[timetab[4]/10];
displaytemp2[4]=tab[timetab[4]%10];
displaytemp2[5]=':';
displaytemp2[6]=tab[timetab[5]/10];
displaytemp2[7]=tab[timetab[5]%10];
}break;
case 1:
{
displaytemp1[0]=tab[timetab[0]/10];
displaytemp1[1]=tab[timetab[0]%10];
}break;
case 2:
{
displaytemp1[3]=tab[timetab[1]/10];
displaytemp1[4]=tab[timetab[1]%10];
}break;
case 3:
{
displaytemp1[6]=tab[timetab[2]/10];
displaytemp1[7]=tab[timetab[2]%10];
}break;
case 4:
{
displaytemp2[0]=tab[timetab[3]/10];
displaytemp2[1]=tab[timetab[3]%10];
}break;
case 5:
{
displaytemp2[3]=tab[timetab[4]/10];
displaytemp2[4]=tab[timetab[4]%10];
}break;
case 6:
{
displaytemp2[6]=tab[timetab[5]/10];
displaytemp2[7]=tab[timetab[5]%10];
}break;
default:break;
}
// 輸出到屏幕
disstring(0x80,displaytemp1,8);
disstring(0xc0,displaytemp2,8);
}
void main()
{
LCD_init(); ? //lcd初始化?
InitTIMER0(); ? //定時器初始化
Set_time();//qq:289440
Read_time();?//426
bell=1;?
while(1)
{
display();
if(flag)
{
KeyDo();
flag=0;
}
delay(100);
}
}
/**********************定時器初始化***************************/
void InitTIMER0(void)
{
TMOD|=0x01;//定時器設置 16位
TH0=0xfc;//初始化值
TL0=0x18;
ET0=1;
TR0=1;
EA=1;
}
void tim(void) interrupt 1 using 1//中斷,用於掃描鍵盤
{?
TH0 = 0xfc;
TL0 = 0x18;
flag=1;?
}
void KeyDo()//按鍵操作函數
{
char up = 0,down = 0;
key1=1;key4=1;
if(key1==0)
{
while(key1==0);
state++;
if(state>6)
state = 1;
}
if(key4==0)
{
while(key4==0);
state = 0;
Set_time();
}
if(key2==0)
{
while(key2==0);
up = 1;
}
if(key3==0)
{
while(key3==0);
down = 1;
}
switch(state)
{
case 0:
{
Read_time();
}break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
{
// 每月時間計算
switch(timetab[1])
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:timeUPtab[2] = 31;break;
case 4:
case 6:
case 9:
case 11:timeUPtab[2] = 30;break;
case 2:
{
if(timetab[0] % 4 == 0)
timeUPtab[2] =29;
else
timeUPtab[2] =28;
}
default:break;
}
if(up)
timetab[state-1]++;
if(timetab[state-1] > timeUPtab[state-1])
timetab[state-1] = timeUPtab[state-1];
if(down)
timetab[state-1]--;
if(timetab[state-1] < timeDOWNtab[state-1])
timetab[state-1] = timeDOWNtab[state-1];
}break;
default:break;
}
}