OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5462|回复: 2

DS1302的显示问题

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-4-20
在线时间
1 小时
发表于 2014-4-24 15:02:21 | 显示全部楼层 |阅读模式
[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]
求指导!
我要变大神!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-4-24 20:21:10 | 显示全部楼层
你的时序好像有点问题
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-4-20
在线时间
1 小时
 楼主| 发表于 2014-4-26 00:29:10 | 显示全部楼层
那块的时序有问题,求赐教
我要变大神!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-10 08:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表