久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51單片機時間片段輪詢按鍵掃描源碼
[打印本頁]
作者:
cmx8608121
時間:
2018-5-7 16:42
標題:
51單片機時間片段輪詢按鍵掃描源碼
單片機源程序如下:
#include <reg52.h>
#define uchar unsigned char
//按鍵端口定義
sbit io_key_1 = P2^0 ;
sbit io_key_2 = P2^1 ;
sbit io_key_3 = P2^2 ;
sbit io_key_4 = P2^3 ;
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
//定義長按鍵的TICK數,以及連_發間隔的TICK數
#define KEY_LONG_PERIOD 100
#define KEY_CONTINUE_PERIOD 20
#define KEY_DOUDONG 20
//定義按鍵返回值狀態(按下,長按,連_發,釋放)
#define KEY_DOWN 0x80
#define KEY_LONG 0x40
#define KEY_CONTINUE 0x20
#define KEY_UP 0x10
//定義按鍵狀態
#define KEY_STATE_INIT 0
#define KEY_STATE_WOBBLE 1
#define KEY_STATE_PRESS 2
#define KEY_STATE_LONG 3
#define KEY_STATE_CONTINUE 4
#define KEY_STATE_RELEASE 5
//按鍵值
#define KEY_VALUE_1 0x0e
#define KEY_VALUE_2 0x0d
#define KEY_VALUE_3 0x0b
#define KEY_VALUE_4 0x07
#define KEY_NULL 0x0f
static uchar s_u8KeyState = KEY_STATE_INIT; //關鍵狀態
static uchar s_u8KeyTimeCount = 0; //關鍵時間計數
static uchar s_u8LastKey = KEY_NULL; //保存按鍵釋放時候的鍵值
void delay_nms(unsigned char k)
{
unsigned int i,j;
for(i=0;i<k;i++)
for(j=0;j<120;j++)
;
}
//按鍵初始化
void KeyInit(void)
{
io_key_1 = 1;
io_key_2 = 1;
io_key_3 = 1;
io_key_4 = 1;
}
//按鍵掃描
static uchar KeyScan(void)
{
if(io_key_1 == 0)return KEY_VALUE_1;
if(io_key_2 == 0)return KEY_VALUE_2;
if(io_key_3 == 0)return KEY_VALUE_3;
if(io_key_4 == 0)return KEY_VALUE_4;
return KEY_NULL;
}
void GetKey(uchar *pKeyValue)
{
static uchar s_u8KeyState = KEY_STATE_INIT ;
static uchar s_u8KeyTimeCount = 0 ;
static uchar s_u8LastKey = KEY_NULL ; //保存按鍵釋放時候的鍵值
static uchar s_doudong=0;
uchar KeyTemp = KEY_NULL ;
KeyTemp = KeyScan() ; //獲取鍵值
switch(s_u8KeyState)
{
case KEY_STATE_INIT : //初始化S1狀態
{
if(KEY_NULL != (KeyTemp)) //如果有按鍵按下 進入狀態2
{
s_u8KeyState = KEY_STATE_WOBBLE ;
}
}
break ;
case KEY_STATE_WOBBLE : //去抖動S2狀態
{
if(++s_doudong==KEY_DOUDONG)
{
s_doudong=0;
s_u8KeyState = KEY_STATE_PRESS ;
}
else
s_u8KeyState = KEY_STATE_WOBBLE;
}
break ;
case KEY_STATE_PRESS : //確認有按鍵按下S3狀態 并返回按鍵值
{
if(KEY_NULL != (KeyTemp))
{
s_u8LastKey = KeyTemp ; //保存鍵值,以便在釋放按鍵狀態返回鍵值
KeyTemp |= KEY_DOWN ; //按鍵按下
s_u8KeyState = KEY_STATE_LONG ; //保存下次進入長按狀態
}
else //如果沒有按鍵按下 返回初始化S1
{
s_u8KeyState = KEY_STATE_INIT ;
}
}
break ;
case KEY_STATE_LONG : //進入長按
{
if(KEY_NULL != (KeyTemp)) //確認有按鍵按下 計數
{
if(++s_u8KeyTimeCount > KEY_LONG_PERIOD) //到達閥值 返回長按鍵值
{
s_u8KeyTimeCount = 0 ;
KeyTemp |= KEY_LONG ; //長按鍵事件發生
s_u8KeyState = KEY_STATE_LONG ; //保存下次進入
}
}
else
{
s_u8KeyState = KEY_STATE_RELEASE ; //長按狀態 按鍵放開
}
}
break ;
case KEY_STATE_CONTINUE : //連發狀態
{
if(KEY_NULL != (KeyTemp))
{
if(++s_u8KeyTimeCount > KEY_CONTINUE_PERIOD)
{
s_u8KeyTimeCount = 0 ;
KeyTemp |= KEY_CONTINUE ;
}
}
else //如果沒有按鍵 直接返回按鍵
{
s_u8KeyState = KEY_STATE_RELEASE ;
}
}
break ;
case KEY_STATE_RELEASE : //短按返回
{
s_u8LastKey |= KEY_UP ;
KeyTemp = s_u8LastKey ;
s_u8KeyState = KEY_STATE_INIT ;
}
break ;
default : break ;
}
*pKeyValue = KeyTemp ; //返回鍵值
}
void Key_Proc(uchar key_value)
{
switch(key_value)
{
case KEY_VALUE_1 | KEY_DOWN:
P3=0X0f; //0000 1111
delay_nms(500);
break;
case KEY_VALUE_1 | KEY_LONG:
P3 = 0xf0; //1111 0000
break;
case KEY_VALUE_1 | KEY_UP:
P3 = 0x33; //0011 0011
break;
default:
break;
}
}
void main(void)
{
uchar KeyValue = KEY_NULL;
KeyInit();
P2=0xff;
P3=0x00;
while(1)
{
GetKey(&KeyValue) ;
Key_Proc(KeyValue);
}
}
復制代碼
作者:
westlife96
時間:
2018-5-8 05:00
非常好的注釋,不過我發現程序中可能出現了一個錯誤,請指正。
case KEY_STATE_LONG : //進入長按
{
if(KEY_NULL != (KeyTemp)) //確認有按鍵按下 計數
{
if(++s_u8KeyTimeCount > KEY_LONG_PERIOD) //到達閥值 返回長按鍵值
{
s_u8KeyTimeCount = 0 ;
KeyTemp |= KEY_LONG ; //長按鍵事件發生
s_u8KeyState = KEY_STATE_LONG ; //保存下次進入
}
}
else
{
s_u8KeyState = KEY_STATE_RELEASE ; //長按狀態 按鍵放開
}
}
復制代碼
其中達到閥值以后,應該是進入連發狀態。即
s_u8KeyState = KEY_STATE_CONTINUE
復制代碼
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产在线一区二区三区
|
99国内精品久久久久久久
|
麻豆精品一区二区三区在线观看
|
99久久精品国产毛片
|
欧洲精品久久久久毛片完整版
|
久久中文字幕一区
|
一级网站
|
日韩有码在线观看
|
成年人在线视频
|
国产精品美女久久久久aⅴ国产馆
|
欧美一级黑人aaaaaaa做受
|
成年人在线观看
|
www.日韩
|
欧美精品一区二区三区在线播放
|
亚洲久久一区
|
成人在线观看黄
|
午夜在线视频一区二区三区
|
亚洲精品一级
|
欧美www在线观看
|
天天影视亚洲综合网
|
日本免费在线观看视频
|
国产精品资源在线观看
|
欧美全黄
|
人成久久
|
日韩中文字幕高清
|
色橹橹欧美在线观看视频高清
|
亚洲国产精品va在线看黑人
|
国产亚洲精品久久情网
|
精品一区二区三区四区
|
亚洲精品一区二区三区在线
|
欧美 日韩 亚洲91麻豆精品
|
日韩精品在线免费观看
|
亚洲三级av
|
日日操视频
|
国产欧美精品区一区二区三区
|
亚洲精品久久久久国产
|
aaa级片
|
成人午夜电影在线观看
|
美女天天操
|
国产男女视频网站
|
一区二区精品
|