哪位大哥给发个DS1307时钟芯片的程序!小弟感激不尽!!
正在搞DS1307时钟芯片的编程!!谁能帮助以下小弟。发个程序参考下!! 楼主,DS1307和DS1302有什么区别么? DS1307 :I2C实时时钟DS1302 :类似SPI
印象中好像芯艺的教程里面有DS1307的代码 这是芯艺的教程里的程序
点击此处下载armok01130754.rar 这是本人写的ICC程序,可以在LCD1602上显示日期时间,可以作为参考(里边有仿真文件)!
DS1307_LCD1602 真的十分感谢大家的热情,在次感谢!我要好好学学。 #include"twi.h"
#include"ds1307.h"
#include"delay.h"
char g_aTimeBuf;//日历/时钟BCD格式缓冲区
char g_aTimeBin;//时钟/日历二进制格式缓冲区
/*************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&=0x7f;
g_aTimeBin&=0x7f;
g_aTimeBin&=0x3f;
g_aTimeBin&=0x07;
g_aTimeBin&=0x3f;
g_aTimeBin&=0x1f;
g_aTimeBin&=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编辑过 冰晶石,这是你的程序,小弟以上没太看懂,能否给予解释? http://adf.ly/4116/pic-lesson-i2c-module 用这试了试,写的时候数据跟时序都没问题,就是读不到数据。。发完读数据0xD1,在读程序就死在那了。
页:
[1]