完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
#include
#include"DS1302.h" ***it P1_0=P1^0; ***it P1_1=P1^1; ***it P1_2=P1^2; ***it P1_3=P1^3; ***it LS138A=P2^2; ***it LS138B=P2^3; ***it LS138C=P2^4; unsigned char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; unsigned char LedOut[10]; void delay(unsigned char xms) { unsigned int i,j; for(i=xms;i>0;i--) for(j=100;j>0;j--); } unsigned key_shijian(unsigned char n,unsigned char x,unsigned y) { if(P1_0==0) { delay(50); if(P1_0==0) { n++; if(n==x) { n=0; while(P1_0==0); } } } if(P1_1==0) { delay(50); if(P1_1==0) { if(n==0) { n=y; } else n--; while(P1_1==0); } } return n; } void display(uchar x1,uchar x2,uchar x3,uchar x4,uchar x5,uchar x6) { unsigned int i; LedOut[0]=tab[x1]; LedOut[1]=tab[x2]; LedOut[2]=~0xbf; LedOut[3]=tab[x3]; LedOut[4]=tab[x4]; LedOut[5]=~0xbf; LedOut[6]=tab[x5]; LedOut[7]=tab[x6]; for(i=0;i<8;i++) { P0=LedOut[i]; switch(i) { case 0:LS138A=1; LS138B=1; LS138C=1; break; case 1:LS138A=0; LS138B=1; LS138C=1; break; case 2:LS138A=1; LS138B=0; LS138C=1; break; case 3:LS138A=0; LS138B=0; LS138C=1; break; case 4:LS138A=1; LS138B=1; LS138C=0; break; case 5:LS138A=0; LS138B=1; LS138C=0; break; case 6:LS138A=1; LS138B=0; LS138C=0; break; case 7:LS138A=0; LS138B=0; LS138C=0; break; } delay(1); } } main() { uchar falg; Init_DS1302(); while(1) { get_time(); time[0]=second%10; time[1]=second/10; time[2]=minute%10; time[3]=minute/10; time[4]=hour%10; time[5]=hour/10; if(P1_2==0) { delay(50); if(P1_2==0) { falg++; if(falg==4) falg=0; } } switch(falg) { case 0: display(time[0],time[1],time[2],time[3],time[4],time[5]);break; case 1: second=key_shijian(second,60,59); Set_time(0x80,second); display(time[4],time[5],10,10,10,10) ;break; case 2: minute=key_shijian(minute,60,59); Set_time(0x82,minute); display(10,10,time[2],time[3],10,10) ;break; case 3: hour=key_shijian(hour,24,23); Set_time(0x84,hour); display(10,10,10,10,time[0],time[1]);break; } } } #ifndef DS1302_H_ #define DS1302_H_ #include #include #include ***it SCLK=P3^6; //位定义1302芯片的接口,时钟输出端口定义在P1.0引脚 ***it DATA=P3^4; //位定义1302芯片的接口,数据输出端定义在P1.1引脚 ***it RST=P3^5; //位定义1302芯片的接口,复位端口定义在P1.2引脚 #define uchar unsigned char #define uint unsigned int uchar data time[8]; uchar second,minute,hour, ReadValue; /***************************************************** 函数功能:延时若干微秒 入口参数:n ***************************************************/ void delaynus(uchar n) { unsigned char i; for(i=0;i /***************************************************** 函数功能:向1302写一个字节数据 入口参数:x ***************************************************/ void Write1302(uchar dat) { unsigned char i; SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备 delaynus(2); //稍微等待,使硬件做好准备 for(i=0;i<8;i++) //连续写8个二进制位数据 { DATA=dat&0x01; //取出dat的第0位数据写入1302 低位在前,高位在后 delaynus(2); //稍微等待,使硬件做好准备 SCLK=1; //上升沿写入数据 delaynus(2); //稍微等待,使硬件做好准备 SCLK=0; //重新拉低SCLK,形成脉冲 dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位 } } /***************************************************** 函数功能:根据命令字,向1302写一个字节数据 入口参数:Cmd,储存命令字;dat,储存待写的数据 ***************************************************/ void WriteSet1302(uchar Cmd,uchar dat) { RST=0; //禁止数据传递 SCLK=0; //确保写数居前SCLK被拉低 RST=1; //启动数据传输 delaynus(2); //稍微等待,使硬件做好准备 Write1302(Cmd); //写入命令字 Write1302(dat); //写数据 SCLK=1; //将时钟电平置于高电平状态 RST=0; //禁止数据传递 } /***************************************************** 函数功能:从1302读一个字节数据 入口参数:x ***************************************************/ unsigned char Read1302(void) { unsigned char i,dat; delaynus(2); //稍微等待,使硬件做好准备 for(i=0;i<8;i++) //连续读8个二进制位数据 { dat>>=1; if(DATA==1) //如果读出的数据是1 dat|=0x80; //将1取出,写在dat的最高位 SCLK=1; //将SCLK置于高电平,为下降沿读出 delaynus(2); //稍微等待 SCLK=0; //拉低SCLK,形成脉冲下降沿 delaynus(2); //稍微等待 } return dat; //将读出的数据返回 } /***************************************************** 函数功能:根据命令字,从1302读取一个字节数据 入口参数:Cmd ***************************************************/ unsigned char ReadSet1302(uchar Cmd) { unsigned char dat; RST=0; //拉低RST SCLK=0; //确保写数居前SCLK被拉低 RST=1; //启动数据传输 Write1302(Cmd); //写入命令字 dat=Read1302(); //读出数据 SCLK=1; //将时钟电平置于已知状态 RST=0; //禁止数据传递 return dat; //将读出的数据返回 } /***************************************************** 函数功能: 1302进行初始化设置 ***************************************************/ void Init_DS1302(void) { unsigned char flag; flag= ReadSet1302(0x81); if(flag&0x80) { //判断时钟芯片是否关闭 WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令 WriteSet1302(0x80,((50/10)<<4|(50%10))); //根据写秒寄存器命令字,写入秒的初始值 WriteSet1302(0x82,((3/10)<<4|(3%10))); //根据写分寄存器命令字,写入分的初始值 WriteSet1302(0x84,((13/10)<<4|(13%10))); //根据写小时寄存器命令字,写入小时的初始值 WriteSet1302(0x90,0xa5); //打开充电功能 选择2K电阻充电方式 WriteSet1302(0x8E,0x80); //根据写状态寄存器命令字,写入保护指令 } } //如果不想每次都初始化时间,也就是掉电后还想让时钟继续走时的话 就用上面的语句 void get_time() { ReadValue = ReadSet1302(0x80); //从秒寄存器读数据 second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//将读出数据转化 ReadValue = ReadSet1302(0x82); //从分寄存器读 minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化 ReadValue = ReadSet1302(0x84); //从分寄存器读 hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化 } void Set_time(uchar adress,uchar dat) { WriteSet1302(0x8e,0x00); WriteSet1302(adress,((dat/10)<<4|(dat%10))); WriteSet1302(0x8e,0x10); } #endif |
|
相关推荐
4 个讨论
|
|
|
void get_time()
{ ReadValue = ReadSet1302(0x80); //从秒寄存器读数据 second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//将读出数据转化 ReadValue = ReadSet1302(0x82); //从分寄存器读 minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化 ReadValue = ReadSet1302(0x84); //从分寄存器读 hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化 } 中ReadValue&0x70 你把数据清理了,然后位移在*10 还是0啊 |
|
|
|
|
|
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
【瑞萨RA6E2】瑞萨E2S软件安装过程,等待过程玩下97_e2 studio_ZGZZ
331 浏览 0 评论
532 浏览 0 评论
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
842 浏览 0 评论
1383 浏览 2 评论
824 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16919 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-3 19:19 , Processed in 0.700766 second(s), Total 56, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1319