当前位置:文档之家› 数字万年历简易C语言程序源代码

数字万年历简易C语言程序源代码

}
if(s2==0)
{
DS1302_GetTime(DS1302_HOUR);
time--;
DS1302_SetTime(DS1302_HOUR,time);
display_nt(ads_h,time);
write_com(0x80+ads_h+1);
delay_1302(30000);
}
}
write_com(0x80+ads_w);
{
unsigned char i;
ACC = d;
for(i=8; i>0; i--)
{
DS1302_IO = ACC0; //相当于汇编中的RRC
DS1302_CLK = 1;
DS1302_CLK = 0;
ACC = ACC >> 1;
}
}
unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
display_nt2(ads_w,time);
DS1302_GetTime(DS1302_HOUR);
display_nt(ads_h,time);
DS1302_GetTime(DS1302_MINUTE);
display_nt(ads_m,time);
DS1302_GetTime(DS1302_SECOND);
delay_1302(30000);
}
if(s2==0)
{
DS1302_GetTime(DS1302_WEEK);
time--;
DS1302_SetTime(DS1302_WEEK,time);
display_nt2(ads_w,time);
write_com(0x80+ads_w);
delay_1302(30000);
#define DS1302_YEAR 0x8C
void delay1(unsigned int i)//ds延时函数放在前边是为了让EP两次存储之间延时可以调用
{
while(i--);
}
void init_ds()//ds初始化函数
{
unsigned char x=0;
DQ=1; //DQ复位
delay1(8); //稍做延时
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
unsigned char time;
#define ads_y 0
#define ads_mo 3
#define ads_d 6
#define ads_w 9
#define ads_h 65
#define ads_m 68
#define ads_s 71
{
DS1302_SetProtect(0);
Write1302(Address, ((Value/10)<<4 | (Value%10)));
}
void DS1302_GetTime(unsigned char xy)//关键函数向外读出时间
{
unsigned char ReadValue;
ReadValue = Read1302(xy);
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr); //地址,命令
DS1302InputByte(ucDa); //写1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
}
unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^0;// lcd控制端
sbit en=P2^2;// lcd控制端
sbit all=P2^1;// lcd控制端
sbit s0=P1^5;//时间调节
{
unsignedБайду номын сангаасchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; //相当于汇编中的RRC
ACC7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0;
}
return(ACC);
}
void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData:要写的数据
unsigned char dat=0;
for(i=8;i>0;i--)
{
DQ=0; //给脉冲信号
dat>>=1;
DQ=1; //给脉冲信号
if(DQ)
dat|=0x80;
delay1(5);
}
return(dat);
}
void write_ds(unsigned char dat) ///写一个字节
DS1302_RST = 0;
return(ucData);
}
void DS1302_SetProtect(bit flag) //是否写保护
{
if(flag)
Write1302(0x8E,0x10);
else
Write1302(0x8E,0x00);
}
void DS1302_SetTime(unsigned char Address, unsigned char Value) //关键函数向内写入时间
{
DS1302_GetTime(DS1302_MINUTE);
time++;
DS1302_SetTime(DS1302_MINUTE,time);
display_nt(ads_m,time);
write_com(0x80+ads_m+1);
delay_1302(30000);
}
if(s2==0)
{
DS1302_GetTime(DS1302_MINUTE);
}
}
write_com(0x80+ads_d+1);
while(s0==0);
delay_1302(30000);
while(s0==1)
{
if(s1==0)
{
DS1302_GetTime(DS1302_DAY);
time++;
{
unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01); //地址,命令
ucData = DS1302OutputByte(); //读1Byte数据
DS1302_CLK = 1;
b=read_ds();
nt=0;
nt=nt+b;
nt=nt<<8;
nt=nt+a;
nt=nt*0.625;//此ds18b20最低位为0.5扩大十倍
}
void delay_1302(uint n)//按键长延时
{
while(n--);
}
void delay(uchar n)//lcd延时子程序
{
uchar i,j;
sbit s1=P1^6;
sbit s2=P1^7;
sbit voice=P2^7;
int nt;
sbit DQ=P2^6;
sbit DS1302_CLK = P2^3; //实时时钟时钟线引脚
sbit DS1302_IO = P2^4; //实时时钟数据线引脚
sbit DS1302_RST = P2^5; //实时时钟复位线引脚
{
en=0;
P3=byte;
rs=1;
delay(1);
en=1;
delay(2);
en=0;
delay(2);
}
void init_lcd_com()//lcd initLCD初始化
{
all=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
}
void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)
display_nt(ads_s,time);
}
void set_time()//三按键设置时间
{
if(s0==0)
{
write_com(0x0f);//开闪烁
write_com(0x80+ads_m+1);
while(s0==0);
delay_1302(30000);
while(s0==1)
{
if(s1==0)
time=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
}
void display_nt(char ads,uchar t)//将读出时间显示
{
char ge,shi;
write_com(0x80+ads);
shi=t%100/10;
ge=t%10;
write_byte(shi+'0');
相关主题