六位數(shù)碼管顯示時分秒,通過四個按鍵進行時間的控制。按下"調(diào)時"按鍵,時間顯示停止;按下"選擇時分秒"按鍵,數(shù)碼管上方的發(fā)光二極管會點亮,對應(yīng)著選中的要修改的時間是小時、分鐘還是秒;按下"按下增加"按鍵,選中的時間將會增加;按下"完成"按鍵,時間繼續(xù)顯示。
已通過proteus仿真,電路圖如下所示,希望大家多多指點,積極留言:
611fac9746edd8122be24.jpg (196.11 KB, 下載次數(shù): 73)
下載附件
2017-7-10 02:38 上傳
- //編程:jumpmysoul
- #include<reg52.h>
- #define ulong unsigned long
- char tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽數(shù)碼管數(shù)字碼
- char tab_dp[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x70,0x10};//共陽數(shù)碼管數(shù)字碼(帶小數(shù)點)
- #define LED P0 //P0為數(shù)碼管的段選
- #define LIGHT P1 //P1為時分秒位的指示燈
- #define WS P2 //P2為數(shù)碼管的位選
- sbit time_change=P3^0; //P3^0為“調(diào)時”按鍵
- sbit time_choose=P3^1; //P3^1為“選擇時分秒”按鍵
- sbit time_inc=P3^2; //P3^2為“增加”按鍵
- sbit time_ok=P3^3; //P3^3為“完成”按鍵
- ulong t;
- ulong sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi; //定義秒,分,時,秒的個位,十位,分的個位,十位,時的個位,十位
- int choose_n; //按下“選擇時分秒”按鍵的次數(shù)
- int flag; //定義“調(diào)時”按鍵的標志位
- //---------------------------------------------------------------------
- void init();
- void display();
- void delay(int);
- void time_modify();
- //---------------------------------------------------------------------
- void main()
- {
- init();
- while(1)
- {
- TR0=1;
- display();
- time_modify();
- }
- }
- //---------------------------------------------------------------------
- void init()
- {
- WS=t=LIGHT=choose_n=0;
- sec_ge=sec_shi,min_ge,min_shi,hour_ge,hour_shi=sec=min=hour=flag=0;
- TMOD=0x01; //定義定時器0工作與方式1
- TH0=(65536-5536)/256; //定時器賦初值
- TL0=(65536-5536)%256;
- EA=1; //開總中斷和T0中斷
- ET0=1;
- }
- //--------------------------------延時子函數(shù)------------------------------------
- void delay(int x)
- {
- int i,j;
- for(i=x;i>0l;i--)
- for(j=255;j>0;j--);
- }
- //-------------------------------顯示子函數(shù)---------------------------------------
- void display()
- {
- int i=0;
- if(TF0==1) //如果定時器溢出
- {
- TF0=0; //清中斷標志位
- t++;
- if(t==10)
- {
- t=0;
- sec++; //秒加1
- if(sec==60) //如果秒為60,則清零,分加1
- {
- sec=0;
- min++;
- }
- if(min==60) //如果分為60,則清零,時加1
- {
- min=0;
- hour++;
- }
- if(hour==24) //如果時為24,則清零
- {
- hour=0;
- }
- }
- }
- sec_ge=sec%10; //秒的個位和十位
- sec_shi=sec/10;
- min_ge=min%10; //分的個位和十位
- min_shi=min/10;
- hour_ge=hour%10; //時的個位和十位
- hour_shi=hour/10;
- WS=0x20; //循環(huán)掃描
- LED=tab[sec_ge];
- delay(1);
- WS=0x10;
- LED=tab[sec_shi];
- delay(1);
- WS=0x08;
- LED=tab_dp[min_ge];
- delay(1);
- WS=0x04;
- LED=tab[min_shi];
- delay(1);
- WS=0x02;
- LED=tab_dp[hour_ge];
- delay(1);
- WS=0x01;
- LED=tab[hour_shi];
- delay(1);
- }
- //----------------------------調(diào)時子程序-------------------------------
- void time_modify()
- {
- if(time_change==0) //如果“調(diào)時”按鍵按下
- {
- delay(5); //延時去抖
- if(time_change==0)
- {
- flag=1; //標志位置1
- while(flag) //當標志位為1時才能進行時間調(diào)整
- {
- TR0=0; //定時器停止
- display(); //顯示停止時的時間
- if(time_ok==0) //如果“完成”按鍵按下
- {
- delay(15); //延時去抖
- if(time_ok==0)
- {
- flag=0; //標志位清零
- }
- }
- if(time_choose==0) //如果“時分秒選擇”按鍵按下
- {
- delay(30); //延時去抖
- if(time_choose==0)
- {
- ++choose_n; //按下的次數(shù)增加
- if(choose_n==4) //如果次數(shù)達到4次
- {
- choose_n=1; //次數(shù)清零
- }
- if(choose_n==1) //如果次數(shù)為1,秒指示燈亮
- {
- LIGHT=0x03;
- }
- else if(choose_n==2) //如果次數(shù)為2,分指示燈亮
- {
- LIGHT=0x0c;
- }
- else if(choose_n==3) //如果次數(shù)為3,時指示燈亮
- {
- LIGHT=0x30;
- }
- }
- }
- if(time_inc==0) //如果“增加”按鍵按下
- {
- delay(30); //延時去抖
- if(time_inc==0)
- {
- switch(choose_n) //分支結(jié)構(gòu),根據(jù)choose_n的值來判斷哪一位加1
- {
- case 1: //如果choose_n為1,秒加1,到60清零
- {
- sec++;
- if(sec==60)
- sec=0;
- break;
- }
- case 2: //如果choose_n為2,分加1,到60清零
- {
- min++;
- if(min==60)
- min=0;
- break;
- }
- case 3: //如果choose_n為3,時加1,到24清零
- {
- hour++;
- if(hour==24)
- hour=0;
- break;
- }
- default:break;
- }
- }
- }
- }
- }
- }
- }
復(fù)制代碼
|