📄 da1302.c
字号:
//#include <at89c51RB2.h>
#include <intrins.h>
#include "ds1302.h"
//#include "lm3228.h"
#include "hanzi.h"
#define uchar unsigned char
#define nop() _nop_()
uchar time1[8];
uchar time2[15]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,':','A','P','M',0x00};//0-9,:,A,P,M的CGROM代码
extern void Print(uchar *);
extern void print_char(uchar);
extern void GotoXY(uchar ,uchar );
//从1302读取一个字节
uchar read_1302(void)
{
uchar 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 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_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 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 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);
GotoXY(0,1); //读时间
if(time1[2]&0x80) //如果成立,即12小时制,否则24小时制
{ //显示小时
if(time1[2]&0x20) //如果成立,即下午,否则上午
{
Print("PM:");
if(time1[2]&0x10) //下午
{
print_char(time2[(time1[2]&0x10)>>4]+'0');
print_char(time2[time1[2]&0x0f]+'0');
}
else
{
Print("AM:");
print_char(time2[14]+'0');
print_char(time2[time1[2]&0x0f]+'0');
}
}
else //上午
{
print_char(time2[11]+'0');
print_char(time2[13]+'0');
if(time1[2]&0x10)
{
print_char(time2[(time1[2]&0x10)>>4]+'0');
print_char(time2[time1[2]&0x0f]+'0');
}
else
{
print_char(time2[14]+'0');
print_char(time2[time1[2]&0x0f]+'0');
}
}
}
else //24小时制
{
if(time1[2]&0x30)
{
print_char(time2[(time1[2]&0x30)>>4]+'0');
print_char(time2[time1[2]&0x0f]+'0');
}
else
{
print_char(time2[14]);
print_char(time2[time1[2]&0x0f]+'0');
}
}
print_char(time2[10]); //显示:
print_char((time2[(time1[1]&0x70)>>4]+'0')); //显示分钟
print_char(time2[time1[1]&0x0f]+'0');
print_char(time2[10]); //显示:
print_char((time2[(time1[0]&0x70)>>4]+'0')); //显示秒
print_char(time2[time1[0]&0x0f]+'0');
Print(" ");
print_char('0');
print_char(time2[time1[6]&0x07]+'0');
Print("-");
print_char(time2[time1[4]&0xf0>>4]+'0');
Print("-");
print_char(time2[time1[3]&0x0f]+'0');
}
//设置时间
void set_time(uchar *time)
{
protect_1302(0); //清除写保护
//写预设时间
write_data(time);
start_1302(); //启动1302
protect_1302(1); //开启写保护
}
//显示星期
void display_week(uchar lowaddr,uchar highaddr)
{
//显示星期几
}
//显示“现在时间”
void display_currenttime(uchar lowaddr,uchar highaddr)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -