这个只是读取出时间,其它功能没有写出来,用了四位共阴数码管显示。
小数点闪烁 第3位数码管倒置显示小数点与第二位数码管一起显示“:”,1秒闪烁一次
仿真用了4个一位的数码管和一个四位的数码管,如果用一个四位的数码管,可以修改程序把第三位的
小数点去掉
附件里面有源代码与仿真文件:
时钟.rar
(114.65 KB)
(下载次数: 89, 2016-10-26 16:57 上传)
下载积分: 黑币 -5
代码:
- //这个只是读取出时间,其它功能没有写出来,用了四位共阴数码管显示。
- // 小数点闪烁 第3位数码管倒置显示小数点
- // 与第二位数码管一起显示“:”,1秒闪烁一次
- //仿真用了4个一位的数码管和一个四位的数码管
- /**********************************
- * DS1302简单时间显示 *
- * 数码管显示 *
- ***********************************/
- #include <reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define W P2 //位选
- #define D P0 //段选
- sbit dio=P1^1; //数据口
- sbit sclk=P1^0; //控制数据时钟
- sbit RST=P1^2; //使能端、复位端
- /************按键引脚定义***********/
- sbit s1=P3^0; //按键 加
- sbit s2=P3^1; //按键 减
- sbit s3=P3^2; //按键 选择
- char knum=0,snum,fnum;
- /***********写时分秒地址************/
- #define write_shi 0x84
- #define write_fen 0x82
- #define write_miao 0x80
- /***********读时分秒地址************/
- #define read_shi 0x85
- #define read_fen 0x83
- #define read_miao 0x81
- char shi,fen,miao; //读出数据存储变量
- //uchar d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}; //不带小数点
- //uchar dd[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点
- // 0 1 2 3 4 5 6 7 8 9 10 11
- uchar code d[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40,0x00}; //共阴不带小数点
- uchar code dd[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};// 共阴带小数点
- void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.
- { //delay(500);大约延时500ms.
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_1302(uchar add,dat) //写函数 qx
- {
- uchar i,temp;
- temp=add;
- RST=0;
- _nop_();
- sclk=0;
- _nop_();
- RST=1;
- _nop_();
- for(i=0;i<8;i++)
- {
- sclk=0;
- _nop_();
- if((temp&0x01)==0x01)
- dio=1;
- else
- dio=0;
- temp>>=1;
- sclk=1;
- _nop_();
- }
- temp=dat;
- for(i=0;i<8;i++)
- {
- sclk=0;
- _nop_();
- if((temp&0x01)==0x01)
- dio=1;
- else
- dio=0;
- temp>>=1;
- sclk=1;
- _nop_();
- }
- RST=0;
- sclk=0;
- }
- uchar read_1302(uchar add) //读函数 qx
- {
- uchar dat,dat1,i,temp;
- temp=add;
- RST=0;
- _nop_();
- sclk=0;
- _nop_();
- RST=1;
- for(i=0;i<8;i++)
- {
- sclk=0;
- _nop_();
- if((temp&0x01)==0x01)
- dio=1;
- else
- dio=0;
- temp>>=1;
- sclk=1;
- _nop_();
- }
- for(i=0;i<8;i++)
- {
- sclk=0;
- _nop_();
- if(dio)
- dat|=0x80;
- if(i<7)
- dat>>=1;
- sclk=1;
- }
- dat1=dat/16;
- dat=dat%16;
- dat=dat1*10+dat;
- RST=0;
- sclk=0;
- return dat;
- }
- void init_1302() //初始化函数 设置时间
- {
- write_1302(0x8e,0x00); //保护取消,可以进行读写操作
- write_1302(write_miao,0x56);
- write_1302(write_fen,0x49);
- write_1302(write_shi,0x14);
- write_1302(0x8e,0x80); //保护启动,不能进行读写操作
- }
- void display(uchar shi,uchar fen,uchar miao) //显示函数
- {
- if(knum==0)
- {
- snum=30;
- fnum=30;
- }
- if(knum==1)
- {
- fnum++;
- snum=30;
- }
- if(knum==2)
- {
- snum++;
- fnum=30;
- }
-
- if(snum>=30)
- {
- P2=0x01; //位选
- P0=d[shi/10]; //段选
- delay(5);
- P0=0X00;
- //位选
- //消隐
- if(miao%2==0) //小数点闪烁
- {
- P2=0x02;
- P0=dd[shi%10];
- delay(5);
- P0=0X00;
- //消隐
- }
- else
- {
- P2=0x02;
- P0=d[shi%10];
- delay(5);
- P0=0X00;
- //消?
- }
- if(snum==60)
- snum=0;
- }
- if(fnum>=30)
- {
-
- if(miao%2==0) //小数点闪烁 第3位数码管倒置显示小数点
- //与第二位数码管一起显示“:”,1秒闪烁一次
- {
- P2=0x04;
- P0=dd[fen/10];
- delay(5);
- P0=0X00;
- } //消隐
- else
- {
- P2=0x04;
- P0=d[fen/10];
- delay(5);
- P0=0X00;
-
- }
- P2=0x08;
- P0=d[fen%10];
- delay(5);
- P0=0X00;
- //消隐
- if(fnum==60)
- fnum=0;
- }
- }
- void read_sf()
- {
- shi=read_1302(read_shi);
- fen=read_1302(read_fen);
- miao=read_1302(read_miao);
- display(shi,fen,miao);
- }
- void keyscan() //按键扫描函数
- {
- if(s3==0) //选择按键按下
- {
- delay(10);
- if(s3==0)
- {
- while(!s3)
- display(shi,fen,miao); //加上这句,按键按下就不会闪
- knum++;
- if(knum==1) //分闪烁
- {
- write_1302(0x8e,0x00); //保护取消
- write_1302(write_miao,0x80);
- }
- if(knum==3) //时钟启动
- {
- knum=0;
- write_1302(write_miao,0x00);
- write_1302(0x8e,0x80); //保护启动
- }
- }
- }
- if(knum==1) //分钟调节
- {
- if(s1==0) //加
- {
- delay(10);
- if(s1==0)
- {
- while(!s1)
- display(shi,fen,miao); //加上这句,按键按下就不会闪
- fen++;
- fen=fen/10*16+fen%10; //转为16进制
- if(fen==0x60)
- fen=0x00;
- write_1302(write_fen,fen); //写入1302
- read_sf(); //读出时间,然后显示
- }
- }
- if(s2==0)
- {
- delay(10);
- if(s2==0)
- {
- while(!s2)
- display(shi,fen,miao); //加上这句,按键按下就不会闪
- fen--;
- fen=fen/10*16+fen%10; //转为16进制
- if(fen==-1)
- fen=0x59;
- write_1302(write_fen,fen);
- read_sf();
- }
- }
- }
- if(knum==2)
- {
- if(s1==0)
- {
- delay(10);
- if(s1==0)
- {
- while(!s1)
- display(shi,fen,miao); //加上这句,按键按下就不会闪
- shi++;
- shi=shi/10*16+shi%10; //转为16进制
- if(shi==0x24)
- shi=0x00;
- write_1302(write_shi,shi);
- read_sf();
- }
- }
- if(s2==0)
- {
- delay(10);
- if(s2==0)
- {
- while(!s2)
- display(shi,fen,miao); //加上这句,按键按下就不会闪
- shi--;
- shi=shi/10*16+shi%10; //转为16进制
- if(shi==-1)
- shi=0x23;
- write_1302(write_shi,shi);
- read_sf();
- }
- }
- }
- }
- void main()
- {
- init_1302();
- while(1)
- {
- read_sf();
- keyscan();
- display(shi,fen,miao);
- }
- }