独立按键驱动

 文章目录


前言

根据我们学校老师的思路进行的改写,此代码可以大大提高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

总结

此代码比较简短适合任何MCU,记得关注我!!!

posted @   抵达彼岸  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示