生活随笔
收集整理的這篇文章主要介紹了
EC11旋转编码器驱动程序
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
EC11驅(qū)動程序
不多做介紹,百度上很多相關(guān)的介紹
首先,放上參考文檔
代碼有正轉(zhuǎn)、反轉(zhuǎn)、按下正轉(zhuǎn)、按下反轉(zhuǎn)、單機、雙擊、長按和長安松手檢測,有什么問題可以在下方留言
我是對該文檔代碼進行一些修改,偏向于我的習慣做的修改。
主要是作者的代碼在按下并旋轉(zhuǎn)的時候會觸發(fā)長按(也許是我移植的時候,改錯了什么所導致的)、雙擊,
我把它改為不觸發(fā)。并且讓函數(shù)做返回值處理,最終的按鍵操作在主函數(shù)或者單獨寫一個設(shè)置,便于后續(xù)移植。
#include "EncoderEC11.h"
void Encoder_EC11_Init(unsigned char Set_EC11_TYPE
)
{
EC11_A_Now
= 1;EC11_B_Now
= 1;EC11_Key
= 1;if(Set_EC11_TYPE
== 0){EC11_Type
= 0;}else{EC11_Type
= 1;}EC11_A_Last
= EC11_A_Now
; EC11_B_Last
= EC11_B_Now
;EC11_KEY_COUNT
= 0; EC11_KEY_DoubleClick_Count
= 0; FLAG_EC11_KEY_ShotClick
= 0; FLAG_EC11_KEY_LongClick
= 0; FLAG_EC11_KEY_DoubleClick
= 0;
}
char Encoder_EC11_Scan()
{
char ScanResult
= 0; if(EC11_Type
== 0) { if(EC11_A_Now
!= EC11_A_Last
) {if(EC11_A_Now
== 0){if(EC11_B_Now
==1) ScanResult
= 1; else ScanResult
= -1;}EC11_A_Last
= EC11_A_Now
; EC11_B_Last
= EC11_B_Now
; }} else { if(EC11_A_Now
!=EC11_A_Last
) { if(EC11_A_Now
== 1) {if((EC11_B_Last
== 1)&&(EC11_B_Now
== 0)) ScanResult
= 1; if((EC11_B_Last
== 0)&&(EC11_B_Now
== 1)) ScanResult
= -1; if((EC11_B_Last
== EC11_B_Now
)&&(EC11_B_Now
== 0)) ScanResult
= 1; if((EC11_B_Last
== EC11_B_Now
)&&(EC11_B_Now
== 1)) ScanResult
= -1; }else {if((EC11_B_Last
== 1)&&(EC11_B_Now
== 0)) ScanResult
= -1; if((EC11_B_Last
== 0)&&(EC11_B_Now
== 1)) ScanResult
= 1; if((EC11_B_Last
== EC11_B_Now
)&&(EC11_B_Now
== 0)) ScanResult
= -1; if((EC11_B_Last
== EC11_B_Now
)&&(EC11_B_Now
== 1)) ScanResult
= 1; } EC11_A_Last
= EC11_A_Now
; EC11_B_Last
= EC11_B_Now
; }} if(EC11_Key
== 0) {if(ScanResult
== 0) ScanResult
= 2; else{if(ScanResult
== 1) ScanResult
= 3; if(ScanResult
== -1) ScanResult
= -3; }}return ScanResult
;
}
char Encoder_EC11_Analyze(char EC11_Value
)
{static bit FLAG_KEY_invalid
;char AnalyzeResult
= 0;static unsigned int TMP_Value
= 0; if(EC11_Value
== 1) {AnalyzeResult
= 1;}else if(EC11_Value
== -1) {AnalyzeResult
= 2;}else if(EC11_Value
== 3){AnalyzeResult
= 3;}else if(EC11_Value
== -3){AnalyzeResult
= 4;}if((AnalyzeResult
== 3) || (AnalyzeResult
== 4)){FLAG_KEY_invalid
= 1;EC11_KEY_COUNT
= 0;FLAG_EC11_KEY_ShotClick
= 0;FLAG_EC11_KEY_LongClick
= 0;FLAG_EC11_KEY_DoubleClick
= 0;EC11_KEY_DoubleClick_Count
= 0;}if(FLAG_KEY_invalid
== 0){if(EC11_Value
== 2) {if(EC11_KEY_COUNT
<10000) EC11_KEY_COUNT
++;if(EC11_KEY_COUNT
== KEY_COUNT_DESHAKING
) { FLAG_EC11_KEY_ShotClick
= 1;}if((EC11_KEY_DoubleClick_Count
> 0)&&(EC11_KEY_DoubleClick_Count
<= KEY_COUNT_DUALCLICKTIME
)) { FLAG_EC11_KEY_DoubleClick
= 1;}if(EC11_KEY_COUNT
== KEY_COUNT_LONGTIME
) { FLAG_EC11_KEY_LongClick
= 1;FLAG_EC11_KEY_ShotClick
= 0;}}else {if(EC11_KEY_COUNT
< KEY_COUNT_DESHAKING
) {EC11_KEY_COUNT
= 0;FLAG_EC11_KEY_ShotClick
= 0;FLAG_EC11_KEY_LongClick
= 0;FLAG_EC11_KEY_DoubleClick
= 0;EC11_KEY_DoubleClick_Count
= 0;}else{if(FLAG_EC11_KEY_ShotClick
== 1) {if((FLAG_EC11_KEY_DoubleClick
== 0)&&(EC11_KEY_DoubleClick_Count
>= 0)) EC11_KEY_DoubleClick_Count
++;if((FLAG_EC11_KEY_DoubleClick
== 1)&&(EC11_KEY_DoubleClick_Count
<= KEY_COUNT_DUALCLICKTIME
)) { FLAG_EC11_KEY_DoubleClick
= 2;} if((FLAG_EC11_KEY_DoubleClick
== 0)&&(EC11_KEY_DoubleClick_Count
> KEY_COUNT_DUALCLICKTIME
)) FLAG_EC11_KEY_ShotClick
= 0; }if(FLAG_EC11_KEY_LongClick
== 1) FLAG_EC11_KEY_LongClick
= 0;}}if(EC11_KEY_COUNT
> KEY_COUNT_DESHAKING
) {if((FLAG_EC11_KEY_ShotClick
== 0)&&(EC11_KEY_DoubleClick_Count
> KEY_COUNT_DUALCLICKTIME
)&&(EC11_KEY_COUNT
< KEY_COUNT_LONGTIME
)) {AnalyzeResult
= 5;EC11_KEY_COUNT
= 0;EC11_KEY_DoubleClick_Count
= 0;FLAG_EC11_KEY_DoubleClick
= 0;}if((FLAG_EC11_KEY_DoubleClick
== 2)&&(EC11_KEY_DoubleClick_Count
> 0)&&(EC11_KEY_DoubleClick_Count
<= KEY_COUNT_DUALCLICKTIME
)) {AnalyzeResult
= 6;EC11_KEY_COUNT
= 0;EC11_KEY_DoubleClick_Count
= 0;FLAG_EC11_KEY_ShotClick
= 0;FLAG_EC11_KEY_DoubleClick
= 0;}if((FLAG_EC11_KEY_LongClick
== 1)&&(EC11_KEY_COUNT
>= KEY_COUNT_LONGTIME
)) {TMP_Value
++;if(TMP_Value
% KEY_LONG_REPEAT_TIME
== 0){TMP_Value
= 0;AnalyzeResult
= 8;}}if((FLAG_EC11_KEY_LongClick
== 0)&&(EC11_KEY_COUNT
>= KEY_COUNT_LONGTIME
)) { AnalyzeResult
= 7;EC11_KEY_COUNT
= 0;}} }if(EC11_Key
== 1){FLAG_KEY_invalid
= 0;}return AnalyzeResult
;
}
#ifndef __EncoderEC11_H
#define __EncoderEC11_H
#include <stc8.h>
#define EC11_A_Now P00
#define EC11_B_Now P01
#define EC11_Key P02
extern int G_PWM_NUM1
;
extern int G_PWM_NUM2
;
extern int G_PWM_NUM3
;
static unsigned char EC11_NUM_SW
= 0;
#define EC11_SCAN_PERIOD_MS 1
#define KEY_COUNT_DESHAKING ( 20/EC11_SCAN_PERIOD_MS)
#define KEY_COUNT_LONGTIME (600/EC11_SCAN_PERIOD_MS)
#define KEY_COUNT_DUALCLICKTIME (150/EC11_SCAN_PERIOD_MS)
#define KEY_LONG_REPEAT_TIME (200/EC11_SCAN_PERIOD_MS)
static char EC11_A_Last
= 0;
static char EC11_B_Last
= 0;
static char EC11_Type
= 1; static int EC11_KEY_COUNT
= 0;
static int EC11_KEY_DoubleClick_Count
= 0;
static char FLAG_EC11_KEY_ShotClick
= 0;
static char FLAG_EC11_KEY_LongClick
= 0;
static char FLAG_EC11_KEY_DoubleClick
= 0;
void Encoder_EC11_Init(unsigned char Set_EC11_TYPE
);
char Encoder_EC11_Scan();
char Encoder_EC11_Analyze(char EC11_Value
);#endif
這里我買的編碼旋鈕不知道為什么無法把單片機準雙向模式的IO口拉低(拿示波器才發(fā)現(xiàn)),于是設(shè)置為開漏模式,也可以設(shè)置為高阻模式
#include "EncoderEC11.h"
#include <stc8.h>
#include <stdio.h>void Timer0Init(void);
void UartInit(void);
void SeriPushSend(unsigned char *pStr
);void main(void)
{
P0M0
= 0xFF;P0M1
= 0XFF;UartInit(); Timer0Init(); Encoder_EC11_Init(0);ET0
= 1;EA
= 1;while(1){
}
}void timer0(void) interrupt
1
{static int dat
;char str
[5];dat
= Encoder_EC11_Analyze(Encoder_EC11_Scan());if(dat
){sprintf(str
,"%d\r\n",dat
);SeriPushSend(str
);
}
}void Timer0Init(void)
{AUXR
|= 0x80; TMOD
&= 0xF0; TL0
= 0x40; TH0
= 0xA2; TF0
= 0; TR0
= 1;
}
void UartInit(void)
{SCON
= 0x50; AUXR
|= 0x40; AUXR
&= 0xFE; TMOD
&= 0x0F; TL1
= 0xCC; TH1
= 0xFF; ET1
= 0; TR1
= 1;
}
void SeriPushSend(unsigned char *pStr
)
{while(*pStr
!= '\0'){SBUF
= *pStr
;while(TI
== 0);TI
= 0;pStr
++;}
}
希望看完原作者文章的你,也能去注冊并點個贊。
總結(jié)
以上是生活随笔為你收集整理的EC11旋转编码器驱动程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。