本帖最后由 一叶倾城wwq 于 2018-8-24 23:50 编辑
或者直接就没驱动好,就没读出,在LCD上一直显示小写字母oo,贴上驱动程序:
/*********************************************
FunctionName: Write1302
FunctionInfo: DS1302时钟写地址数据(选择时分秒的地址写数据)
Input: addr dat
Output: no
注: 控制字总是从最低位开始输出.在控制字指令输入后的下一个SCLK时钟的上升沿时,
数据被写入DS1302,数据输入从最低位(0位)开始
**********************************************/
void Write1302(uchar addr,uchar dat)
{
uchar i,temp;
DS_CE = 0; //CE引脚为低,数据传送中止
DS_SCLK=0; //清零时钟总线
DS_CE = 1; //CE引脚为高,逻辑控制有效
for ( i=8; i>0; i-- ) //发送地址
{
DS_SCLK = 0;
temp = addr;
DS_DATA = (bit)(temp&0x01); //每次传输低字节
addr >>= 1; //右移一位
DS_SCLK = 1;
}
for ( i=8; i>0; i-- ) //发送数据
{
DS_SCLK = 0;
temp = dat;
DS_DATA = (bit)(temp&0x01);
dat >>= 1;
DS_SCLK = 1;
}
DS_CE = 0;
}
/*********************************************
FunctionName: Read1302
FunctionInfo: DS1302时钟读数据
Input: addr
Output: dat1
注: 控制字总是从最低位开始输出.在控制字指令输入后的下一个SCLK时钟的上升沿时,
数据被写入DS1302,数据输入从最低位(0位)开始
**********************************************/
uchar Read1302 (uchar addr)
{
uchar i,temp,dat1,dat2;
uchar temp1; //后来加的代替demo里的ACC位寻址
DS_CE = 0;
DS_SCLK=0;
DS_CE = 1;
for ( i=8; i>0; i-- ) //发送地址
{
DS_SCLK = 0;
temp = addr;
DS_DATA = (bit)(temp&0x01); //每次传输低字节
addr >>= 1; //右移一位
DS_SCLK = 1;
}
for ( i=8; i>0; i-- ) //读取数据
{
temp1 =DS_DATA;
DS_SCLK = 1;
temp1>>=1;
DS_SCLK = 0;
}
DS_CE = 0;
dat1 = temp1;
dat2 = dat1/16; //数据进制转换
dat1 = dat1%16; //十六进制转十进制
dat1 = dat1+dat2*10;
return (dat1);
}
/*********************************************
FunctionName: Init1302
FunctionInfo: 初始化DS1302
Input: no
Output: no
注:
**********************************************/
void init1302(void)
{
Write1302 (WRITE_PROTECT,0X00); //禁止写保护
Write1302 (WRITE_SECOND, 0x56); //秒位初始化
Write1302 (WRITE_MINUTE, 0x34); //分钟初始化
Write1302 (WRITE_HOUR, 0x12); //小时初始化
Write1302 (WRITE_PROTECT,0x80); //允许写保护
}
//测试函数
void read_1302_timer(void)
{
uchar tab[2]={0,0};
lcdWriteCom(0x01); //显示清屏
uchar second,minute,hour,day,moth,year;
second = Read1302(READ_SECOND);
tab[0] = second / 10;
tab[1] = second % 10;
lcd1602_whereDisplay(1,0,tab[0]);
lcd1602_whereDisplay(1,1,tab[1]);
CLRWDT();
lcd1602_whereDisplay(1,2," ");
}
|
@xyz549040622 :三只控制脚上都上拉了
这个模块I2C上应该是没有上拉电阻的吧,记住,一定要上拉。