|
楼主 |
发表于 2006-10-8 15:34:47
|
显示全部楼层
#include"twi.h"
#include"ds1307.h"
#include"delay.h"
char g_aTimeBuf[7];//日历/时钟BCD格式缓冲区
char g_aTimeBin[7];//时钟/日历二进制格式缓冲区
/*************DS1307操作**************开始**************/
//对DS1307内存连续的写操作
unsigned char rtc_write(unsigned char addr,unsigned char *buf,unsigned char len)
{
unsigned char i;
twi_start();
delay_nms(10);
twi_writebyte(DS1307_ADDR|TW_WRITE);
delay_nms(10);
twi_writebyte(addr);//write address
delay_nms(10);
for(i=0;i<len;i++)
{
twi_writebyte(buf);
delay_nms(10);
}
twi_stop();
return 0;
}
//对DS1307内存连续的读操作
unsigned char rtc_read(unsigned char addr,unsigned char *buf,unsigned char len)
{
unsigned char i;
rtc_write(addr,0,0); //set address
delay_nms(10);
twi_start();
delay_nms(10);
twi_writebyte(DS1307_ADDR|TW_READ);
for(i=0;i<len-1;i++)
{
twi_readbyte(buf+i,TW_ACK);
delay_nms(10);
}
twi_readbyte(buf+i,TW_NACK);
delay_nms(10);
twi_stop();
return 0;
}
/*************DS1307操作**************结束**************/
/*************接口部分****************开始**************/
//更新或读取DS1307日历/时间数据
unsigned char RtcUpdateData(unsigned char direction)
{
unsigned char ret;
if(direction) //读
ret=rtc_read(0,g_aTimeBuf,7);
else //写
ret=rtc_write(0,g_aTimeBuf,7);
return ret;
}
//读DS1307用户RAM
unsigned char RtcReadRAM(unsigned char addr,unsigned char *buf,unsigned char len)
{
addr+=8;
return rtc_read(addr,buf,len);
}
//写DS1307用户RAM
unsigned char RtcWriteRAM(unsigned char addr,unsigned char *buf,unsigned char len)
{
addr+=8;
return rtc_write(addr,buf,len);
}
unsigned char byte_bintobcd(unsigned char bin)
{
unsigned char ret;
bin&=0x7f;
bin%=100;
ret=bin/10;
ret <<=4;
ret|=bin%10;
return ret;
}
unsigned char byte_bcdtobin(unsigned char bcd)
{
unsigned char ret;
ret=bcd & 0x0f;
ret+=(bcd>>4)*10;
return ret;
}
//将二进制格式缓冲区(g_aTimeBin)内容转换成BCD格式后保存到BCD格式缓冲区(g_aTimeBuf)
void RtcBinToBCD(void)
{
unsigned char i;
g_aTimeBin[0]&=0x7f;
g_aTimeBin[1]&=0x7f;
g_aTimeBin[2]&=0x3f;
g_aTimeBin[3]&=0x07;
g_aTimeBin[4]&=0x3f;
g_aTimeBin[5]&=0x1f;
g_aTimeBin[6]&=0xff;
for(i=0;i<7;i++)
g_aTimeBuf=byte_bintobcd(g_aTimeBin);
}
//将BCD格式缓冲区(g_aTimeBuf)内容转换成二进制格式后保存到二进制格式缓冲区(g_aTimeBin)
void RtcBCDToBin(void)
{
unsigned char i;
for(i=0;i<7;i++)
g_aTimeBin=byte_bcdtobin(g_aTimeBuf);
}
//写DS1307配置字节
void RtcSetSQWOutput(unsigned char en,unsigned char level)
{
//en:方波输出允许 TRUE 有效 level:如果输出禁止 OUT口的逻辑电平
unsigned char c=0;
if(en) //enable
c=0x10;
else //disable
{
if(level)
c=0x80;
}
rtc_write(7,&c,1);
}
/*************接口部分***************结束**************/
1: 程序中涉及很多次这两个语句: twi_writebyte(DS1307_ADDR|TW_WRITE);
twi_writebyte(DS1307_ADDR|TW_READ);
请问能给解释下吗?
2: 还有就是程序中涉及很多类似子程序比如return TW_STATUS;和 TWI_Wait();等等
而这些在这之前有没有声明和定义啊。为什么它会被识别啊?请教帮忙!!
-----此内容被avr521于2006-10-08,15:50:25编辑过 |
|