[mw_shl_code=c,true]这个代码读出来的数据是0xFF.[/mw_shl_code]
[mw_shl_code=c,true]#include "ds1302.h"
#include "stdio.h"
#include "delay.h"
#include "12864.h"
#include "key.h"
uint8_t read[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//读秒、分、时、日、月、周、年的寄存器地址
uint8_t write[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写秒、分、时、日、月、周、年的寄存器地址
int Inittime[]={0,0,9,22,4,2,14};//初始时间:2014年4月22日,周二,早上9:00,
/*PA1.2为输出*/
/*PA3配置为开漏模式,此模式下能够实现真正的双向IO口*/
void ds1302_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PA端口时钟模块
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = ds1302clk|ds1302rst;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStruct.GPIO_Pin = ds1302dat;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void write_1302byte(uint8_t dat)//写一个字节的数据sck上升沿写数据
{
uint8_t i=0;
GPIO_ResetBits(GPIOA,ds1302clk); //clk=0
delay_us(2);//延时大约2us
for(i=0;i<8;i++)
{
GPIO_ResetBits(GPIOA,ds1302clk);//ds1302clk=0;
if(dat&0x01)
GPIO_SetBits(GPIOA,ds1302dat);
else
GPIO_ResetBits(GPIOA,ds1302dat);//ds1302dat=(dat&0x01);
delay_us(2);
GPIO_SetBits(GPIOA,ds1302clk);
//ds1302clk=1;
dat>>=1;
delay_us(2);
}
}
uint8_t read_1302(uint8_t add)//读数据
{
uint8_t i=0,dat1=0x00;
GPIO_ResetBits(GPIOA,ds1302rst);
GPIO_ResetBits(GPIOA,ds1302clk);
//ds1302rst=0;
//ds1302clk=0;
delay_us(2);//略微延时2us
GPIO_SetBits(GPIOA,ds1302rst);
//ds1302rst=1;
//delay_us(2);//时间要大约3us
write_1302byte(add);//先写寄存器的地址
for(i=0;i<8;i++)
{
GPIO_SetBits(GPIOA,ds1302clk);
//ds1302clk=1;
dat1>>=1;
delay_us(2);
GPIO_ResetBits(GPIOA,ds1302clk);
//ds1302clk=0;//拉低时钟线,以便于数据的读入
if(GPIO_ReadInputDataBit(GPIOA,ds1302dat)==1)//数据线此时为高电平
{dat1=dat1|0x80;}
}
delay_us(2);
GPIO_ResetBits(GPIOA,ds1302rst);
//ds1302rst=0;
return dat1;
}
void write_1302(uint8_t add,uint8_t dat)//向指定寄存器写入一个字节的数据
{
GPIO_ResetBits(GPIOA,ds1302rst);
GPIO_ResetBits(GPIOA,ds1302clk);
//ds1302rst=0;
//ds1302clk=0;
delay_us(2);//略微延时
GPIO_SetBits(GPIOA,ds1302rst);
//ds1302rst=1;
delay_us(2);//时间大约2us
write_1302byte(add);
write_1302byte(dat);
GPIO_ResetBits(GPIOA,ds1302rst);
GPIO_ResetBits(GPIOA,ds1302clk);
//ds1302clk=0;
//ds1302rst=0;
delay_us(2);
}
void ds1302_init(uint8_t *write,uint8_t *time)//初始化1302
{
uint8_t i=0,j=0;
write_1302(0x8e,0x00);//去除写保护
for(i=0;i<7;i++)//转BCD码
{
j=time%10;//个位数部分
time=(time/10)*16+j;
}
for(i=0;i<7;i++)//进行对时
{
write_1302(write,time);
}
write_1302(0x8e,0x80);//加写保护
}
void ds1302_data(uint8_t *read)//处理数据
{
uint8_t i=0,j=0,g[7],time[7];
int date[7];
for(i=0;i<7;i++)
{
time=read_1302(read);
}//读数据已经完成
for(i=0;i<7;i++)
{
g=time%16;//秒个位数据
time=time/16;//秒十位数据
date=g+time*10;
}
//此时已转换成10进制数,g里面存放的是秒分时日月周年的个位数
//而此时的time【i】里面存放的则是秒分时日月周年的十位数据
for(j=0;j<7;j++)
{
LCD_ShowInt(1,j,date[j]);
}
}[/mw_shl_code]
求指导! |