|
#include "AVR/IO.h"
#include "cpu.h"
#include "key.h"
#include "lcd.h"
#include "rtc.h"
#include "sd.h"
#include "timer.h"
void init_887();
uchar READ_DATA_887(uchar addr);
void WRITE_DATA_887(uchar addr ,uchar data);
unsigned char size_month(unsigned char year,unsigned char month);
uchar week(uchar g,uchar k,uchar m);
void RESET_887();
void delay(uint ms);
void delay_us(uint us);
const uchar table_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
const uchar table_wei[]={0x01,0X02,0X04,0X08};
uchar ge=0,shi=0,bai=0,qian=0;
void init_887()
{ AS_L;
DS_L;
RW_L;
WRITE_DATA_887(0x0A,0x20);
WRITE_DATA_887(0x0B,0x76); //DS12887初始化设置
delay(1);
}
/********************************************************************
* 名称 : READ_DATA_887()
* 功能 : 初始化DS12C887
* 输入 : 无
* 输出 : 无
***********************************************************************/
void RESET_887()
{
WRITE_DATA_887(4,23);//设定时
WRITE_DATA_887(2,59);//设定分
WRITE_DATA_887(0,55);//设定秒
WRITE_DATA_887(9,0x0a);//设定年
WRITE_DATA_887(8,0x0c);//设定月
WRITE_DATA_887(7,0x1f);//设定日
WRITE_DATA_887(6,5);//设定星期
}
/********************************************************************
* 名称 : READ_DATA_887()
* 功能 : 从DS12C887中读取数据
* 输入 :
* 输出 : 无
***********************************************************************/
uchar READ_DATA_887(uchar add)
{
uchar ds_date; //设置临时变量
AS_H; //置地址选通信号有效
DS_H; //置数据信号有效
RW_H; //置写地址信号有效
CS_L; //置片选信号为有效
PORTA=add; //写入要取数据的地址
AS_L; //置数据选通信号有效
DS_L; //置数据信号有效
PORTA=0xff; //送0xff准备取数标识给DS12C887
ds_date=PINA; //取对应地址的有效数据
DS_H; //置地址/数据为高
AS_H; //置地址选通为高
CS_H; //置片选为高
return ds_date; //返回所取到的时钟数据
}
/********************************************************************
* 名称 : WRITE_DATA_887()
* 功能 : 往DS12C887中写入数据
* 输入 :
* 输出 : 无
***********************************************************************/
void WRITE_DATA_887(uchar add,uchar data)
{
CS_L; //置片选信号为有效
AS_H; //置地址选通信号有效
DS_H; //置地址信号有效
RW_H; //置写地址信号有效
PORTA=add; //写入要写数据的地址
AS_L; //置数据选通信号有效
RW_L; //置写数据信号有效
PORTA=data; //写入数据
RW_H; //置读/写为高
AS_H; //置地址选通为高
CS_H; //置片选为高
}
/*-----阳历月份最大天数计算-----*/
unsigned char size_month(unsigned char year,unsigned char month)
{
return(30+(((month&1)^(month&8)>>3)!=0)-(month==2)*2+(!(year%4)&&(year%100)&&(month==2)||!(year
%400)));
}
/*-----时间调整后星期的计算-----*/
uchar week(uchar g,uchar k,uchar m)//g=nian k=yue m=ri
{
uint y1,l1;
uchar zhou,z1;
if(g%4==0)
z1=g/4;
else
z1=g/4+1;
if(g%4!=0)
{
switch(k)
{
case 1:y1=0;break;
case 2:y1=31;break;
case 3:y1=59;break;
case 4:y1=90;break;
case 5:y1=120;break;
case 6:y1=151;break;
case 7:y1=181;break;
case 8:y1=212;break;
case 9:y1=243;break;
case 10:y1=273;break;
case 11:y1=304;break;
case 12:y1=334;break;
}
}
else
{
switch(k)
{
case 1:y1=0;break;
case 2:y1=31;break;
case 3:y1=60;break;
case 4:y1=91;break;
case 5:y1=121;break;
case 6:y1=152;break;
case 7:y1=182;break;
case 8:y1=213;break;
case 9:y1=244;break;
case 10:y1=274;break;
case 11:y1=305;break;
case 12:y1=335;break;
}
}
y1=y1+m-36;//从12887中读出的时间距2000.02.05几天 即为值l的大小
l1=g*365+z1+y1;
l1=l1%7;
switch(l1)
{
case 0:y1=6;break;
case 1:y1=7;break;
case 2:y1=1;break;
case 3:y1=2;break;
case 4:y1=3;break;
case 5:y1=4;break;
case 6:y1=5;break;
}
zhou=y1;
return zhou;
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|