本帖最后由 萧芸凤 于 2012-9-16 18:19 编辑
Randy 发表于 2012-9-15 22:31
其实对于Arduino的寄存器来说是不需要设置的,很多时候是已经被一些高手去整合起来了,你现在这个程序的寄 ...
下午研究了一下1307,看了半天的datasheet,才发现寄存器中本来就是BCD格式,不需要自己再进行转换了,所以说库文件那个转换过程有些问题,也许是模块不同吧,现在把代码贴一下
[pre lang="arduino" line="1" file="1307"]#include "Wire.h"
byte rtc[7];
int year,month,date,hour,minitue,second,week;
void setup()
{
Wire.begin(); //I2C初始化
Serial.begin(9600); //串口通讯初始化
registerSet(0x68,0x00,0x00); //时钟计数器开始
registerSet(0x68,0x07,0x93); //初始化为24时制
registerSet(0x68,0x00,0x00); //设置开始为0秒
registerSet(0x68,0x01,0x40); //设置开始为40分钟
registerSet(0x68,0x02,0x17); //设置开始为17点
registerSet(0x68,0x03,0x06); //设置开始为星期六
registerSet(0x68,0x04,0x16); //设置开始为16号
registerSet(0x68,0x05,0x09); //设置开始为9月
registerSet(0x68,0x06,0x12); //设置开始为12年
}
void loop()
{
bcdRtc();
Serial.print( year,HEX); //串口输出,不要问为什么是十六进制,其实设置为HEX,BIN,OCT都可以,只要不是空着就行,
//如果空着,秒分时的计数就不是59跳变了,而是89.
//原因是什么我也不知道,只知道这样可以正常显示
Serial.print(".");
Serial.print(month,HEX);
Serial.print(".");
Serial.print(date,HEX);
Serial.print(".");
Serial.print(week,HEX);
Serial.print(".");
Serial.print(hour,HEX);
Serial.print(":");
Serial.print(minitue,HEX);
Serial.print(":");
Serial.print(second,HEX);
Serial.println();
}
void registerSet(int deviceAddress, int registerAddress, int registerValue) // 写寄存器
{
Wire.beginTransmission(deviceAddress);
Wire.write(registerAddress);
Wire.write(registerValue);
Wire.endTransmission();
}
void registerRead(int deviceAddress, int registerAddress) // 读寄存器
{
int i;
Wire.beginTransmission(deviceAddress);
Wire.write(registerAddress);
Wire.endTransmission();
Wire.requestFrom(deviceAddress,7);
if(Wire.available() <= 7);;
{
for( i = 0 ; i < 7 ; i++)
rtc = Wire.read();
}
Wire.endTransmission();
}
void bcdRtc()
{
registerRead(0x68,0x00);
year = rtc[6]; //并不需要进行什么换算了,寄存器中的数据就是BCD格式,十秒位,秒位会自动更新
month = rtc[5];
date = rtc[4];
hour = rtc[2];
minitue = rtc[1];
second = rtc[0];
week = rtc[3] ;
}[/code]
运行后的结果,以年月日星期时分秒的顺序显示
昨天研究了诺基亚的屏幕,今天又研究了1307,看来模块的差异很大,论坛上的教程有时候会起到误导作用,比如说今天的1307,如果使用到库,那么结果肯定是错误的,当然了,我也希望时我的模块问题。
贴一张模块和控制器的图片
|