1、include
2、S12CR887的四个位声明 sbit dscs=P1^0;//片选信号 sbit dsas=P1^1;//地址选通输入 sbit dsrw=P1^2;//读/写输入 sbit dsds=P1^3;//数据选通或读输入 sbit s1=P3^4;//功能键 sbit s2=P3^5;//加 sbit s3=P3^6;//减 sbit dula=P1^4; sbit wela=P1^5; /*函数1,延时函数*/ void delay(uint z)//延时子函数1MS { uint x,y;
3、 for(x=z;x>0;x--) for(y=114;y>0;y--); } //函数2从DS12DS12RC887中读取数据 uchar read_ds(uchar add)//数据读取 { uchar date; dsas=1; ds
4、ds=1; dsrw=1; dscs=0; P0=add; dsas=0; dsds=0; P0=0xff;//读取P0口先给P0口全赋个一
5、 date=P0; dsds=1; dsas=1; dscs=1; return date; } //函数3写数据进DS12RC887,地址与数据 void write_ds(uchar add,uchar date)//DS12CR887数据写入 {
6、 dsas=1; dsds=1; dsrw=1; dscs=0; P0=add; dsas=0; dsrw=0;
7、 P0=date; dsrw=1; dsas=1; dscs=1; } //函数4数码管显示函数 void display(uchar shiw,uchar wan,uchar qian,uchar bai,uchar shi,uchar ge)//6位显示子函数 {
8、 dula=1; //开段选 P2=table[shiw]; //送时的十位 dula=0; //关段选 P2=0xff; //消隐 wela=1; //开位选 P2=0xfe; //选通时的十位
9、 wela=0; //关位选 P2=0xff; //消隐 delay(2); dula=1; //开段选 P2=table[wan]; //送时的个位 dula=0; //关段选
10、 P2=0xff; //消隐 wela=1; //开位选 P2=0xfd; //选通时的个位 wela=0; //关位选 P2=0xff; //消隐 delay(2); dul
11、a=1; //开段选 P2=table[qian]; //送分的十位 dula=0; //关段选 P2=0xff; //消隐 wela=1; //开位选 P2=0xfb; //选通分的十位 we
12、la=0; //关位选 P2=0xff; //消隐 delay(2); dula=1; //开段选 P2=table[bai]; //送分的个位 dula=0; //关段选 P2=0xff;
13、//消隐 wela=1; //开位选 P2=0xf7; //选通分的个位 wela=0; //关位选 P2=0xff; //消隐 delay(2); dula=1; //开段选
14、 P2=table[shi]; //送秒的十位 dula=0; //关段选 P2=0xff; //消隐 wela=1; //开位选 P2=0xef; //选通秒的十位 wela=0; //关位选
15、 P2=0xff; //消隐 delay(2); dula=1; //开段选 P2=table[ge]; //送秒的个位 dula=0; //关段选 P2=0xff; //消隐
16、 wela=1; //开位选 P2=0xdf; //选通秒的个位 wela=0; //关位选 P2=0xff; //消隐 delay(2); } //函数5功能键函数,停止显示和进入时间的调节 void gnj()//功能键子函数
17、{ if(s1==0)//功能键 { delay(5);//消抖 if(s1==0)//确认功能键按下 {
18、s1num++;//功能键按下次数加1 flag=1; //flag=1将停止显示数据的刷新 while(!s1);//松手检测 if(s1num==1)//如果按下1次,秒不动作
19、 { } if(s1num==2)//如果按下2次,分不动作 {
20、 } if(s1num==3)//如果按下3次,时不动作 {
21、 } if(s1num==4)//如果按下4次,正常显示 { s1num=0;//将s1num清零
22、 write_ds(4,shige);//写时数据 write_ds(2,fen);//写分数据 write_ds(0,miao);//写秒数据
23、 flag=0;//把调节好的数据保存进DS12RC887中,并且恢复显示 } } } } //函数6,加键函数 void jia()//加子函数 {
24、 if(s2==0)//加键 { delay(1);//消抖 if(s2==0)//确定S2为0 { while(!s2);//松手检测 if(s1num==1)//在S1按下一次时 {
25、 miao++;//秒加1 if(miao==60)//秒加到60 miao=0;//将秒清零 display(shiw,wan,qian,bai,shi,ge);//调用数码管显示子函数
26、 } if(s1num==2)//在S1按下二次时 { fen++;//分加1 if(fen==60)//分加到60
27、 fen=0;//将分清零 display(shiw,wan,qian,bai,shi,ge);//调用数码管显示子函数 } if(s1num==3)//在S1按下三次时 {
28、 shige++;//时加1 if(shige==24)//时加到24 shige=0;//时清零 display(shiw,wan,qian,bai,shi,ge);//调用数码管显示子函数 }
29、 } } } //函数7,减函数调节 void jian()//减子函数 { if(s3==0)//减键 { delay(1);//消抖 if(s3==0)//确定S3按下 {
30、 while(!s3);//松手检测 if(s1num==1)//在S1按下一次时 { miao--;//秒减一
31、 if(miao==-1)//秒小于0 miao=59;//秒重新赋值为59 display(shiw,wan,qian,bai,shi,ge);//调用数码管显示子函数
32、 } if(s1num==2)//在S1按下二次时 { fen--;//分减一 if(fen==-1)//分小于0
33、 fen=59;//分重新赋值为59 display(shiw,wan,qian,bai,shi,ge);//调用数码管显示子函数 }
34、 if(s1num==3)//在S1按下三次时 { shige--;//时减一 if(shige==-1)//时小于0
35、 shige=23;//时重新赋值23 display(shiw,wan,qian,bai,shi,ge);//调用数码管显示子函数 } } }
36、 } //函数8,按键扫描函数 void keyscan()//按键输入函数 { gnj();//功能键子函数 if(s1num!=0)///判断S1键是否按下 { jia();//加子函数
37、 jian();//减子函数 } } //函数9,调节时间时数码管闪烁函数 void sansuo() { uchar num,num1; if(s1num==1)//如果按下1次,秒 { fo
38、r(num=25;num>0;num--) { display(shiw,wan,qian,bai,11,11); jia(); jian();//在闪烁同时检测按键,提高扫描率
39、 gnj(); } for(num1=25;num1>0;num1--)//如果按下1次,秒 { display(shiw,wan,qian,bai,shi,ge);
40、 jia(); jian();//在闪烁同时检测按键,提高扫描率 gnj(); } } if(s1num==2)//如果按下1次,秒 {
41、 for(num=25;num>0;num--) { display(shiw,wan,11,11,shi,ge); jia(); jian();//在闪烁同时检测按
42、键,提高扫描率 gnj(); } for(num1=25;num1>0;num1--)//如果按下1次,秒 { display(shiw,wan,qian,bai,shi,g
43、e); jia(); jian();//在闪烁同时检测按键,提高扫描率 gnj(); } } if(s1num==3)//如果按下1次,秒
44、 { for(num=25;num>0;num--) { display(11,11,qian,bai,shi,ge); jia();
45、 jian();//在闪烁同时检测按键,提高扫描率 gnj(); } for(num1=25;num1>0;num1--)//如果按下1次,秒 { d
46、isplay(shiw,wan,qian,bai,shi,ge); jia(); jian();//在闪烁同时检测按键,提高扫描率 gnj(); } } } void main()/
47、/主函数 { write_ds(0x0B,0x06);//二进制格式,24小时制 write_ds(0x0A,0x20); //开启内部振荡 wela=1; //开位选 P1=0x00; wela=0; //关位选 while(1)//大循环 { keys
48、can();//键盘扫描 if(flag==0)//在S1没有按下时,flag为0 { shige=read_ds(4); //读取时 fen=read_ds(2);//读取分
49、 miao=read_ds(0);//读取秒 } sansuo(); shiw=shige/10;//小时的十位 wan=shige%10;//小时的个位 qian=fen/10;//分钟的十位 bai=fen%10;//分钟的个位 shi=miao/10;//秒钟的十位 ge=miao%10;//秒钟的个位 display(shiw,wan,qian,bai,shi,ge);//调用显示函数 } }






