按键可调ds1302时钟显示_第1页
按键可调ds1302时钟显示_第2页
按键可调ds1302时钟显示_第3页
按键可调ds1302时钟显示_第4页
按键可调ds1302时钟显示_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上按键可调ds1302时钟显示 (亲测可用)* 实验说明:本例程为四键控制时钟,k1键按下后进入时钟的调整状态,k2按下时钟上 * k3按下时钟下调,调好设定的时钟后按下k4时钟进入走时状态 * */#include #include sbit SCK=P36;/时钟sbit SDA=P34;/数据sbit RST = P35;/ DS1302复位sbit k1=P10; /sbit k2=P11;sbit k3=P12;sbit k4=P13;sbit LS138A=P22; /sbit LS138B=P23;sbit LS138C=P24; bit ReadRTC_

2、Flag;/定义读DS1302标志bit mie;unsigned char x,t1,xuan,shan;unsigned char l_tmpdate7;unsigned char l_tmpdisplay8;code unsigned char write_rtc_address7=0x80,0x82,0x84,0x86,0x88,0x8a,0x8c; /秒分时日月周年 最低位读写位code unsigned char read_rtc_address7=0x81,0x83,0x85,0x87,0x89,0x8b,0x8d; code unsigned char table=0x3f,0

3、x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00; /共阴数码管 0-9 - 熄灭表/*/* 函数声明 */*/void Write_Ds1302_byte(unsigned char temp); void Write_Ds1302( unsigned char address,unsigned char dat );unsigned char Read_Ds1302 ( unsigned char address );void Read_RTC(void);/read RTC void Set_RTC(void); /set RTC

4、 void InitTIMER0(void);/inital timer0void tiao_time(); /时间调整unsigned char key(); /按键函数void shanshuo(); / 闪烁函数/*/* 主函数 */*/void main(void) InitTIMER0(); /初始化定时器0 /Set_RTC(); /写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽while(1) if(ReadRTC_Flag) ReadRTC_Flag=0; tiao_time(); if(x=0) Read_RTC(); /l_tmpdisplay0=l

5、_tmpdate2/16;/数据的转换,因我们采用数码管09的显示,将数据分开l_tmpdisplay1=l_tmpdate2&0x0f;l_tmpdisplay2=10; /加入-l_tmpdisplay3=l_tmpdate1/16;l_tmpdisplay4=l_tmpdate1&0x0f;l_tmpdisplay5=10;l_tmpdisplay6=l_tmpdate0/16;l_tmpdisplay7=l_tmpdate0&0x0f; if(shan=1) /进入调整状态后闪烁 shanshuo(); /调用闪烁函数 if(mie=1) /闪烁就是亮灭相间 switch(xuan)

6、/判断哪位闪烁case 1:l_tmpdisplay7=11,l_tmpdisplay6=11;break; case 2:l_tmpdisplay4=11,l_tmpdisplay3=11;break;case 3:l_tmpdisplay1=11,l_tmpdisplay0=11;break; /*/* 时间调整函数 */*/void tiao_time() unsigned char miao,fen,shi,y; switch(key()/判断哪个键按下 case 1: x=1;y+;xuan+;/k1按下后进入调整状态并且计数应该调整哪位 if(y2) y=2; if(y=1) Re

7、ad_RTC(); if(xuan3) xuan=1; miao=l_tmpdate0; shan=1; break; /调整时该位闪烁case 2: /k2按下为时钟上调 switch(xuan) /判断调整哪位 case 1: /按k1一次调秒 miao+; if(miao%16)=10) miao=miao+6;/由于显示处理时是以十六进制处理而miao+是十进制需要出来才能正常显示 if(miao=96) miao=0;/加到59后重为0 l_tmpdate0=miao; break;case 2: /按k1两次调分 fen+; if(fen%16)=10) fen=fen+6; if

8、(fen=96) fen=0; l_tmpdate1=fen; break;case 3: /按k1三次调时 shi+; if(shi%16)=10) shi=shi+6; if(shi=36) shi=0; /加到23重为0 l_tmpdate2=shi; break; break; case 3: /按下k3时钟下调 switch(xuan) case 1: /调秒 miao-; if(miao%16)=10) miao=miao-6; if(miao=0) miao=89; /减到0后重为59 l_tmpdate0=miao; break; case 2:/调分 fen-; if(fen

9、%16)=10) fen=fen-6; if(fen=0) fen=89; l_tmpdate1=fen; break; case 3:/调时 shi-; if(shi%16)=10) shi=shi-6; if(shi=0) shi=30; /减到0重为23 l_tmpdate2=shi; break; break; case 4: /k4键按下时钟进入走时状态 miao=miao-miao/16*6; /由于时钟在显示的时候时间经过十六进制处理而时钟的设定是十进制处理所以需要数据转换 l_tmpdate0=miao; fen=fen-fen/16*6; l_tmpdate1=fen; sh

10、i=shi-shi/16*6; l_tmpdate2=shi; Set_RTC(); /把设置的数据压到ds1302中 x=0;y=0;shan=0;xuan=0; break; /*/* 闪烁函数 */*/void shanshuo()for(t1=0;t1=200;t1+);mie=mie;/*/* 按键函数 */*/unsigned char key() unsigned char keyzhi; P1=0xff; if(P1!=0xff) /有键按下 if(k1=0) keyzhi=1; /判断哪个键按下 if(k2=0) keyzhi=2; if(k3=0) keyzhi=3; if

11、(k4=0) keyzhi=4; else keyzhi=0; /没键按下返回为0 while(P1!=0xff); /判断按键是否释放 return keyzhi; /返回keyzhi的值/*/* 定时器0初始化 */*/void InitTIMER0(void) TMOD|=0x01;/定时器设置 16位 TH0=0xef;TL0=0xf0; ET0=1; TR0=1; EA=1;/*/* 写一个字节 */*/void Write_Ds1302_Byte(unsigned char temp) unsigned char i; for (i=0;i=1; /右移一位 SCK=1; /*/*

12、 写入DS1302 */*/void Write_Ds1302( unsigned char address,unsigned char dat ) RST=0;_nop_(); SCK=0;_nop_(); RST=1; _nop_(); /启动 Write_Ds1302_Byte(address);/发送地址 Write_Ds1302_Byte(dat);/发送数据 RST=0; /恢复/*/* 读出DS1302数据 */*/unsigned char Read_Ds1302 ( unsigned char address ) unsigned char i,temp=0x00; RST=

13、0;_nop_();_nop_(); SCK=0;_nop_();_nop_(); RST=1;_nop_();_nop_(); Write_Ds1302_Byte(address); for (i=0;i=1;/右移一位_nop_(); _nop_(); _nop_(); SCK=1; RST=0;_nop_(); /以下为DS1302复位的稳定时间 _nop_();RST=0;SCK=0;_nop_();_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SDA=1;_nop_();_nop_();retu

14、rn (temp);/返回/*/* 读时钟数据 */*/void Read_RTC(void) /读取 日历 unsigned char i,*p; p=read_rtc_address; /地址传递 for(i=0;i7;i+) /分7次读取 秒分时日月周年 l_tmpdatei=Read_Ds1302(*p); p+; /*/* 设定时钟数据 */*/void Set_RTC(void) /设定 日历unsigned char i,*p,tmp;for(i=0;i7;i+) /BCD处理tmp=l_tmpdatei/10;l_tmpdatei=l_tmpdatei%10;l_tmpdate

15、i=l_tmpdatei+tmp*16; Write_Ds1302(0x8E,0X00); p=write_rtc_address;/传地址 for(i=0;i7;i+)/7次写入 秒分时日月周年 Write_Ds1302(*p,l_tmpdatei); p+; Write_Ds1302(0x8E,0x80);/*/* 定时器中断函数 */*/void tim(void) interrupt 1 using 1 /中断,用于数码管扫描 static unsigned char i,num; TH0=0xf5; TL0=0xe0; P0=tablel_tmpdisplayi;/查表法得到要显示数字的数码段 switch(i) case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; case 4:LS138A=0; LS138

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论