|
給你一個(gè)演示程序,按實(shí)際電路配置端口即可滿足你的需求。
- //按樓主意圖優(yōu)化編寫
- //雙路0.1~99.9秒倒計(jì)時(shí)演示程序
- //此程序適合51單片機(jī)和STC1T單片機(jī)
- //也適合共陽/共陰數(shù)碼管
- #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
- //端口根據(jù)實(shí)際電路重新定義
- 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[]={//共陽數(shù)碼管段碼"0~f-."
- 0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
- */
- uchar code table[]={//共陰數(shù)碼管段碼"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];//顯示數(shù)據(jù)緩存
- bit state1,state2;//倒計(jì)時(shí)狀態(tài)
- int time1=115,time2=225;
- uchar KeySec;
- int num=0,num1=0;
- bit flashing=0;
- //12T51單片機(jī)
- 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; //設(shè)置定時(shí)器模式
- TL0 = 0x00; //設(shè)置定時(shí)初值
- TH0 = 0xDC; //設(shè)置定時(shí)初值
- // TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- ET0 = 1;
- EA = 1;
- }
- //STC1T單片機(jī)
- /*void Delay1ms() //@11.0592MHz
- {
- unsigned char i, j;
- i = 15;
- j = 90;
- do
- {
- while (--j);
- } while (--i);
- }
- void Timer0Init() //10毫秒@11.0592MHz
- {
- AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TMOD |= 0x01; //設(shè)置定時(shí)器模式
- TL0 = 0x00; //設(shè)置定時(shí)初值
- TH0 = 0xDC; //設(shè)置定時(shí)初值
- TF0 = 0; //清除TF0標(biāo)志
- // TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- 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)//預(yù)設(shè)
- {
- 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倒計(jì)時(shí)時(shí)間
- // dis_buf[0] = 0x88;//共陽A
- dis_buf[0] = 0x77;//共陰A
- else if(state2==1)//顯示B倒計(jì)時(shí)時(shí)間
- // 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;//共陽加小數(shù)點(diǎn)
- dis_buf[2] = table[num/10%10]|0x80;//共陰加小數(shù)點(diǎn)
- dis_buf[3] = table[num%10];
- }
- }
- if(KeySec==1)
- {//顯示A預(yù)設(shè)時(shí)間
- // 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;//共陽加小數(shù)點(diǎn)
- dis_buf[2] = table[time1/10%10]|0x80;//共陰加小數(shù)點(diǎn)
- dis_buf[3] = table[time1%10];
- }
- if(KeySec==2)
- {//顯示B預(yù)設(shè)時(shí)時(shí)間
- // 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;//共陽加小數(shù)點(diǎn)
- dis_buf[2] = table[time2/10%10]|0x80;//共陰加小數(shù)點(diǎn)
- dis_buf[3] = table[time2%10];
- }
- //共陽數(shù)碼管驅(qū)動(dòng)
- /* P2&=0xf0;//消隱
- P0=dis_buf[i];//送段碼
- P2|=0x01<<i;//送位碼
- */
- //共陰數(shù)碼管驅(qū)動(dòng)
- P0=0x00;//消隱
- P2&=0xf0;//清低4位
- P0=dis_buf[i];//送段碼
- P2|=~(0x01<<i);//送位碼
- i++;i%=4;
- }
- void main()//主函數(shù)
- {
- Timer0Init();//定時(shí)器初始化程序
- while(1)
- {
- keyscan(); //按鍵掃描
- INscan(); //輸入掃描
- display(); //數(shù)碼管顯示
- Delay1ms(); //控制主循環(huán)約1ms
- }
- }
- void Timer0Interrupt(void) interrupt 1
- {
- TL0 = 0x00; //設(shè)置定時(shí)初值
- TH0 = 0xDC; //設(shè)置定時(shí)初值
- num1++;
- if(num1>=10)
- {
- num1=0;
- num--;
- if(num<=0)
- {
- num=0;
- OUT1=1;
- OUT2=1;
- state1=0;
- state2=0;
- TR0=0;
- }
- }
- }
復(fù)制代碼 |
|