給你一個演示程序,按實際電路配置端口即可滿足你的需求。
- //按樓主意圖優化編寫
- //雙路0.1~99.9秒倒計時演示程序
- //此程序適合51單片機和STC1T單片機
- //也適合共陽/共陰數碼管
- #include<reg51.h>
- #include<intrins.h>
- #define key_S 10 //宏定義短按(約10ms)
- #define key_L key_S*50 //宏定義長按(約500ms)
- #define key_I key_S*38 //宏定義長按連+/-間隔(約120ms)
- #define uchar unsigned char
- #define uint unsigned int
- //端口根據實際電路重新定義
- sbit K1 =P1^0;
- sbit K2 =P1^1;
- sbit K3 =P1^2;
- sbit IN1=P1^3;
- sbit IN2=P1^4;
- sbit IN3=P1^5;
- sbit OUT1=P1^6;
- sbit OUT2=P1^7;
- /*
- uchar code table[]={//共陽數碼管段碼"0~f-."
- 0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
- */
- uchar code table[]={//共陰數碼管段碼"0~f-."
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71,0x40,0x80};
- uchar data dis_buf[4];//顯示數據緩存
- bit state1,state2;//倒計時狀態
- int time1=115,time2=225;
- uchar KeySec;
- int num=0,num1=0;
- bit flashing=0;
- //12T51單片機
- void Delay1ms() //@11.0592MHz
- {
- unsigned char i, j;
- _nop_();
- i = 2;
- j = 199;
- do
- {
- while (--j);
- } while (--i);
- }
- void Timer0Init() //10毫秒@11.0592MHz
- {
- TMOD |= 0x01; //設置定時器模式
- TL0 = 0x00; //設置定時初值
- TH0 = 0xDC; //設置定時初值
- // TR0 = 1; //定時器0開始計時
- ET0 = 1;
- EA = 1;
- }
- //STC1T單片機
- /*void Delay1ms() //@11.0592MHz
- {
- unsigned char i, j;
- i = 15;
- j = 90;
- do
- {
- while (--j);
- } while (--i);
- }
- void Timer0Init() //10毫秒@11.0592MHz
- {
- AUXR &= 0x7F; //定時器時鐘12T模式
- TMOD &= 0xF0; //設置定時器模式
- TMOD |= 0x01; //設置定時器模式
- TL0 = 0x00; //設置定時初值
- TH0 = 0xDC; //設置定時初值
- TF0 = 0; //清除TF0標志
- // TR0 = 1; //定時器0開始計時
- ET0 = 1;
- EA = 1;
- }
- */
- //按鍵掃描
- void keyscan()
- {
- static unsigned int count=0;
- if(!K1||!K2||!K3)
- {
- count++;
- if(count>key_L)//長按有效
- count=key_I;//連+/-間隔
- if(count==key_S)//短按消抖
- {
- if(!K1)//預設
- {
- KeySec++;
- if(KeySec>=3)
- {
- KeySec=0;
- }
- }
- }
- if(count==key_S||count==key_L)//短按+/-,長按連+/-
- {
- if(!K2 && KeySec>0)
- {
- switch(KeySec)
- {
- case 1: if(time1<999)time1++; break;
- case 2: if(time2<999)time2++; break;
- }
- }
- if(!K3 && KeySec>0)
- {
- switch(KeySec)
- {
- case 1: if(time1>1)time1--; break;
- case 2: if(time2>1)time2--; break;
- }
- }
- }
- }
- else count=0;
- }
- void INscan()
- {
- if(KeySec==0 && TR0==0)
- {
- if(!IN1)
- {
- TR0=1;
- OUT1=0;
- OUT2=1;
- state1=1;
- state2=0;
- num1=0;
- num=time1;
- }
- if(!IN2)
- {
- TR0=1;
- OUT1=1;
- OUT2=0;
- state1=0;
- state2=1;
- num1=0;
- num=time2;
- }
- }
- if(!IN3)
- {
- OUT1=1;
- OUT2=1;
- state1=0;
- state2=0;
- num1=0;
- num=0;
- }
- }
- void display()//顯示
- {
- static uchar i=0;
- uchar j=0;
- if(KeySec==0)
- {
- if(state1==0 && state2==0)
- {//顯示----
- // for(j=0;j<4;j++)
- // dis_buf[j] = 0xbf;//共陽-
- for(j=0;j<4;j++)
- dis_buf[j] = 0x40;//共陰-
- }
- else
- {
- if(state1==1)//顯示A倒計時時間
- // dis_buf[0] = 0x88;//共陽A
- dis_buf[0] = 0x77;//共陰A
- else if(state2==1)//顯示B倒計時時間
- // dis_buf[0] = 0x83;//共陽b
- dis_buf[0] = 0x7c;//共陰b
- dis_buf[1] = table[num/100%10];
- // dis_buf[2] = table[num/10%10]&0x7f;//共陽加小數點
- dis_buf[2] = table[num/10%10]|0x80;//共陰加小數點
- dis_buf[3] = table[num%10];
- }
- }
- if(KeySec==1)
- {//顯示A預設時間
- // dis_buf[0] = 0x88; //共陽A
- dis_buf[0] = 0x77; //共陽A
- dis_buf[1] = table[time1/100%10];
- // dis_buf[2] = table[time1/10%10]&0x7f;//共陽加小數點
- dis_buf[2] = table[time1/10%10]|0x80;//共陰加小數點
- dis_buf[3] = table[time1%10];
- }
- if(KeySec==2)
- {//顯示B預設時時間
- // dis_buf[0] = 0x83; //共陽b
- dis_buf[0] = 0x7c; //共陽b
- dis_buf[1] = table[time2/100%10];
- // dis_buf[2] = table[time2/10%10]&0x7f;//共陽加小數點
- dis_buf[2] = table[time2/10%10]|0x80;//共陰加小數點
- dis_buf[3] = table[time2%10];
- }
- //共陽數碼管驅動
- /* P2&=0xf0;//消隱
- P0=dis_buf[i];//送段碼
- P2|=0x01<<i;//送位碼
- */
- //共陰數碼管驅動
- P0=0x00;//消隱
- P2&=0xf0;//清低4位
- P0=dis_buf[i];//送段碼
- P2|=~(0x01<<i);//送位碼
- i++;i%=4;
- }
- void main()//主函數
- {
- Timer0Init();//定時器初始化程序
- while(1)
- {
- keyscan(); //按鍵掃描
- INscan(); //輸入掃描
- display(); //數碼管顯示
- Delay1ms(); //控制主循環約1ms
- }
- }
- void Timer0Interrupt(void) interrupt 1
- {
- TL0 = 0x00; //設置定時初值
- TH0 = 0xDC; //設置定時初值
- num1++;
- if(num1>=10)
- {
- num1=0;
- num--;
- if(num<=0)
- {
- num=0;
- OUT1=1;
- OUT2=1;
- state1=0;
- state2=0;
- TR0=0;
- }
- }
- }
復制代碼 |