#include#include#define uchar unsigned char#define uint unsigned int
***it sck=P2^0;***it io=P2^1;***it rst=P2^2;
***it dula=P2^7;***it wela=P2^6;
//char ge,shi,bai,qian,wan,shiwan;uchar time_data[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}; //读出寄存器 地址uchar code smg_du[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管数字码表(共阴极),高电平点亮段uchar code smg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//薛实验板6位数码管位选值码表(送P0)。uchar disp[8];
void write_ds1302_byte(char dat);//写一个字节void write_ds1302(char add,uchar dat);//特定add 写入特定datuchar read_ds1302(char add);//读特定add数据,并返回//void display(char ge,char shi,char bai,char qian,char wan,char shiwan);//6位数码管显示任意数值函数void set_rtc(void);//设定初始值函数void read_rtc(void);//读实时时钟寄存器数据函数void time_pros(void);//数据处理函数void display(void); //数码管显示函数。。。
////////////////延时50uS///////////void delay_50us(uint t){ uchar j; for(;t>0;t--) for(j=19;j>0;j--);}///////////////////////////////////
void write_ds1302_byte(char dat){ uchar i; for(i=0;i<8;i++) { sck=0; io=dat&0x01;//从低位开始传,SCK上升沿把数据读走。 dat=dat>>1; sck=1; }}
void write_ds1302(char add,uchar dat){ rst=0; _nop_(); //空操作指令 sck=0; _nop_(); rst=1; //rst为高电平,各种操作才有效。 _nop_(); write_ds1302_byte(add); write_ds1302_byte(dat); rst=0; _nop_(); io=1; //释放 sck=1; //释放 }
uchar read_ds1302(char add){ uchar i,value; rst=0; _nop_(); sck=0; _nop_(); rst=1; _nop_(); write_ds1302_byte(add);//写地址 。此时、SCK为高电平 for(i=0;i<8;i++) { value=value>>1; sck=1;//下降沿把数据读走 if(io) value=value|0x80; sck=0; } rst=0;//关闭 _nop_(); sck=0; _nop_(); sck=1; //释放 io=1; //释放 return value;}
void set_rtc(void) // 初始值设定函数。{ uchar i,j; for(i=0;i<7;i++) { j=time_data[i]/10; time_data[i]=time_data[i]%10; time_data[i]=time_data[i]+j*16;//10进制转换为16进制。。。存储 } write_ds1302(0x8e,0x00);//去除写保护 for(i=0;i<7;i++) { write_ds1302(write_add[i],time_data[i]);//将初始值写入寄存器。中。 } write_ds1302(0x8e,0x80);//加写保护 }
void read_rtc(void) //寄存器值读取函数。{ uchar i; for(i=0;i<7;i++) { time_data[i]=read_ds1302(read_add[i]); }
}
void time_pros(void){ disp[0]=time_data[6]%16; disp[1]=time_data[6]/16; disp[2]=16; disp[3]=time_data[5]%16; disp[4]=time_data[5]/16; disp[5]=16; disp[6]=time_data[4]%16; disp[7]=time_data[4]/16;
}
void display(void)///数码管显示函数还需修改。。。。薛注 { uchar i; for(i=0;i<8;i++) { dula=0; wela=1; P0=smg_we[i]; wela=0;
dula=1; P0=smg_du[disp[i]]; dula=0; delay_50us(2); }}
void main(){ set_rtc();//自动对照初始值///如有备用锂电池,去掉该句。则时钟值则可保持。。。 while(1) { read_rtc(); delay_50us(10); time_pros(); delay_50us(10); display(); delay_50us(10);
}
}
|