#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code s8[18]={0x40,0x79,0x24,0x30,0x19,0x12,
0x02,0x78,0x00,0x10,0x88,0x89,
0xbf,0xfe,0xf7,0xc7,0xbe,0xb7};
//共阳极数码管0-9,A,H,-,-(再上一格),_,灭,,,的字段码
uchar dssjs[20]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar dssjf[20]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//存储定时时间
uchar time[2]={12,00}; //存储分,小时
uchar w6[6]={0x01,0x02,0x04,0x08,0x10,0x20};
//位选择码
uchar k;
uchar shu[6]={0x00,0x00,0x00,0x00,0x00,0x00};//储存数码管要显示的数据
/*DS1302引脚定义*/
sbit SCL = P3^0;
sbit IO = P3^1;
sbit CE = P3^2;
/*74hc595引脚定义*/
sbit ds = P1^0;
sbit rck = P1^2;
sbit sck = P1^1;
void Delay(uint n)
{
while(n--);
}
/************************************************
*名称:DS1302_Sendchar()
*描述:向DS1302写字节
*变量:dat
************************************************/
void DS1302_Sendchar(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
SCL = 0;
IO = (bit)(dat & 0x01);
dat >>= 1;
SCL = 1;
}
}
/************************************************
*名称:DS1302_Rendchar2()
*描述:从ds1302读取字节
*变量:dat
************************************************/
uchar DS1302_Readchar()
{
uchar dat,i;
for(i=0;i<8;i++)
{
if(IO == 1)
{
dat = dat|0x80;
}
SCL = 1;
dat >>= 1;
SCL = 0;
}
IO = 0;//将读1个字节函数最后加上I/O=0即可消除85显示
return dat;
}
/************************************************
*名称:DS1302_WriteADD()
*描述:向1302寄存器写数据
*变量:com,dat
************************************************/
void DS1302_WriteADD(uchar com,uchar dat)
{
CE = 0;
SCL = 0;
CE = 1;
DS1302_Sendchar(com);
DS1302_Sendchar(dat);
SCL = 1;
CE = 0;
}
/************************************************
*名称:DS1302_ReadADD()
*描述:从1302指定寄存器内读数据
*变量:com
************************************************/
uchar DS1302_ReadADD(uchar com)
{
uchar dat;
CE = 0;
SCL = 0;
CE = 1;
DS1302_Sendchar(com);
dat = DS1302_Readchar();
SCL = 1;
CE = 0;
return dat;
}
/************************************************
*名称:DS1302_Init()
*描述:初始化DS1302
*变量:无
************************************************/
void DS1302_Init()
{
// uchar flag;
// flag = DS1302_ReadADD(0x81);
// if(flag & 0x80)
// {
DS1302_WriteADD(0x8e,0x00);
DS1302_WriteADD(0x80,((21/10)<<4|(21%10)));
DS1302_WriteADD(0x82,((12/10)<<4|(12%10)));
DS1302_WriteADD(0x84,((13/10)<<4|(13%10)));
DS1302_WriteADD(0x86,((14/10)<<4|(14%10)));
DS1302_WriteADD(0x88,((1/10)<<4|(1%10)));
DS1302_WriteADD(0x8c,((1/10)<<4|(1%10)));
DS1302_WriteADD(0x8e,0x80);
// }
}
/************************************************
*名称:set595()
*描述:595向数码管发送数据
*变量:dat
************************************************/
void set595(uchar dat)
{
uchar i;
rck=0;
for(i=0;i<8;i++)
{
if(dat & 0x80)
{
ds=1;
}
else
{
ds=0;
}
sck=1;
dat<<=1;
sck = 0;
}
rck = 1;
}
/************************************************
*名称:main()
*描述:主函数
************************************************/
void main()
{
uchar ReadValue; //储存从1302读取的数据
DS1302_Init(); //将1302初始化
TMOD=0x01;
TH0=64536/256;
TL0=64536%256;
ET0=1;
TR0 = 1;
EA=1;
while(1)
{
ReadValue = DS1302_ReadADD(0x81); //从分寄存器读
time[0]=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
ReadValue = DS1302_ReadADD(0x85); //从时寄存器读
time[1]=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
shu[0]=s8[15];shu[1]=s8[15];shu[2]=s8[(time[1]/10)];
shu[3]=s8[(time[1]%10)];shu[4]=s8[(time[0]/10)];shu[5]=s8[(time[0]%10)];
}
}
void timer0() interrupt 1//刷新数码管显示
{
TH0=64536/256;
TL0=64536%256;
set595(0xff);
set595(0x00);
set595(shu[k]);
set595(w6[k]);
k++;
if(k==6) k=0;
}