|
六位數(shù)碼管顯示時(shí)分秒,通過(guò)四個(gè)按鍵進(jìn)行時(shí)間的控制。按下"調(diào)時(shí)"按鍵,時(shí)間顯示停止;按下"選擇時(shí)分秒"按鍵,數(shù)碼管上方的發(fā)光二極管會(huì)點(diǎn)亮,對(duì)應(yīng)著選中的要修改的時(shí)間是小時(shí)、分鐘還是秒;按下"按下增加"按鍵,選中的時(shí)間將會(huì)增加;按下"完成"按鍵,時(shí)間繼續(xù)顯示。
已通過(guò)proteus仿真,電路圖如下所示,希望大家多多指點(diǎn),積極留言:
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};//共陽(yáng)數(shù)碼管數(shù)字碼
- char tab_dp[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x70,0x10};//共陽(yáng)數(shù)碼管數(shù)字碼(帶小數(shù)點(diǎn))
- #define LED P0 //P0為數(shù)碼管的段選
- #define LIGHT P1 //P1為時(shí)分秒位的指示燈
- #define WS P2 //P2為數(shù)碼管的位選
- sbit time_change=P3^0; //P3^0為“調(diào)時(shí)”按鍵
- sbit time_choose=P3^1; //P3^1為“選擇時(shí)分秒”按鍵
- 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; //定義秒,分,時(shí),秒的個(gè)位,十位,分的個(gè)位,十位,時(shí)的個(gè)位,十位
- int choose_n; //按下“選擇時(shí)分秒”按鍵的次數(shù)
- int flag; //定義“調(diào)時(shí)”按鍵的標(biā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; //定義定時(shí)器0工作與方式1
- TH0=(65536-5536)/256; //定時(shí)器賦初值
- TL0=(65536-5536)%256;
- EA=1; //開(kāi)總中斷和T0中斷
- ET0=1;
- }
- //--------------------------------延時(shí)子函數(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) //如果定時(shí)器溢出
- {
- TF0=0; //清中斷標(biāo)志位
- t++;
- if(t==10)
- {
- t=0;
- sec++; //秒加1
- if(sec==60) //如果秒為60,則清零,分加1
- {
- sec=0;
- min++;
- }
- if(min==60) //如果分為60,則清零,時(shí)加1
- {
- min=0;
- hour++;
- }
- if(hour==24) //如果時(shí)為24,則清零
- {
- hour=0;
- }
- }
- }
- sec_ge=sec%10; //秒的個(gè)位和十位
- sec_shi=sec/10;
- min_ge=min%10; //分的個(gè)位和十位
- min_shi=min/10;
- hour_ge=hour%10; //時(shí)的個(gè)位和十位
- 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)時(shí)子程序-------------------------------
- void time_modify()
- {
- if(time_change==0) //如果“調(diào)時(shí)”按鍵按下
- {
- delay(5); //延時(shí)去抖
- if(time_change==0)
- {
- flag=1; //標(biāo)志位置1
- while(flag) //當(dāng)標(biāo)志位為1時(shí)才能進(jìn)行時(shí)間調(diào)整
- {
- TR0=0; //定時(shí)器停止
- display(); //顯示停止時(shí)的時(shí)間
- if(time_ok==0) //如果“完成”按鍵按下
- {
- delay(15); //延時(shí)去抖
- if(time_ok==0)
- {
- flag=0; //標(biāo)志位清零
- }
- }
- if(time_choose==0) //如果“時(shí)分秒選擇”按鍵按下
- {
- delay(30); //延時(shí)去抖
- if(time_choose==0)
- {
- ++choose_n; //按下的次數(shù)增加
- if(choose_n==4) //如果次數(shù)達(dá)到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,時(shí)指示燈亮
- {
- LIGHT=0x30;
- }
- }
- }
- if(time_inc==0) //如果“增加”按鍵按下
- {
- delay(30); //延時(shí)去抖
- if(time_inc==0)
- {
- switch(choose_n) //分支結(jié)構(gòu),根據(jù)choose_n的值來(lái)判斷哪一位加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,時(shí)加1,到24清零
- {
- hour++;
- if(hour==24)
- hour=0;
- break;
- }
- default:break;
- }
- }
- }
- }
- }
- }
- }
復(fù)制代碼
|
|