我写的驱动程序:
接口函数(类面向对象):
初始化:init1302();
读:read1302(属性宏或地址);
例如:year=read1302(rt_year);
写:wrt1302(属性宏或地址,值);
其它功能请自己开发。
/*----------------------------------------
端口定义组件,版本: mar 7,2008
文件名:portdef.h
----------------------------------------*/
#define rt_sclk p3_0
#define rt_io p3_1
#define rt_rst p3_2
/*----------------------------------------
ds1302 驱动组件,版本: mar 7,2008
下列接口在使用前需要先在程序中定义:
rt_rst, rt_sclk, rt_io
文件名:ds1302a.h
----------------------------------------*/
#include<absacc.h>
#include<portdef.h>
#define uchar unsigned char
#define rt_sec 0x00
#define rt_min 0x01
#define rt_hour 0x02
#define rt_date 0x03
#define rt_month 0x04
#define rt_day 0x05
#define rt_year 0x06
#define rt_ctrl 0x07
#define rt_tchg 0x08
#define rt_clk_burst 0x1f
#define rt_ram_burst 0x3f
sbit acc7=acc^7;
sbit acc0=acc^0;
/* 设置给ds1302初始化时使用的时间 */
/* 依次为:秒 分 时 日 月 星期 年 控制位 */
code uchar init_data[8]={0x00, 0x00, 0x12, 0x01, 0x01, 0x02, 0x08, 0x00};
void init1302();
void wrt1302add(uchar,bit);
void wrt1302(uchar,uchar);
uchar read1302(uchar);
void phy_wrt1302(uchar);
uchar phy_read1302();
void burst_read1302(uchar*,bit);
void burst_wrt1302(uchar*,bit);
void init1302()
{
wrt1302(rt_ctrl,0);
burst_wrt1302(init_data,0);
}
void wrt1302add(uchar add,bit rw)
{
rt_rst=0;
rt_sclk=0;
acc=add;
acc<<=1;
acc0=rw;
acc7=1;
rt_rst=1;
phy_wrt1302(acc);
}
void wrt1302(uchar add,uchar c)
{
wrt1302add(add,0);
phy_wrt1302(c);
rt_rst=0;
}
uchar read1302(uchar add)
{
wrt1302add(add,1);
acc=phy_read1302();
rt_rst=0;
return acc;
}
void burst_read1302(uchar*c,bit rc)
{
uchar i;
if(rc) {wrt1302add(rt_ram_burst,1); i=31;}
else {wrt1302add(rt_clk_burst,1); i=8;}
for(;i>0;i--)
{
*c=phy_read1302();
c++;
}
rt_rst=0;
}
void burst_wrt1302(uchar*c,bit rc)
{
uchar i;
if(rc) {wrt1302add(rt_ram_burst,0); i=31;}
else {wrt1302add(rt_clk_burst,0); i=8;}
for(;i>0;i--)
{
phy_wrt1302(*c);
c++;
}
rt_rst=0;
}
void phy_wrt1302(uchar c) /* 物理层操作:写入一个字节 ,低位在前 */
{
uchar i;
acc=c;
for(i=8;i>0;i--)
{
rt_io=acc0;
rt_sclk=1;
acc>>=1;
rt_sclk=0;
}
}
uchar phy_read1302() /* 物理层操作:读出一个字节 */
{
uchar i;
acc=0;
for(i=7;i>0;i--)
{
rt_sclk=0;
acc7=rt_io;
rt_sclk=1;
acc>>=1;
}
rt_sclk=0;
acc7=rt_io;
return acc;
}