完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
之前一直有在问DS1302的问题,这几天又想到一个问题。先上整个程序
#include #define uchar unsigned char #define uint unsigned int ***it DU=P2^6; ***it WE=P2^7; ***it IO=P2^0; ***it CLK=P2^1; ***it RST=P2^4; uchar code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管断码表 uchar second,minute,hour; void delay(void) { uchar i,j; for(j=1;j>0;j--) for(i=110;i>0;i--) ; } void input(uchar byte)//写一个字节 { uchar i; for(i=8;i>0;i--) { IO=byte&0x01; CLK=1; CLK=0; byte>>=1; } } uchar output(void)//读一个字节 { uchar i,dat=0; for(i=8;i>0;i--) { dat>>=1; if(IO)dat|=0x80; CLK=1; CLK=0; } return (dat); } void write(uchar addr,uchar dat)//在特定地址写数据 { CLK=0; RST=0; RST=1; input(addr); input(dat); CLK=1; RST=0; } uchar read(uchar addr)//从特定地址读数据 { uchar dat; RST=0; CLK=0; RST=1; input(addr); dat=output(); CLK=1; RST=0; return(dat); } void init()//初始化时间,我想显示12点30分0秒 { write(0x8e,0x00);//写保护 write(0x80,0x00);//秒 钟从0开始 write(0x82,0x30);//分钟设为30 write(0x84,0x12);//时钟设为12 } void read_time()//读时间 { second=read(0x81); minute=read(0x83); hour=read(0x85); } void display()//显示程序 { WE=1; P0=0xfe; WE=0; DU=1; P0=tab[hour/16];//时钟十位 DU=0; delay(); WE=1; P0=0xfd; WE=0; DU=1; P0=tab[hour%16];//时钟各位 DU=0; delay(); WE=1; P0=0xfb; WE=0; DU=1; P0=tab[minute/16]; DU=0; delay(); WE=1; P0=0xf7; WE=0; DU=1; P0=tab[minute%16]; DU=0; delay(); WE=1; P0=0xef; WE=0; DU=1; P0=tab[second/16]; DU=0; delay(); WE=1; P0=0xdf; WE=0; DU=1; P0=tab[second%16]; DU=0; delay(); } main() { init(); while(1) { read_time(); display(); } } 问题是这样的,我想显示12点30分0秒,原本的程序是在相应的寄存器用16进制初始化,比如0x00,0x30,0x12。但我一开始不知道问什么16进制也可以写成10进制的形式“12:30:00“,毕竟10进制好理解些,我就尝试把对应的寄存器用十进制去初始化,然后在显示程序display中分别改成hour/10 hour%10 minute/10 minute%10 second/10 second%10 但这样结果是开发板上电初始化的一瞬间数码管显示是正确的,但是接下来就不正确 了,秒开始乱跳,越到后来都乱跳了,想问下为什么不能用十进制去初始化? |
|
相关推荐
2个回答
|
|
DS1302寄存器里的时间数据是BCD形式,16进制表示的十进制数,所以如果你写入的数据是十进制的话,一定要先进行BCD处理,转成16进制,这样1302才认的出来。。很多数字芯片都要注意这种问题
|
|
|
|
我直接这样初始化
//时间参数初始化 Time_InitStructure.year = 0x13;//年 Time_InitStructure.month = 0x10;//月 Time_InitStructure.date = 0x07;//日 Time_InitStructure.week = 0x01;//星期 Time_InitStructure.hour = 0x20;//小时 Time_InitStructure.minute = 0x00;//分钟 Time_InitStructure.second = 0x00;//00秒,并启动时钟 DS1302_Init(&Time_InitStructure);//初始化时间参数 读取时间出来之后转换一下即可 /***********读取时间信息**********/ DS1302_GetTime();//获取DS1302时间日历数据 /***********时间信息转换为ASCII码可视字符**********/ Display_Time[7] = (TimeValue.second>>4)+48; Display_Time[8] = (TimeValue.second&0x0f)+48;//Second Display_Time[4] = (TimeValue.minute>>4)+48; Display_Time[5] = (TimeValue.minute&0x0f)+48;//Minute Display_Time[1] = (TimeValue.hour>>4)+48; Display_Time[2] = (TimeValue.hour&0x0f)+48;//Hour Display_Date[9] = (TimeValue.date>>4)+48; Display_Date[10] = (TimeValue.date&0x0f)+48;//Date Display_Date[6] = (TimeValue.month>>4)+48; Display_Date[7] = (TimeValue.month&0x0f)+48;//Month Display_Date[3] = (TimeValue.year>>4)+48; Display_Date[4] = (TimeValue.year&0x0f)+48;//Year if(TimeValue.week == 0x00) {Display_Date[13] = 0x37;}//week else {Display_Date[13] = (TimeValue.week&0x0f)+48;} |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 04:31 , Processed in 1.126010 second(s), Total 81, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号