欢迎分享,转载请注明来源:内存溢出
这个是简单的数码管时钟显示如果有需要贺戚,我写过比较完善的1602显示时钟.显示控制年月日等等.#include\x0d\x0asbit Begin=P2^0\x0d\x0asbit Hour=P2^1\x0d\x0asbit Mus=P2^2\x0d\x0asbit End=P2^3\x0d\x0aunsigned char code Tab[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,\x0d\x0a0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40}\x0d\x0aunsigned char code num[]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}\x0d\x0aunsigned char Time[]={0,0,16,0,0,16,0,0}\x0d\x0aunsigned char a\x0d\x0aunsigned int x,m,th\x0d\x0avoid init()\x0d\x0a{\x0d\x0a TMOD=0x01\x0d\x0a TH0=(65535/50000)/256\x0d\x0a TL0=(65535/50000)%256\x0d\x0a EA=1\x0d\x0a ET0=1\x0d\x0a TR0=1\x0d\x0a}\x0d\x0avoid delay(unsigned int z) \x0d\x0a{ \x0d\x0a unsigned int x,y\x0d\x0a for(x=zx>0x--)\x0d\x0a for(y=110y>0y--)\x0d\x0a}\x0d\x0aunsigned char keyboard()\x0d\x0a{\x0d\x0a if(Begin==0){\x0d\x0a delay(5)\x0d\x0a if(Begin==0)\x0d\x0a return 1\x0d\x0a }\x0d\x0a if(Hour==0){\x0d\x0a delay(30)\x0d\x0a if(Hour==0)\x0d\x0a return 2\x0d\x0a }\x0d\x0a if(Mus==0)\x0d\x0a return 3\x0d\x0a if(End==0)\x0d\x0a return 4\x0d\x0a}\x0d\x0avoid display()\x0d\x0a{\x0d\x0a unsigned char i for(i=0i=20)\x0d\x0a {\x0d\x0a x++\x0d\x0a m=x\x0d\x0a th=m/3600/判悉/设置禅冲陵小时\x0d\x0a Time[0]=th/10\x0d\x0a Time[1]=th%10\x0d\x0a m=m%3600 Time[2]=16 th=m/60//设置分钟\x0d\x0a Time[3]=th/10\x0d\x0a Time[4]=th%10\x0d\x0a m=m%60 Time[5]=16 th=m//设置秒\x0d\x0a Time[6]=th/10\x0d\x0a Time[7]=th%10 a=0\x0d\x0a }\x0d\x0a}#include <reg51.h>#include <intrins.h>sbit SCL2=P1^3//SCL2定义为P1口的第3位脚,连接DS1302SCL和ADC0831SCL脚 sbit SDA2=P1^4//SDA2定义族缓拦为P1口的第4位脚,连接DS1302SCL和ADC0831SDA脚 //sbit CS2=P1^6//CS2定义为P1口的第4位脚,连接ADC0831CS脚 sbit RST = P1^5// DS1302片选脚 unsigned char l_tmpdate[8]={0x00,0x06,0x03,0x18,0x0c,0x07,0x06,0}unsigned char l_tmpdisplay[8]={0x40,0x40,0x40,0x40,0x40,0x40,0x40,0}code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}//地址为:秒分小时月日年 code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}code unsigned char table[]= {0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f, 0x40,0x00} //共阴数码管 0-9 '-' '熄灭‘表 void delay()//延时子函数,5个空指令 void display(unsigned char *lp,unsigned char lc)//数字的显示函数;lp为指向数组的地址,lc为显示的个数 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 void main(void) //入口函数 { Set_RTC()while(1){ Read_RTC()switch (l_tmpdate[0]/5) //设计每个5秒 交替显示 年月日 时分秒 { case 0: case 2: case 4: case 6: case 8: case 10: l_tmpdisplay[0]=l_tmpdate[2]/16//数据的转换,因我们采用数码管0~9的显示,将数据分开 l_tmpdisplay[1]=l_tmpdate[2]&0x0fl_tmpdisplay[2]=10//加入哪弯"-" l_tmpdisplay[3]=l_tmpdate[1]/16l_tmpdisplay[4]=l_tmpdate[1]&0x0fl_tmpdisplay[5]=10l_tmpdisplay[6]=l_tmpdate[0]/16l_tmpdisplay[7]=l_tmpdate[0]&0x0f breakcase 1: case 3: case 5: case 7: case 9: case 11: l_tmpdisplay[0]=l_tmpdate[6]/16l_tmpdisplay[1]=l_tmpdate[6]&0x0fl_tmpdisplay[2]=10l_tmpdisplay[3]=l_tmpdate[4]/16l_tmpdisplay[4]=l_tmpdate[4]&0x0fl_tmpdisplay[5]=10l_tmpdisplay[6]=l_tmpdate[3]/16l_tmpdisplay[7]=l_tmpdate[3]&0x0fbreakdefault: break} display(l_tmpdisplay,8)} } void display(unsigned char *lp,unsigned char lc)//显示 { unsigned char i//定义变量 P2=0//端兆胡口2为输出 P1=P1&0xF8//将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管 for(i=0i<lci++){ //循环显示 P2=table[lp[i]]//查表法得到要显示数字的数码段 delay()//延时 P2=0//清0端口,准备显示下位 if(i==7) //检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据 break P1++//下一位数码管 } } void delay(void) //空5个指令 { unsigned char i=10while(i) i--} void Write_Ds1302_Byte(unsigned char temp) { unsigned char ifor (i=0i<8i++) //循环8次 写入数据 { SCL2=0SDA2=temp&0x01//每次传输低字节 temp>>=1//右移一位 SCL2=1} } /****************************************************************************/ void Write_Ds1302( unsigned char address,unsigned char dat ) { RST=0_nop_()SCL2=0_nop_()RST=1 _nop_()//启动 Write_Ds1302_Byte(address)//发送地址 Write_Ds1302_Byte(dat)//发送数据 RST=0//恢复 } /****************************************************************************/ unsigned char Read_Ds1302 ( unsigned char address ) { unsigned char i,temp=0x00RST=0_nop_()SCL2=0_nop_()RST=1_nop_()Write_Ds1302_Byte(address)for (i=0i<8i++) //循环8次 读取数据 { if(SDA2) temp|=0x80//每次传输低字节 SCL2=0temp>>=1//右移一位 SCL2=1} RST=0_nop_()//以下为DS1302复位的稳定时间 RST=0SCL2=0_nop_()SCL2=1_nop_()SDA2=0_nop_()SDA2=1_nop_()return (temp)//返回 } /****************************************************************************/ void Read_RTC(void) //读取 日历 { unsigned char i,*pp=read_rtc_address//地址传递 for(i=0i<7i++) //分7次读取 年月日时分秒星期 { l_tmpdate[i]=Read_Ds1302(*p)p++} } /***********************************************************************/ void Set_RTC(void) //设定 日历 { unsigned char i,*p,tmpfor(i=0i<7i++){ tmp=l_tmpdate[i]/10l_tmpdate[i]=l_tmpdate[i]%10l_tmpdate[i]=l_tmpdate[i]+tmp*16} Write_Ds1302(0x8E,0X00) p=write_rtc_address//传地址 for(i=0i<7i++) //7次写入 年月日时分秒星期 { Write_Ds1302(*p,l_tmpdate[i])p++ } Write_Ds1302(0x8E,0x80)} 希望对你有所帮助 本程序采用外元件DS1302
赞
(0)
打赏
微信扫一扫
支付宝扫一扫
惠普hp psc 1318一体机打印机驱动在win7下安装失败的解决办法
上一篇
2023-05-25
怎么监听小程序被销毁
下一篇
2023-05-25
评论列表(0条)