按鍵掃描驅(qū)動(dòng),支持按鍵的長(zhǎng)按和短按事件(未實(shí)現(xiàn)雙擊事件)想许,key_Scan()函數(shù)得到相應(yīng)的鍵值伶授,主程序根據(jù)鍵值進(jìn)行動(dòng)作。
三個(gè)按鍵:Key_SPA Key_ZER Key_MEN
Key_Board.h
#ifndef Key_Board
#define Key_Board
#include <SH79F1611.h>
#include "Timer_Init.h"
typedef struct
{
unsigned char Short_Press:1; //短按
unsigned char Long_Press:1; //長(zhǎng)按
unsigned char Double_Press:1; //雙擊
}Key_State;
extern xdata Key_State Key_SPA,Key_ZER,Key_MEN;
void Key_Init(void);
void Key_Scan(void);
#endif
key_Board.c
#include "Key_Board.h"
sbit SPA = P4^3;
sbit ZER = P4^2;
////按鍵狀態(tài)結(jié)構(gòu)體定義 三個(gè)按鍵 SPA/ZER/MEN
xdata Key_State Key_SPA = {0,0,0};
xdata Key_State Key_ZER = {0,0,0};
xdata Key_State Key_MEN = {0,0,0};
//按鍵初始化
void Key_Init(void)
{
P4CR &= ~0x0c; //P4^2 P4^3 設(shè)置為輸入接口
P4PCR |= 0x0c; //輸入上拉
P4CR |= 0x02; //P4.1輸出 作為按鍵地
P4 &= ~0x02;
}
bit Key_Down_SPA_Short = 1;
bit Key_Down_ZER_Short = 1;
bit Key_Down_MEN_Short = 1;
bit Key_Down_SPA_Long = 1;
bit Key_Down_ZER_Long = 1;
bit Key_Down_MEN_Long = 1;
/*****************************************************************************
*1:按鍵掃描函數(shù) 三個(gè)按鍵公用兩個(gè)IO口 先掃描SPA/ZER按鍵 再掃描MOD按鍵
*2:程序支持按鍵短按和長(zhǎng)按 短按按鍵在按鍵抬起后取值 長(zhǎng)按按鍵在按鍵按下時(shí)可取值
*3:按鍵長(zhǎng)按后抬起伸刃,取得長(zhǎng)按鍵值谎砾,短按鍵值被屏蔽
******************************************************************************/
void Key_Scan(void)
{
static xdata char cnt = 0;
if((SPA==0) && (ZER==0)) //不支持同時(shí)按鍵
{
return ;
}
if(SPA == 0) //當(dāng)SPA按鍵按下
{
if((Key_Down_SPA_Short == 1)&&(Key_Down_SPA_Long == 1))
{
if(cnt++ >= 1) //20ms防抖
{
cnt = 0;
Key_Down_SPA_Short = 0;
Key_Timing = 0; //按鍵計(jì)數(shù)變量清0
}
}
else
if(Key_Down_SPA_Long == 1)
{
if(Key_Timing >= 300)
{
Key_Timing = 0;
Key_Down_SPA_Long = 0;
Key_SPA.Long_Press = 1;
Key_Down_SPA_Short = 1;
}
}
}
else
if(ZER == 0) //當(dāng)ZER按鍵按下
{
if((Key_Down_ZER_Short == 1)&&(Key_Down_ZER_Long == 1))
{
if(cnt++ >= 1) //20ms防抖
{
cnt = 0;
Key_Down_ZER_Short = 0;
Key_Timing = 0; //按鍵計(jì)數(shù)變量清0
}
}
else
if(Key_Down_ZER_Long == 1)
{
if(Key_Timing >= 200)
{
Key_Timing = 0;
Key_Down_ZER_Long = 0;
Key_ZER.Long_Press = 1;
Key_Down_ZER_Short = 1;
}
}
}
else
{
P4CR |= 0x04; //設(shè)置ZER按鍵對(duì)應(yīng)的IO口為輸出 輸出為0
ZER = 0;
if(SPA == 0) //當(dāng)MOD按鍵按下
{
if((Key_Down_MEN_Short == 1)&&(Key_Down_MEN_Long == 1))
{
if(cnt++ >= 1) //20ms防抖
{
cnt = 0;
Key_Down_MEN_Short = 0;
Key_Timing = 0; //按鍵計(jì)數(shù)變量清0
}
}
else
if(Key_Down_MEN_Long == 1)
{
if(Key_Timing >= 200)
{
Key_Timing = 0;
Key_Down_MEN_Long = 0;
Key_MEN.Long_Press = 1;
Key_Down_MEN_Short = 1;
}
}
}
else
if((SPA == 1) && ((Key_Down_MEN_Short == 0) || (Key_Down_MEN_Long == 0)))
{
if(Key_Down_MEN_Short == 0)
{
Key_Down_MEN_Short = 1;
Key_MEN.Short_Press = 1; //MEN短按
}
if(Key_Down_MEN_Long == 0)
{
Key_Down_MEN_Long = 1;
Key_MEN.Long_Press = 0;
}
}
P4CR &= ~0x04; //設(shè)置ZER按鍵對(duì)應(yīng)的IO口為輸入
P4PCR |= 0x04; //輸入上拉
}
if(SPA == 1)
{
if(Key_Down_SPA_Short == 0)
{
Key_Down_SPA_Short = 1;
Key_SPA.Short_Press = 1;
}
if(Key_Down_SPA_Long == 0)
{
Key_Down_SPA_Long = 1;
Key_SPA.Long_Press = 0;
}
}
if(ZER == 1)
{
if(Key_Down_ZER_Short == 0)
{
Key_Down_ZER_Short = 1;
Key_ZER.Short_Press = 1;
}
if(Key_Down_ZER_Long == 0)
{
Key_Down_ZER_Long = 1;
Key_ZER.Long_Press = 0;
}
}
if(Key_ZER.Long_Press==1 || Key_ZER.Short_Press==1 || Key_SPA.Long_Press==1 || Key_SPA.Short_Press==1 || Key_MEN.Long_Press==1 ||Key_MEN.Short_Press==1)
{
Set_Menu_Timeouy_5s = 0; //有按鍵按下 菜單計(jì)數(shù)清0
}
}