不知道你用的什么MCU和外围电路,只能按51给你写了程序,端口定义根据实际电路自行修改。
#include <AT89X52.H>
#define uchar unsigned char
#define uint unsigned int
sbit OUT=P1^0; //输出
sbit key1=P3^4; //键1
sbit key2=P3^5; //键2
sbit dula=P2^6; //段选
sbit wela=P2^7; //位选
uchar code table[]={ //共阴数码管0~f
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar Cnt50ms=0,Cnt1s=0;
uchar Time=0;
bit flag=0;
void Timer0Init();
void keycan();
void display();
void Countdown();
void main()
{
Timer0Init(); //初始化定时器
while(1)
{
keycan(); //按键扫描
display(); //显示
Countdown();//倒计时
}
}
void Timer0Init() //50毫秒@12.000MHz
{
TMOD= 0x01; //设置定时器模式
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
// TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
EA=1; //开总中断
ET0=1; //开T0中断
}
void keycan()
{
static bit key1_sign=0,key2_sign=0; //按键自锁标志
static uchar count1=0,count2=0; //消抖计数变量
if(!key1) //检测按键1如果按下为0
{
if((key1_sign==0)&&(flag==0)) //按键自锁标志为0
{
count1++; //消抖计数
if(count1>=250) //消抖延时
{
key1_sign=1; //按键自锁标志置1
Cnt50ms=0;
Time++; //定时时间变量+1
if(Time>=10)
Time=0;
}
}
}
else
{
key1_sign=0; //按键自锁标志清0
count1=0; //消抖计数清0
}
if(!key2) //检测按键2如果按下为0
{
if(key2_sign==0) //按键自锁标志为0
{
count2++; //消抖计数
if(count2>=250) //消抖延时
{
key2_sign=1; //按键自锁标志置1
Cnt1s=Time; //传递定时时间
if(Cnt1s>0)
{
OUT = 0; //低电平输出
flag= 1; //禁止key1操作
TR0 = 1; //开启定时器
}
}
}
}
else
{
key2_sign=0; //按键自锁标志清0
count2=0; //消抖计数清0
}
}
void display()
{
if(flag==0)
P0=table[Time]; //显示定时时间
else
P0=table[Cnt1s]|0x80;//加点表示倒计时工作中
dula=1;
dula=0;
P0=0x7e; //6位数码管只使用第1位
wela=1;
wela=0;
}
void Countdown() //倒计时
{
if(flag==1)
{
if(Cnt1s==0)
{
TR0 = 0; //关闭定时器
OUT = 1; //停止输出
flag= 0; //允许key1操作
}
}
}
void Timer0() interrupt 1
{
TL0 = 0xB0; //设置定时重装值
TH0 = 0x3C; //设置定时重装值
Cnt50ms++;
if(Cnt50ms>=20)//1秒
{
Cnt50ms=0;
Cnt1s--;
}
} |