要求1: 按键1,可以选择设置的时间; 按键2: 可以开始选择的倒计时
实现思路:
首先,KEY1, KEY2 的小电路 连好单片机的IO;
然后,考虑扫描还是外部中断;
考虑扫描,得考虑抖动; 考虑外部中断,得设置定时器;
以下使用的是中断:(发现SWHTCH 比 if else if 好用,不知道为啥?)
void key1_ISR() interrupt 0 //按键1中断服务程序,中断号是0
{
if(count < 次数)
{ //如果按键次数小于次数
count++; //按键次数加1
if(count == 次数)
{
key_count = 0 ;
}
switch (count)
{
case 0:
//添加要实现的代码;
//添加需要在其他程序段引用的棋标;
break;
case 1:
//添加要实现的代码;
//添加需要在其他程序段引用的棋标;
break;
c。。。。。
}
}
KEY1 = 1; //按键消抖,防止误操作,这个可以在主循环里面加消抖逻辑或者使用硬件去抖动。具体做法根据你的硬件实现进行编写。
}
void key2_ISR() interrupt 2
{
// 这里开启中断, 就是开启单片机对应的中断位设置,或者棋标什么的;
}
void Timer2_ISR() interrupt 12
{
Timercount++; //10ms加1次
if (Timercount == 50) //加到500ms,即0.5S时
{
LED= ~LED; //闪灯
temp++; //temp 加1
Timecount =0; // 5次清零一次,重新累计
}
}
这个是常用的中断闪灯,外加变量累计
这里有个重点: temp++ ,在主程序中引用判断前,需要关掉中断。
void main()
{
//各种初始化
while (1)
{ // 主循环
if( temp > 大目标)
{
temp = 0;
}
else
{
switch (temp)
{
case 小目标1: //IE2 &= ~0x04; 可以在这里关掉
// if (棋标满足) 如果需要的话,加这个IF判断
{
// IE2 &= ~0x04;
temp = 0;
//功能1
//功能2
}
break;
case 小目标2: //TR0=0; 可以在这里关掉,tr0只是举例
// if (棋标满足) 如果需要的话,加这个IF判断
{
// IE2 &= ~0x04;
temp = 0;
//功能1
//功能2
}
break;
}
}
}
上面只是打了一个框架 ,具体根据硬件设计和单片机 型号具体更改