基于单片机和ds1302的万年历程序(其实只有时分秒)程序中缺少手动调节时间后再写入1302的程序,该怎么写#include
#define uint unsigned int
#define uchar unsigned char
***it ACC0=ACC^0;
***it ACC7=ACC^7;
***it jiak=P2^3;
***it youyik=P2^2;
***it zuoyik=P2^1;
***it jiank=P2^0;
***it int1k=P3^3;
***it CLK=P3^5;//1302时钟信号线
***it IO=P3^6;//1302的I/O数据线
***it RST=P3^7;//1302的RST复位线
void InputByte(uchar);//输入1Byte
uchar OutputByte(uchar);//输出1Byte
void W1302(uchar,uchar);
uchar R1302(uchar);
uchar tab[6];
void display();
uchar a,c,i,b,m;//c表示中断次数a表示数码管移位次数
uint temp;
uchar tab1[7]={0x40,0x59,0x11,0x11,0x02,0x06,0x06};
uchar code tab2[10]={0x88,0Xbe,0Xc4,0X94,0Xb2,0X91,0X81,0Xbc,0X80,0X90};
//延时1ms
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//往1302写入1Byte d为写入的数据入口参数
void InputByte(uchar date)
{
uchar i;
ACC=date;
for(i=8;i>0;i--)
{
IO=ACC0;//相当于汇编中的RRC
CLK=1;
CLK=0;
ACC=ACC>>1;
}
}
//从1302读取1Byte数据返回值ACC
uchar OutputByte(void)
{
uchar i;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=IO;
CLK=1;
CLK=0;
}
return(ACC);
}
//往1302写入数据先写地址后写数据 ucADD ucDA是入口参数
void W1302(uchar addr,uchar date)
{
RST=0;
CLK=0;
RST=1;
InputByte(addr);//写地址
InputByte(date);//写1Byte数据
CLK=1;
RST=0;
}
//读取1302某地址的数据 先写地址 后读数据 ucAddr入口地址 ucDa是返回值
uchar R1302(uchar addr)
{
uchar date;
RST=0;
CLK=0;
RST=1;
InputByte(addr);//写地址
date=OutputByte();//读1Byte数据
CLK=1;
RST=0;
return(date);
}
void display()
{
uchar addr=0x80;
if(int1k==0) //扫描p3
{
delay(20);
if(int1k==0)
{
while(!int1k);
a=0;
c++;
if(c==2)c=0;
}
}
if(c==1)
{
if(youyik==0) //扫描键盘
{
delay(20);
if(youyik==0)
{
while(!youyik);
a++;
if( a==6) a=0;
}
}
if(zuoyik==0)
{
delay(20);
if(zuoyik==0)
{
while(!zuoyik);
if( a==0)
a=6;
a--;
}
}
for(i=0;i<6;i++) //这个循环是个关键
{
if( a==i)
{
SBUF=0xff;
b=a;
}
else SBUF=tab2[tab];
while(!ti);
TI=0;
}
delay(100);
if(b==a)
{
if(jiak==0)
{
delay(20);
if(jiak==0)
{
while(!jiak);
tab++;
if(tab==10)tab=0;
}
}
if(jiank==0)
{
delay(20);
if(jiank==0)
{
while(!jiank);
if(tab==0)tab=10;
tab--;
}
}
}
}
for(i=0;i<6;i++)
{
SBUF=tab2[tab];
while(!TI);
TI=0;
}
delay(50);
}
void main()
{
uchar miao,fen,shi;
uchar Curtime[7];
uchar i1;
uchar addr=0x80;
W1302(0x8e,0x00);//控制命令字节WP=0 写操作
for(i1=0;i1<7;i1++)
{
W1302(addr,tab1[i1]);//秒分时日月星期年
addr+=2;
}
W1302(0x8e,0x80);//控制命令字节WP=1写保护
while(1)
{
if(c==1)
display();
else
{
uchar i2;
uchar addr=0x81;
for(i2=0;i2<7;i2++)
{
Curtime[i2]=R1302(addr);//格式秒分时日月星期年
addr+=2;
}
miao=Curtime[0];
fen=Curtime[1];
shi=Curtime[2];
tab[5]=miao%16;
tab[4]=miao/16;
tab[3]=fen%16;
tab[2]=fen/16;
tab[1]=shi%16;
tab[0]=shi/16;
display();
}
}
}
0