文档介绍:万年历程序—C语言
万年历数字钟及可调时钟系统
 
一、    引言
万年历数字钟是一种用万年历时钟芯片实现年、月、日、时、分、秒计时,并通过单片机处理后送给显示芯片显示的装置,与机械式时钟相比具有更高的准确性和直观性**/
void delay(uchar i)
{
while(i--);
}
 
//******************** TIMER1 interrupt process ***************************//
timer0 (void) interrupt 1 using 1
{
TH0=0x3c;
TL0=0xb0;
 
RESWDI();
 
}
 
 
void RESWDI(void) ////复位看门狗(喂狗)
{
zlg7289_cs=1;
CS = 1;
CS = 0;
CS = 1;
zlg7289_cs=1;
}
 
void WREN(void) //写使能复位使用)?
 
{
zlg7289_cs=1;
SCK=0;
CS=0;
OUTByte(0x06); //发送06H写使能命令字
SCK=0;
CS=1;
zlg7289_cs=1;
}
 
 
 
void WRDI(void) //写使能复位(禁止写{
{
zlg7289_cs=1;
SCK=0;
CS=0;
OUTByte(0x04); //发送04H写禁止命令字SCK=0;
CS=1;
zlg7289_cs=1;
}
 
 
 
void WRSR(void) //写状态寄存器
{
WREN();
zlg7289_cs=1;
SCK=0;
CS=0;
OUTByte(0x01); //发送01H写寄存器命令字
OUTByte(0x00); //发送寄存器值BL0,BL1为0没写保护,WD0=0 W01=1
//WD1=0WD1=
SCK=0;
CS=1;
zlg7289_cs=1;
WIPCHK(); //判断是否写入
}
 
 
 
unsigned char RSDR(void) //读状态寄存器
{
unsigned char Temp;
zlg7289_cs=1;
SCK=0;
CS=0;
OUTByte(0x05); //发送05H读状态寄存器命令字
Temp = INPUTByte(); //读状态寄存器值
SCK=0;
CS=1;
return Temp;;//这一个调试时没有执行,Temp的值总是0xFF;???????????
zlg7289_cs=1;
}
 
 
 
void WIPCHK(void) //检查WIP位,判断是否写入完成
 
{
unsigned char Temp,TempCyc;
for(TempCyc=0;TempCyc<50;TempCyc++)
{
Temp = RSDR(); //读状态寄存器
if (Temp&0x01==0)
TempCyc = 50;
}
}
 
 
//单字节指令或数据写入X25045
//在SI线上输入的数据在SCK的上升沿被锁存。
 
void OUTByte(unsigned char Byte) //输出一个定节
{
unsigned char TempCyc;
zlg7289_cs=1;
for(TempCyc=0;TempCyc<8;TempCyc++)
{
SCK = 0;
if(Byte&0x80)
SI = 1;
else
SI = 0;
SCK = 1;
Byte = Byte<<1; //右移
}
SI=0; //使SI处于确定的状态
zlg7289_cs=1;
}
 
 
//单字节数据从X25045读到单片机
//数据由SCK的下降沿输出到SO线上。
unsigned char INPUTByte(void) //输入一个字节
{
unsigned char Temp=0, TempCyc;
 
 
zlg7289_cs=1;
for(TempCyc=0;TempCyc<8;TempCyc++)
{
Temp = Temp<<1; //右移
SCK = 1;
SCK=0;
if (SO)
Temp = Temp|0x01; //SO为1,则最低位为1
el