欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機狀態機按鍵程序 支持短按和長按,可移植性好
[打印本頁]
作者:
2006sunmoon
時間:
2022-9-29 11:55
標題:
單片機狀態機按鍵程序 支持短按和長按,可移植性好
狀態機按鍵程序,可移植性好,支持短按和長按。親測可用。
單片機源程序如下:
#include <iom16.h>
#include <intrinsics.h>
#include <stdbool.h>//位變量頭文件
#include <iomacro.h>
#include "keyboard.h"
#define key_state_init 0 //按鍵的初始狀態
#define key_state_ok 1 //按鍵被按下的狀態
#define key_state_long 2 //按鍵被長按狀態
//#define key_state_continue 3 //按鍵被連續按下狀態
#define key_state_release 4 //按鍵釋放的狀態
unsigned char KeyRead()
{
static unsigned int key_timenum=0;//按鍵長按時間變量
static unsigned char key_state=0; //按鍵的狀態
static unsigned char key_num=0;//保存按鍵按鍵釋放時的值
static bool key_LONG=0;//記錄長按釋放
unsigned char key_return=0; //按鍵返回值
unsigned char key_press; //保存按鍵按下的端口值
key_press =(port^0xFF)&0XFF; // 讀按鍵I/O電平
switch (key_state)
{
case key_state_init://按鍵的初始狀態
if(key_press)//如果按鍵被按下
{
key_state=key_state_ok;//則把key_state按鍵狀態置為按鍵確認狀態
}
break;
case key_state_ok://按鍵確認狀態
if(key_press)//如果按鍵被按下
{
key_num=key_press;// 按鍵I/O電平保存
key_state=key_state_long;//則把key_state按鍵狀態置為按鍵被長按狀態
}
else
key_state=key_state_init; //如果按鍵是抖動則返回按鍵的初始狀態
break;
case key_state_long://按鍵被長按狀態
if(key_press)//如果按鍵被按下
{
if(!key_LONG)//如果上次有長按事件發生,長按時間就不再計時。
{
if (++key_timenum>=KEY_LONG_PERIOD)//達到長按設置值時
{
key_timenum=0;
key_return=(key_press+KEY_LONGSIGN);//返回按鍵值加個數來區別單按和長按
key_LONG=1;//標記長按事件發生
}
}
else
key_return=(key_press+KEY_LONGSIGN);//返回按鍵值加個數來區別單按和長按
}
else
key_state=key_state_release; //則把key_state按鍵狀態置為按鍵被釋放狀態
break;
case key_state_release://按鍵釋放狀態
if (key_LONG)//如果有長按事件發生
{
if(!key_press)//如果按鍵全部釋放
{
key_return=0;//返回值清0
key_state=key_state_init;//則把key_state按鍵狀態置為按鍵初始狀態
key_timenum=0;//計數清0
key_LONG=0;//長按標記清0
}
else//如果按鍵沒有釋放
{
key_state=key_state_release;//則繼續把key_state按鍵狀態置為按鍵被釋放狀態
}
}
else//如果沒有長按事件發生
{
if(!key_press)//如果按鍵全部釋放
{
key_return=key_num;
key_state=key_state_init;//則把key_state按鍵狀態置為按鍵初始狀態
key_timenum=0;//計數清0
}
else
{
key_state=key_state_release;//則繼續把key_state按鍵狀態置為按鍵被釋放狀態
}
}
break;
}
return key_return;
}
復制代碼
#ifndef __KEYBOARD_H__
#define __KEYBOARD_H__
#define K1 0X01//設定按鍵位置
#define K2 0X02//設定按鍵位置
#define K3 0X04//設定按鍵位置
#define K4 0X08//設定按鍵位置
#define K5 0X10//設定按鍵位置
#define K6 0X20//設定按鍵位置
#define K7 0X40//設定按鍵位置
#define K8 0X80//設定按鍵位置
#define L_K1 0X01+KEY_LONGSIGN//設定按鍵位置
#define L_K2 0X02+KEY_LONGSIGN//設定按鍵位置
#define L_K3 0X04+KEY_LONGSIGN//設定按鍵位置
#define L_K4 0X08+KEY_LONGSIGN//設定按鍵位置
#define L_K5 0X10+KEY_LONGSIGN//設定按鍵位置
#define L_K6 0X20+KEY_LONGSIGN//設定按鍵位置
#define L_K7 0X40+KEY_LONGSIGN//設定按鍵位置
#define L_K8 0X80+KEY_LONGSIGN//設定按鍵位置
#define port PINA//設定按鍵端口
#define KEY_LONGSIGN 5//設定長按按鍵與普通按鍵差值
#define KEY_LONG_PERIOD 150//定義長按鍵時間,消抖時間*時間數
unsigned char KeyRead();
#endif
復制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1