- #include <reg51.h>
- unsigned char code smg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
- 0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0x00}; //字形代码,分别为0-9,a-f,-,全灭
- unsigned char num[8]={0,0,16,0,0,16,0,0}; //显示缓冲区
- unsigned char w;// 移位控制
- unsigned char miao,fen,shi; //时间
- unsigned char t,i;// 记录定时器中断次数
- bit qd=1; //时钟启停控制位
- sbit wei =P3^0; //定义P3.0端口为移位按键
- sbit tiao=P3^1; //定义P.1端口为调整按键
- void delay(unsigned int T) //延时子函数
- {
- unsigned char b,c;
- for(c=T;c>0;c--)
- for(b=90;b>0;b--);
- }
- /*=======================================================
- ------- 主程序 ------
- =======================================================*/
- void main()
- { // 定时器1,外部中断0的初始化
- TMOD=0x10; //设置定时器T1为方式1模式
- ET1=1; //允许定时器T1中断
- TL1=0xE0; //设定定时器T1初值
- TH1=0xB1; //设定定时器T1初值
- EX0=1; //使能外部中断
- IT0=1; //指定外部中断0下降沿触发
- EX1=1; //开外部中断1
- IT1=1; //外部中断1下降沿触发方式
- PT1=1;
- EA=1; //总中断允许
- TR1=1; //启动定时器T1
-
- miao=0,fen=0,shi=0;
- num[0]=shi/10;//时高位
- num[1]=shi%10;//时低位
- num[3]=fen/10;//分高位
- num[4]=fen%10;//分地位
- num[6]=miao/10;//秒高位
- num[7]=miao%10;//秒地位
- t=0; //定时器中断次数初始化
- w=0; //闪烁控制位,初始无闪烁位
- qd=1; //时钟启停标志位
- while(1)
- { if(t==50) // 时间的控制
- { t=0;
- miao++; //秒自增
- if(miao==60) //如果秒等于60
- {miao=0;fen++; //0赋值给秒,分自增
- if(fen==60) //如果分等于60
- {fen=0;shi++; //把0赋值给分,时自增
- if(shi==24) shi=0;} //如果时等于24,把0赋值给时
- } // 下面是显示缓冲区内容的计算
- num[0]=shi/10;num[1]=shi%10;
- num[3]=fen/10;num[4]=fen%10;
- num[6]=miao/10;num[7]=miao%10;
- }
- }
- }
- /*=======================================================
- ------- 定时器1中断程序 ------
- =======================================================*/
- void timer1() interrupt 3
- { static unsigned char ss,g;
- TL1=0xE0;
- TH1=0xB1; //定时20Ms 循环
- if(qd) t++;//-----时钟计时
- if(w==1||w==2||w==3||w==4||w==5||w==6)
- { ss++;//调位闪烁
- if(ss<30)//显示灭
- {
- switch(w) //选择灭的显示位
- {
- case 1:g=0;break;//时高位
- case 2:g=1;break;//时地位
- case 3:g=3;break;//分高位
- case 4:g=4;break;//分低位
- case 5:g=6;break;//秒高位
- case 6:g=7;break;//秒低位
- }
- for(i=0;i<8;i++)//输出显示
- {
- P2=i;
- if(i==g)P0=0X00;//需要调整的位灭
- else P0=smg[num[i]];//正常显示
- delay(4);
- }
- }
- else if(ss>=30)//+++++++++++++亮
- {
- for(i=0;i<8;i++)
- {
- P2=i;
- P0=smg[num[i]];//正常显示
- delay(3);
- }
- if(ss==60) ss=0;
- }
- }
- else//-------不调整时正常显示
- {
- for(i=0;i<8;i++)
- {
- P2=i; //把i赋值给P2
- P0=smg[num[i]];//正常显示
- delay(3);
- }
- }
- }
- /*=======================================================
- ------- 外部中断1中断程序 ------
- 说明:调整时分秒的每一位
- =======================================================*/
- void shezhi() interrupt 2
- { if(wei==0) //调整位的按键按下了
- {w++;
- if(w==7) //如果w等于7
- w=0; //把0赋值给w
- if(w==0) qd=1; //如果w等于0,把1赋值给qd
- else qd=0; //否则把0赋值给qd
- }
- else if(tiao==0&& w!=0)//调整数据的按键按下了
- {
- if(w==1) //如果w等于1,调整时的十位
- {
- num[0]++; //时高位增加
- if(num[0]==3) num[0]=0;
- }
- else if (w==2)//如果w等于2,调整时的个位
- {
- num[1]++; //时低位增加
- if( (num[0]==2 && num[1]==4 ) ||
- (num[0]==1 && num[1]==10) ||
- (num[0]==0 && num[1]==10) )
- num[1]=0;
- }
- else if (w==3)//如果w等于3,调整分的十位
- {
- num[3]++; //分高位增加
- if(num[3]==6) num[3]=0; //分高位等于6,把0赋值给分高位
- }
- else if (w==4)//如果w等于4,调整分的个位
- {
- num[4]++; //分低位增加
- if(num[4]==10) num[4]=0; //分低位等于10,把0赋值给分低位
- }
- else if (w==5)//如果w等于5,调整秒的十位
- {
- num[6]++; //秒高位增加
- if(num[6]==6) num[6]=0; //秒高位等于6,把0赋值给秒高位
- }
- else if (w==6)//如果w等于6,调整秒的个位
- {
- num[7]++; //秒低位增加
- if(num[7]==10) num[7]=0; //秒低位等于10,把0赋值给秒低位
- }
- miao=num[7]+num[6]*10;
- fen =num[4]+num[3]*10;
- shi =num[1]+num[0]*10;
- }
- }
复制代码
Desktop.zip
(70.58 KB, 下载次数: 48)
|