文章目录
前言
根据我们学校老师的思路进行的改写,此代码可以大大提高MCU的效率,避免了MCU在运行时被delay降低效率,可以检测按键的规定时间内的按键按下的奇偶数
一、思路
1、我们通过key_cnt来记录按下的次数,通过key_state变量记录按键按下的状态(记录按键一整套按下和弹起的状态,这里也不知道怎么解释了你们可以看代码理解),这里用一个key_timer变量做按键的消抖。
2、keyscan() 要这个函数要在定时器里面使用每10ms调用一次
二、代码
1、KEY.C文件
代码如下(示例):
#include "key.h"
unsigned int key_cnt=0; //按键按下次数
unsigned int key_Timeout=0; //超时标记
unsigned char key_state=0; //按键状态
unsigned char key_timer=0; //按键延时
unsigned char key_flag=0; //按键状态 0 没按 1 奇数次 2 偶数次
void KEY_Timeout_detection(); //函数声明
void keyscan() //此函数需要10ms调用一次【使用定时器】
{
if(KEY1==0)
{
if(key_timer<1)
{
key_timer++;
return ;
}
if(KEY1==0&&key_state==0)
{
key_cnt++;
key_state=1;
key_three_flag=0;
}
}
else
{
if(key_timer>0)
{
key_timer--;
return ;
}
key_state=0;
KEY_Timeout_detection();
}
}
void KEY_Timeout_detection(void) //按键超时未按下检测函数
{
key_Timeout++;
if(key_Timeout>=200)//2秒后没有按下做判断
{
if(key_cnt%2)
{
key_flag=1;
}
else
{
key_flag=2;
}
if(key_cnt==0)
{
key_flag=0;
}
key_Timeout=0;
key_cnt=0;
}
}
2.KEY.H的文件
代码如下(示例):
#ifndef _key_H
#define _key_H
#include "STC15.h"
void keyscan();
extern unsigned char key_flag;
#endif