#include
#include
#define uchar unsigned char
#define uint unsigned int
unsigned char code duan[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
unsigned char code wei[]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};
unsigned char temp[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
uchar timedata[7]={10,6,4,17,11,58,30}; //年周月日时分秒
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//写时间地址
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//读时间地址
sbit P20=P2^0;
sbit P21=P2^1;
sbit P35=P3^5;
sbit sck=P0^0;
sbit io=P0^1;
sbit rst=P0^2;
sbit P30=P3^0;
sbit P32=P3^2;
uchar num=0;
uchar flag=0;
void delay(int z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_byte(uchar dat)//写一个字节
{
uchar i;
for(i=0;i<8;i++)
{
sck=0;
io=dat&0x01;
dat=dat>>1;
sck=1;
}
}
void write(uchar add,uchar date)//写一个地址,写一个数据
{
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
//_nop_();
write_byte(add);
write_byte(date);
rst=0;
_nop_();
sck=0;
_nop_();
sck=1;
io=1;
}
uchar read(uchar a)// 写入一个地址,读出一个数据
{
uchar i,value;
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
//_npo_();
write_byte(a);
for(i=0;i<8;i++)
{
value=value>>1;
sck=0;
// value=value>>1;
if(io)
{
value=value|0x80;
}
sck=1;
}
rst=0;
_nop_();
sck=0;
_nop_();
sck=1;
io=1;
return value;
}
void settime()//设定时间
{
uchar i,j;
for(i=0;i<7;i++) //bcd转化
{
j=timedata/10;
timedata=timedata%10;
timedata=timedata+j*16;
}
write(0x8e,0x00); //去除写保护
for(i=0;i<7;i++)
{
write(write_add,timedata);
}
write(0x8e,0x80); //写保护
}
void readtime()//读出时间
{
uchar i;
for(i=0;i<7;i++)
{
timedata=read(read_add);
}
}
void time_pros(void)//BCD处理,两个显示内容
{
if(num==1)
{
temp[0]=duan[timedata[6]/16];
temp[1]=duan[timedata[6]%16];
temp[2]=duan[10];
temp[3]=duan[timedata[2]/16];
temp[4]=duan[timedata[2]%16];
temp[5]=duan[10];
temp[6]=duan[timedata[3]/16];
temp[7]=duan[timedata[3]%16];
}
else
{
temp[0]=duan[timedata[4]/16];
temp[1]=duan[timedata[4]%16];
temp[2]=duan[10];
temp[3]=duan[timedata[5]/16];
temp[4]=duan[timedata[5]%16];
temp[5]=duan[10];
temp[6]=duan[timedata[6]/16];
temp[7]=duan[timedata[6]%16];
}
}
void dis() //数码管显示
{
uchar i;
for(i=0;i<8;i++)
{
P1=0xff;
P20=1;
P20=0;
P1=wei;
P21=1;
P21=0;
P1=temp;
P20=1;
P20=0;
delay(3);
}
}
void key()//按键切换内容
{
// uchar num;
if(!P30)
{
delay(10);
if(!P30)
{
while(!P30);
num++;
if(num==2)
{
num=0;
}
}
}
}
void key_key()//按键加数
{
if(!P32)
{
delay(10);
if(!P32)
{
while(!P32);
timedata[6]++;
flag=1;
}
}
}
void main()
{
settime();
P35=0;//点阵熄灭
while(1)
{ key_key();
if(flag)
{ flag=0;
settime();
}
readtime();
key();
time_pros();
//display(0,8);
dis();
}
}