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