標(biāo)題:
單片機(jī)按鍵單擊雙擊長(zhǎng)按程序
[打印本頁]
作者:
李尋歡123
時(shí)間:
2022-12-20 12:36
標(biāo)題:
單片機(jī)按鍵單擊雙擊長(zhǎng)按程序
如何實(shí)現(xiàn)一個(gè)按鍵多種功能,這里介紹了按鍵單擊,雙擊,長(zhǎng)按,源代碼,親測(cè)有效,模塊獨(dú)立,包括.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) //如果有鍵按下,轉(zhuǎn)到狀態(tài)1。
{
old_val=new_val;
press_time=0;
key_state=1;
}
break;
case 1:
if (old_val==new_val) //確實(shí)有鍵按下(消抖)
{
key_state=2;
}
else key_state=0;
break;
case 2:
if (old_val==new_val) //繼續(xù)按著開始計(jì)時(shí)
{
if(++press_time>=100) //100x10=1000MS
{
ret=new_val+10; //在短按鍵值基礎(chǔ)上加10就是長(zhǎng)按
key_state=3;
}
}
else //松開了返回短按
{
ret=new_val; //返回短按
key_state=3;
}
break;
case 3:
if (new_val==NO_KEY) //如果松開鍵
{
key_state=4; //轉(zhuǎn)到狀態(tài)4 (消抖)
}
break;
case 4:
if (new_val==NO_KEY) //如果確實(shí)松開
{
key_state=0; //轉(zhuǎn)到狀態(tài)0
}
else key_state=3;
break;
}
return (ret);
}
/**
* @brief KEY Process program (10MS調(diào)一次,最短不能低于5MS,最長(zhǎng)不大于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:
//長(zhǎng)按鍵1處理
break;
}
}
復(fù)制代碼
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
復(fù)制代碼
作者:
joe069
時(shí)間:
2023-2-24 16:09
51有你更精彩,收藏了
作者:
jovew
時(shí)間:
2023-2-24 19:38
..\inc\my_led.h" 這個(gè)文件沒有,可以發(fā)一下嗎?
程序有錯(cuò)誤!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1