给你一个演示程序,按实际电路配置端口即可满足你的需求。
- //按楼主意图优化编写
- //双路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;
- }
- }
- }
复制代码 |