📄 da1302.c
字号:
#include <at89c51xd2.h>
#include <intrins.h>
#include "ds1302.h"
#include "lm3228.h"
#include "common.h"
#include "ds1302_hanzi.h"
sbit IO_DATA =P1^5;
sbit CLK =P1^6;
sbit RST =P1^7;
uchar data time1[8];
//从1302读取一个字节
uchar read_1302(void)
{
uchar xdata i,data_1302;
for(i=0;i<8;i++)
{
data_1302>>=1;
if(IO_DATA)
{
data_1302|=0x80;
}
CLK=1;
//nop();
CLK=0;
}
return(data_1302);
}
//向1302写入一个字节
void write_1302(uchar data_1302)
{
uchar xdata i;
for(i=0;i<8;i++)
{
data_1302>>=1;
IO_DATA=CY;
CLK=0;
//nop();
CLK=1;
//nop();
CLK=0;
}
}
//从1302的某地址读一个字节的数据
/*uchar read_byte_1302(uchar addr)
{
uchar data data_1302;
RST=0;
CLK=0;
RST=1;
write_1302(addr|0x01);
data_1302=read_1302();
CLK=1;
RST=0;
CLK=0;
return (data_1302);
}*/
//向1302的某地址写入一个字节的数据
void write_byte_1302(uchar addr,uchar data_1302)
{
RST=0;
CLK=0;
RST=1;
write_1302(addr);
write_1302(data_1302);
CLK=1;
RST=0;
CLK=0;
}
//是否写保护
void protect_1302(bit flag)
{
if(flag)
write_byte_1302(DS1302_CONTROL,0x80);
else
write_byte_1302(DS1302_CONTROL,0x00);
}
//停止1302时钟
/*void stop_1302(void)
{
write_byte_1302(DS1302_SECOND,0x80);
}*/
//启动1302时钟
void start_1302(void)
{
write_byte_1302(DS1302_SECOND,0x00);
}
//读1302的时间序列
void read_data(uchar *j)
{
uchar xdata i;
RST=0;
CLK=0;
RST=1;
write_1302(0xbf);
for(i=0;i<8;i++)
{
*(j)=read_1302();
j++;
}
CLK=1;
RST=0;
CLK=0;
}
//写1302的时间序列
void write_data(uchar *j)
{
uchar xdata i;
RST=0;
CLK=0;
RST=1;
write_1302(0xbe);
for(i=0;i<8;i++)
{
write_1302(*j);
j++;
}
CLK=1;
RST=0;
CLK=0;
}
//显示时间
void display_time(uchar lowaddr,uchar highaddr)
{
read_data(time1); //读时间
if(time1[2]&0x80) //如果成立,即12小时制,否则24小时制
{ //显示小时
if(time1[2]&0x20) //如果成立,即下午,否则上午
{
string_display_code(1,&time2[12],lowaddr+0x09,highaddr);
string_display_code(1,&time2[13],lowaddr+0x0a,highaddr);
if(time1[2]&0x10) //下午
{
string_display_code(1,&time2[(time1[2]&0x10)>>4],lowaddr+0x00,highaddr);
string_display_code(1,&time2[time1[2]&0x0f],lowaddr+0x01,highaddr);
}
else
{
string_display_code(1,&time2[14],lowaddr+0x00,highaddr);
string_display_code(1,&time2[time1[2]&0x0f],lowaddr+0x01,highaddr);
}
}
else //上午
{
string_display_code(1,&time2[11],lowaddr+0x09,highaddr);
string_display_code(1,&time2[13],lowaddr+0x0a,highaddr);
if(time1[2]&0x10)
{
string_display_code(1,&time2[(time1[2]&0x10)>>4],lowaddr+0x00,highaddr);
string_display_code(1,&time2[time1[2]&0x0f],lowaddr+0x01,highaddr);
}
else
{
string_display_code(1,&time2[14],lowaddr+0x00,highaddr);
string_display_code(1,&time2[time1[2]&0x0f],lowaddr+0x01,highaddr);
}
}
}
else //24小时制
{
if(time1[2]&0x30)
{
string_display_code(1,&time2[(time1[2]&0x30)>>4],lowaddr+0x00,highaddr);
string_display_code(1,&time2[time1[2]&0x0f],lowaddr+0x01,highaddr);
}
else
{
string_display_code(1,&time2[14],lowaddr+0x00,highaddr);
string_display_code(1,&time2[time1[2]&0x0f],lowaddr+0x01,highaddr);
}
}
string_display_code(1,&time2[10],lowaddr+0x02,highaddr); //显示:
string_display_code(1,&(time2[(time1[1]&0x70)>>4]),lowaddr+0x03,highaddr); //显示分钟
string_display_code(1,&time2[time1[1]&0x0f],lowaddr+0x04,highaddr);
string_display_code(1,&time2[10],lowaddr+0x05,highaddr); //显示:
string_display_code(1,&(time2[(time1[0]&0x70)>>4]),lowaddr+0x06,highaddr); //显示秒
string_display_code(1,&time2[time1[0]&0x0f],lowaddr+0x07,highaddr);
}
//设置时间
void set_time(uchar *time)
{
protect_1302(0); //清除写保护
//写预设时间
write_data(time);
start_1302(); //启动1302
protect_1302(1); //开启写保护
}
//显示星期
void display_week(uchar lowaddr,uchar highaddr)
{
uchar xdata i;
hanzi_display(hanzi3,sizeof(hanzi3),lowaddr,highaddr); //显示“星期”
read_data(time1);
i=time1[5]; //显示星期几
hanzi_display(&hanzi4[(i-2)*32],32,lowaddr+0x4,highaddr); //sizeof(hanzi4[i])
}
//显示“现在时间”
void display_currenttime(uchar lowaddr,uchar highaddr)
{
hanzi_display(hanzi2,sizeof(hanzi2),lowaddr,highaddr);
}
//
void display_year(uchar lowaddr,uchar highaddr)
{
read_data(time1);
set_point(SET_ADDRESS_POINTER,lowaddr,highaddr);
string_display_code(1,&time2[(time1[6]>>4&0x0f)],lowaddr,highaddr);
string_display_code(1,&time2[time1[6]&0x0f],lowaddr+0x01,highaddr); //年
text_display('-');
string_display_code(1,&time2[time1[4]>>4&0x01],lowaddr+0x03,highaddr);
string_display_code(1,&time2[time1[4]&0x0f],lowaddr+0x04,highaddr); //月
text_display('-');
string_display_code(1,&time2[time1[3]>>4&0x03],lowaddr+0x06,highaddr);
string_display_code(1,&time2[time1[3]&0x0f],lowaddr+0x07,highaddr); //日
}
void time_display(void)
{
display_currenttime(0x00,0x08);
display_year(0x28,0x31);
display_week(0x10,0x08);
display_time(0x38,0x31);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -