- #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)
2019-12-8 19:04 上傳
點擊文件名下載附件
|