标题:
单片机按键单击双击长按程序
[打印本页]
作者:
李寻欢123
时间:
2022-12-20 12:36
标题:
单片机按键单击双击长按程序
如何实现一个按键多种功能,这里介绍了按键单击,双击,长按,源代码,亲测有效,模块独立,包括.c和.h文件
my_key.c
/**
* @file my_key.c
* @author xxb
* @version V1.0
* @date 07/29/
* @brief This file provides all the KEY firmware functions.
*/
#define KEY_GLOBAL
#include "..\inc\my_key.h"
#include "..\inc\my_led.h"
/****************************************************************************
【功能说明】按键扫描程序
****************************************************************************/
U8 Key_Scan(void)
{
U8 key_val=NO_KEY;
//这里添加读口线的代码
// if(!_pa0)
// {
// key_val=MyKEY_NAME1;
// }
// else if(!_pa2)
// {
// key_val=MyKEY_NAME2;
// }
return (key_val);
}
/****************************************************************************
【功能说明】获取键值
****************************************************************************/
U8 Get_KeyValue(void)
{
U8 new_val;
U8 ret=NO_KEY;
static U8 press_time=0;
new_val=Key_Scan(); //扫描按键
switch (key_state)
{
case 0:
if(new_val<NO_KEY) //如果有键按下,转到状态1。
{
old_val=new_val;
press_time=0;
key_state=1;
}
break;
case 1:
if (old_val==new_val) //确实有键按下(消抖)
{
key_state=2;
}
else key_state=0;
break;
case 2:
if (old_val==new_val) //继续按着开始计时
{
if(++press_time>=100) //100x10=1000MS
{
ret=new_val+10; //在短按键值基础上加10就是长按
key_state=3;
}
}
else //松开了返回短按
{
ret=new_val; //返回短按
key_state=3;
}
break;
case 3:
if (new_val==NO_KEY) //如果松开键
{
key_state=4; //转到状态4 (消抖)
}
break;
case 4:
if (new_val==NO_KEY) //如果确实松开
{
key_state=0; //转到状态0
}
else key_state=3;
break;
}
return (ret);
}
/**
* @brief KEY Process program (10MS调一次,最短不能低于5MS,最长不大于32MS)
* @param None
* @retval None
*/
void Key_Process(void)
{
U8 key_val=Get_KeyValue();
switch(key_val)
{
case MyKEY_NAME1:
//短按键1处理
break;
case MyKEY_NAME2:
//短按键2处理
break;
case MyKEY_NAME1_LONG:
//长按键1处理
break;
}
}
复制代码
my_key.h
/**
* @file my_key.h
* @author xxb
* @version V1.0
* @date 07/29/2017
* @brief This file contains all the functions prototypes for the KEY firmware
*/
#ifndef __MY_KEY_H__
#define __MY_KEY_H__
#include "..\inc\cpu.h"
#ifdef KEY_GLOBAL
#define KEY_EXT
#else
#define KEY_EXT extern
#endif
#define NO_KEY 0xFF
#define MyKEY_NAME1 1
#define MyKEY_NAME2 2
#define MyKEY_NAME1_LONG MyKEY_NAME1+10
KEY_EXT U8 key_state;
KEY_EXT U8 old_val;
void Key_Process(void);
#endif
复制代码
作者:
joe069
时间:
2023-2-24 16:09
51有你更精彩,收藏了
作者:
jovew
时间:
2023-2-24 19:38
..\inc\my_led.h" 这个文件没有,可以发一下吗?
程序有错误!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1