51单片机数码管显示DS1302时钟程序

#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit we=P1^0;
sbit dula=P2^6;
sbit wela=P2^7;
sbit T_RST=P1^4;
sbit T_CLK=P1^5;
sbit T_IO=P1^3;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
uchar i;
uchar k=0;
uchar temp=0x80;
uchar clk_time[]={0x00,0x00,0x12}; //秒,分,时寄存器初始值
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
void delay(uint j)
{ uchar i=0;
for(;j>0;j--) {for(i=0;i<124;i++) ;}
}

void display(uchar aa,uchar bb,uchar cc)
{ uchar show[6];
show[0]=aa&0x0f;
show[1]=((aa&0xf0)>>4);
show[2]=bb&0x0f;
show[3]=((bb&0xf0)>>4);
show[4]=cc&0x0f;
show[5]=((cc&0xf0)>>4);
wela=0;
dula=1;
P0=table[show[0]];
dula=0;
wela=1;
P0=0x80;
wela=0;
P0=0x00;
delay(1);

wela=0;
dula=1;
P0=table[show[1]];
dula=0;
wela=1;
P0=0x40;
wela=0;
P0=0x00;
delay(1);

wela=0;
dula=1;
P0=table[show[2]];
dula=0;
wela=1;
P0=0x20;
wela=0;
P0=0x00;
delay(1);

wela=0;
dula=1;
P0=table[show[3]];
dula=0;
wela=1;
P0=0x10;
wela=0;
P0=0x00;
delay(1);

wela=0;
dula=1;
P0=table[show[4]];
dula=0;
wela=1;
P0=0x08;
delay(1);
P0=0x00;
wela=0;

wela=0;
dula=1;
P0=table[show[5]];
dula=0;
wela=1;
P0=0x04;
delay(1);
P0=0x00;
wela=0;
}
/******************DS1302:写入操作(上升沿)*********************/
void write_byte(uchar da)
{
uchar i;
ACC=da;
for(i=8;i>0;i--)
{
T_IO=ACC0;
T_CLK=0;
T_CLK=1;
ACC=ACC>>1;
}
}
/******************DS1302:读取操作(下降沿)*****************/
uchar read_byte(void)
{
uchar i;
for(i=0;i<8;i++)
{
ACC=ACC>>1;
T_CLK = 1;
T_CLK = 0;
ACC7 = T_IO;
}
return(ACC);

}
/******************DS1302:写入数据(先送地址,再写数据)***************************/
void write_1302(uchar addr,uchar da)
{
T_RST=0; //停止工作
T_CLK=0;
T_RST=1; //重新工作
write_byte(addr); //写入地址
write_byte(da);
T_RST=0;
T_CLK=1;
}
/******************DS1302:读取数据(先送地址,再读数据)**************************/
uchar read_1302(uchar addr)
{
uchar temp;
T_RST=0; //停止工作
T_CLK=0;
T_RST=1; //重新工作
write_byte(addr); //写入地址
temp=read_byte();
T_RST=0;
T_CLK=1; //停止工作
return(temp);
}
/**************8****************************************************/
uchar keyscan()
{
uchar Kvalue,tmp;
Kvalue=P3;
Kvalue|=0x0f;
if(Kvalue==0xff)
return(0);
delay(10);
Kvalue=P3;
Kvalue|=0x0f;
if(Kvalue==0xff)
return(0);
for(;;)
{display(clk_time[0],clk_time[1],clk_time[2]);
temp=0x81;
for(i=0;i<3;i++)
{
clk_time[i

]=read_1302(temp);
temp+=2;
}
tmp=P3;
if((tmp|0x0f)==0xff)
break;
}
return(Kvalue);
}
/******************************************************************/
void keygo()
{
uchar a;
a=keyscan();
if (a==0x7f)
{i=k;
clk_time[i]=clk_time[i]+1;
if((clk_time[i]&0x0f)==0x0a)
clk_time[i]=(clk_time[i]&0xf0)+0x10;
we=0;temp=0x80;
if((clk_time[i]==0x60)&&(i<2))
clk_time[i]=0x00;
if((clk_time[2]==0x24)&&(i==2))
clk_time[2]=0x00;
write_1302(0x8e,0x00); //WP=0 写操作
for(i=0;i<3;i++)
{
write_1302(temp,clk_time[i]);
temp+=2;
}
write_1302(0x8e,0x80); //WP=1 写保护
} ///加一键
if (a==0xbf)
{
i=k;
k=k+1;
if(k==3)
k=0;
}
}////左移键*/
/////////////////////////////////////////////////////////////////////
void main ()
{
write_1302(0x8e,0x00); //WP=0 写操作
for(i=0;i<3;i++) //赋初值 给 秒分时
{
write_1302(temp,clk_time[i]);
temp+=2;
}
write_1302(0x8e,0x80); //WP=1 写保护
while(1)
{
display(clk_time[0],clk_time[1],clk_time[2]);
keygo();
temp=0x81;
for(i=0;i<3;i++)
{
clk_time[i]=read_1302(temp);
temp+=2;
}

}
}

相关文档
最新文档