|
天問(wèn)51的庫(kù)函數(shù)搬來(lái)你看看,也可以自己去翻代碼全開(kāi)源的。
#ifndef _EC11_51_H_
#define _EC11_51_H_
//----------------編碼器參數(shù)微調(diào)宏定義----------------//
#ifndef KEY_COUNT_DESHAKING
#define KEY_COUNT_DESHAKING 15 //按鍵消抖時(shí)間15
#endif
#ifndef KEY_COUNT_LONGT
#define KEY_COUNT_LONGT 1500 //長(zhǎng)按按鍵判斷時(shí)間1500
#endif
#ifndef KEY_COUNT_DUAL
#define KEY_COUNT_DUAL 180 //雙擊按鍵判斷時(shí)間180
#endif
#ifndef KEY_LONG_REPEAT
#define KEY_LONG_REPEAT 200 //長(zhǎng)按按鍵的回報(bào)率的倒數(shù),即一直長(zhǎng)按按鍵時(shí)響應(yīng)的時(shí)間間隔200
#endif
//----------------重入緩存結(jié)構(gòu)體----------------//
typedef struct tongdaoHC {
unsigned char EC11_A_dq; //EC11的A引腳讀到的當(dāng)前狀態(tài)
unsigned char EC11_B_dq; //EC11的B引腳讀到的當(dāng)前狀態(tài)
unsigned char EC11_D_dq; //EC11的D引腳讀到的當(dāng)前狀態(tài)
unsigned char EC11_A_Last; //EC11的A引腳上一次的狀態(tài)
unsigned char EC11_B_Last; //EC11的B引腳上一次的狀態(tài)
unsigned char EC11_IN_Click; //EC11按鍵狀態(tài)機(jī)動(dòng)作標(biāo)志
unsigned char EC11_j_km; //EC11判斷轉(zhuǎn)動(dòng)快慢的計(jì)數(shù)器
unsigned int EC11_j_COUNT; //EC11按鍵動(dòng)作計(jì)數(shù)器
}tongdaoHC;
//----------------函數(shù)聲明列表----------------//
unsigned char Encoder_EC11_Scan(tongdaoHC *HC);
//*******************************************************************/
//功能:掃描EC11旋轉(zhuǎn)編碼器的動(dòng)作并動(dòng)作分析
//形參:無(wú)
//返回:EC11動(dòng)作返回 0無(wú)動(dòng)作 1正轉(zhuǎn) 2反轉(zhuǎn) 3按著按鍵正轉(zhuǎn) 4按著按鍵反轉(zhuǎn) 5短按 6雙擊 7長(zhǎng)按 8長(zhǎng)按松開(kāi)
//詳解:對(duì)EC11旋轉(zhuǎn)編碼器的動(dòng)作進(jìn)行模式分析
//*******************************************************************/
unsigned char Encoder_EC11_Scan(tongdaoHC *HC)
{
unsigned char ScanResult = 0; //用于分析編碼器動(dòng)作的變量
if(HC->EC11_j_km)
HC->EC11_j_km--;
if(!HC->EC11_A_dq && !HC->EC11_A_Last && !HC->EC11_B_dq && HC->EC11_B_Last) //A相當(dāng)前狀態(tài)和上次狀態(tài)都為低電平時(shí),抓B相上次狀態(tài)為高當(dāng)前狀態(tài)為低的下降沿。
{
ScanResult = 1; //正轉(zhuǎn)
}
else if(!HC->EC11_A_dq && HC->EC11_A_Last && !HC->EC11_B_dq && !HC->EC11_B_Last) //B相當(dāng)前狀態(tài)和上次狀態(tài)都為低電平時(shí),抓A相上次狀態(tài)為高當(dāng)前狀態(tài)為低的下降沿。
{
ScanResult = 2; //反轉(zhuǎn)
}
HC->EC11_A_Last = HC->EC11_A_dq; //更新編碼器上一個(gè)狀態(tài)暫存變量
HC->EC11_B_Last = HC->EC11_B_dq; //更新編碼器上一個(gè)狀態(tài)暫存變量
if(HC->EC11_D_dq == 0) //如果EC11的按鍵按下,
{
if(ScanResult == 0) //狀態(tài)記錄值為0表示EC11沒(méi)有轉(zhuǎn)動(dòng)
{
ScanResult = 5; //返回值為5
}
else
{
if(ScanResult == 1) //按下按鍵時(shí)候正轉(zhuǎn)
{
HC->EC11_IN_Click = 7;
return 3; //編碼器按鍵按下并正轉(zhuǎn)返回值為3
}
if(ScanResult == 2) //按下按鍵時(shí)候反轉(zhuǎn)
{
HC->EC11_IN_Click = 7;
return 4; //編碼器按鍵按下并反轉(zhuǎn)返回值為4
}
}
}
else //如果EC11的按鍵沒(méi)有按下,
{
if(ScanResult==1)
return 1; //編碼器正轉(zhuǎn)返回值為1
else if(ScanResult==2)
return 2; //編碼器反轉(zhuǎn)返回值為2
}
if(HC->EC11_IN_Click = 7)//有旋轉(zhuǎn)動(dòng)作等待釋放
{
if(ScanResult==0) //按鍵被釋放
{
HC->EC11_IN_Click = 0; //按鍵狀態(tài)機(jī)清零
}
}
else //沒(méi)有旋轉(zhuǎn)動(dòng)作等待進(jìn)入按鍵處理
{
if(HC->EC11_j_COUNT<3000) //打開(kāi)按鍵按下時(shí)間定時(shí)器
HC->EC11_j_COUNT++;
switch (HC->EC11_IN_Click) //狀態(tài)機(jī)
{
case 0://初始狀態(tài)
if(ScanResult==5)
{
HC->EC11_IN_Click = 1; //進(jìn)入狀態(tài)1有鍵按下
HC->EC11_j_COUNT = 0; //復(fù)位計(jì)時(shí)器
}
break;
case 1://有鍵按下?tīng)顟B(tài)
if(ScanResult==5 && HC->EC11_j_COUNT > KEY_COUNT_DESHAKING)//按下消抖時(shí)間結(jié)束
{
HC->EC11_IN_Click = 2; //進(jìn)入狀態(tài)2按鍵以穩(wěn)定按下。
}
break;
case 2://按鍵以穩(wěn)定按下。
if(HC->EC11_j_COUNT <KEY_COUNT_DUAL && ScanResult==0)//按鍵釋放且計(jì)時(shí)小于180MS
{
HC->EC11_IN_Click = 3;//進(jìn)入狀態(tài)3按鍵雙擊等待狀態(tài)。
HC->EC11_j_COUNT = 0; //復(fù)位計(jì)時(shí)器
}
else if(HC->EC11_j_COUNT >=KEY_COUNT_DUAL && ScanResult==5)//按鍵按下且計(jì)時(shí)大于180MS
{
HC->EC11_IN_Click = 5;//進(jìn)入狀態(tài)5按鍵長(zhǎng)按等待狀態(tài)。
}
break;
case 3://按鍵雙擊等待狀態(tài)。
if(HC->EC11_j_COUNT <KEY_COUNT_DUAL && ScanResult==5)//按鍵按下且計(jì)時(shí)重新計(jì)數(shù)小于180MS
{
HC->EC11_IN_Click = 4;//進(jìn)入狀態(tài)4按鍵雙擊二次按下?tīng)顟B(tài)。
HC->EC11_j_COUNT = 0; //復(fù)位計(jì)時(shí)器
}
else if(HC->EC11_j_COUNT >=KEY_COUNT_DUAL && ScanResult==0)//按鍵釋放且計(jì)時(shí)重新計(jì)數(shù)大于180MS
{
HC->EC11_IN_Click = 0; //按鍵狀態(tài)機(jī)清零
return 5;//單擊返回5
}
break;
case 4://按鍵雙擊二次按下?tīng)顟B(tài)。
if(HC->EC11_j_COUNT > KEY_COUNT_DESHAKING && ScanResult==0)//按下消抖時(shí)間結(jié)束且按鍵被釋放
{
HC->EC11_IN_Click = 0; //按鍵狀態(tài)機(jī)清零
return 6; //雙擊返回鍵值6
}
break;
case 5://按鍵長(zhǎng)按等待狀態(tài)。
if(HC->EC11_j_COUNT <KEY_COUNT_LONGT && ScanResult==0)//按鍵被釋放且計(jì)時(shí)小于1600MS
{
HC->EC11_IN_Click = 0; //按鍵狀態(tài)機(jī)清零
return 5;//單擊返回5
}
else if(HC->EC11_j_COUNT >=KEY_COUNT_LONGT && ScanResult==5)//記錄鍵值在按下鍵值表里且計(jì)時(shí)大于1600MS
{
HC->EC11_IN_Click = 6;//進(jìn)入狀態(tài)6按鍵長(zhǎng)按時(shí)間到達(dá)狀態(tài)。
HC->EC11_j_COUNT = 0; //復(fù)位計(jì)時(shí)器
return 7;//連續(xù)按下返回鍵值
}
break;
case 6://按鍵長(zhǎng)按時(shí)間以到達(dá)。
if(ScanResult==0) //按鍵被釋放
{
HC->EC11_IN_Click = 0; //按鍵狀態(tài)機(jī)清零
return 8;//連續(xù)按下松開(kāi)返回鍵值
}
else if(HC->EC11_j_COUNT >=KEY_LONG_REPEAT && ScanResult==5)//記錄鍵值在按下鍵值表里大于200MS
{
HC->EC11_j_COUNT = 0; //復(fù)位計(jì)時(shí)器
return 7;//連續(xù)按下返回鍵值
}
break;
}
}
return 0;//沒(méi)有按鍵返回0
}
#endif |
|