日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EC11旋转编码器驱动程序

發(fā)布時間:2024/3/12 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EC11旋转编码器驱动程序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

EC11驅(qū)動程序

不多做介紹,百度上很多相關(guān)的介紹
首先,放上參考文檔
代碼有正轉(zhuǎn)、反轉(zhuǎn)、按下正轉(zhuǎn)、按下反轉(zhuǎn)、單機、雙擊、長按和長安松手檢測,有什么問題可以在下方留言

我是對該文檔代碼進行一些修改,偏向于我的習慣做的修改。
主要是作者的代碼在按下并旋轉(zhuǎn)的時候會觸發(fā)長按(也許是我移植的時候,改錯了什么所導致的)、雙擊,
我把它改為不觸發(fā)。并且讓函數(shù)做返回值處理,最終的按鍵操作在主函數(shù)或者單獨寫一個設(shè)置,便于后續(xù)移植。

  • EncoderEC11.c
//---->>>>----文件描述:EC11旋轉(zhuǎn)編碼器底層驅(qū)動程序---<<<<----// //---->>>>----文件版本:V1.0----<<<<----// #include "EncoderEC11.h"//-------->>>>>>>>--------注意事項:EC11旋轉(zhuǎn)編碼器的掃描時間間隔控制在1~4ms之間,否則5ms及以上的掃描時間在快速旋轉(zhuǎn)時可能會誤判旋轉(zhuǎn)方向--------<<<<<<<<--------////*******************************************************************/ //功能:初始化EC11旋轉(zhuǎn)編碼器相關(guān)參數(shù) //形參:EC11旋轉(zhuǎn)編碼器的類型-->> unsigned char Set_EC11_TYPE <<-- :0----一定位對應一脈沖;1(或非0)----兩定位對應一脈沖。 //返回:無 //詳解:對EC11旋轉(zhuǎn)編碼器的連接IO口做IO口模式設(shè)置。以及將相關(guān)的變量進行初始化 //*******************************************************************/ void Encoder_EC11_Init(unsigned char Set_EC11_TYPE) { // //IO口模式初始化。初始化EC11的IO口為準雙向模式 // P35_QB(); // P36_QB(); // P37_QB();EC11_A_Now = 1;EC11_B_Now = 1;EC11_Key = 1;//EC11類型選擇:0-一定位一脈沖;1-兩定位一脈沖if(Set_EC11_TYPE == 0){EC11_Type = 0;}else{EC11_Type = 1;}//避免上電時EC11旋鈕位置不確定導致一次動作誤判EC11_A_Last = EC11_A_Now; EC11_B_Last = EC11_B_Now;//--------清除按鍵計數(shù)器和標志位--------//EC11_KEY_COUNT = 0; //EC11按鍵動作計數(shù)器EC11_KEY_DoubleClick_Count = 0; //EC11按鍵雙擊動作計數(shù)器FLAG_EC11_KEY_ShotClick = 0; //EC11按鍵短按動作標志FLAG_EC11_KEY_LongClick = 0; //EC11按鍵長按動作標志FLAG_EC11_KEY_DoubleClick = 0; //EC11按鍵雙擊動作標志 }//*******************************************************************/ //功能:掃描EC11旋轉(zhuǎn)編碼器的動作并將參數(shù)返回給動作分析函數(shù)使用 //形參:EC11旋轉(zhuǎn)編碼器的類型-->> unsigned char Set_EC11_TYPE <<-- :0----一定位對應一脈沖;1(或非0)----兩定位對應一脈沖 //返回:EC11旋轉(zhuǎn)編碼器的掃描結(jié)果-->> char ScanResult -->> 0:無動作;1:正轉(zhuǎn); -1:反轉(zhuǎn);2:只按下按鍵;3:按著按鍵正轉(zhuǎn);-3:按著按鍵反轉(zhuǎn) //詳解:只掃描EC11旋轉(zhuǎn)編碼器有沒有動作,不關(guān)心是第幾次按下按鍵或長按或雙擊。返回值直接作為形參傳給 [ void Encoder_EC11_Analyze(char EC11_Value); ] 函數(shù)使用 //*******************************************************************/ char Encoder_EC11_Scan() { //以下儲存A、B上一次值的變量聲明為靜態(tài)全局變量,方便對EC11對應的IO口做初始化 // static char EC11_A_Last = 0; // static char EC11_B_Last = 0;char ScanResult = 0; //返回編碼器掃描結(jié)果,用于分析編碼器的動作//返回值的取值: 0:無動作; 1:正轉(zhuǎn); -1:反轉(zhuǎn); // 2:只按下按鍵; 3:按著按鍵正轉(zhuǎn); -3:按著按鍵反轉(zhuǎn)//======================================================//if(EC11_Type == 0) //================一定位對應一脈沖的EC11================//{ //======================================================//if(EC11_A_Now != EC11_A_Last) //以A為時鐘,B為數(shù)據(jù)。正轉(zhuǎn)時AB反相,反轉(zhuǎn)時AB同相{if(EC11_A_Now == 0){if(EC11_B_Now ==1) //只需要采集A的上升沿或下降沿的任意一個狀態(tài),若A下降沿時B為1,正轉(zhuǎn) ScanResult = 1; //正轉(zhuǎn)else //反轉(zhuǎn)ScanResult = -1;}EC11_A_Last = EC11_A_Now; //更新編碼器上一個狀態(tài)暫存變量EC11_B_Last = EC11_B_Now; //更新編碼器上一個狀態(tài)暫存變量}} //======================================================//else //================兩定位對應一脈沖的EC11================//{ //======================================================//if(EC11_A_Now !=EC11_A_Last) //當A發(fā)生跳變時采集B當前的狀態(tài),并將B與上一次的狀態(tài)進行對比。{ //若A 0->1 時,B 1->0 正轉(zhuǎn);若A 1->0 時,B 0->1 正轉(zhuǎn);//若A 0->1 時,B 0->1 反轉(zhuǎn);若A 1->0 時,B 1->0 反轉(zhuǎn)if(EC11_A_Now == 1) //EC11_A和上一次狀態(tài)相比,為上升沿{if((EC11_B_Last == 1)&&(EC11_B_Now == 0)) //EC11_B和上一次狀態(tài)相比,為下降沿ScanResult = 1; //正轉(zhuǎn)if((EC11_B_Last == 0)&&(EC11_B_Now == 1)) //EC11_B和上一次狀態(tài)相比,為上升沿 ScanResult = -1; //反轉(zhuǎn)//>>>>>>>>>>>>>>>>下面為正轉(zhuǎn)一次再反轉(zhuǎn)或反轉(zhuǎn)一次再正轉(zhuǎn)處理<<<<<<<<<<<<<<<<//if((EC11_B_Last == EC11_B_Now)&&(EC11_B_Now == 0)) //A上升沿時,采集的B不變且為0ScanResult = 1; //正轉(zhuǎn)if((EC11_B_Last == EC11_B_Now)&&(EC11_B_Now == 1)) //A上升沿時,采集的B不變且為1ScanResult = -1; //反轉(zhuǎn)}else //EC11_A和上一次狀態(tài)相比,為下降沿{if((EC11_B_Last == 1)&&(EC11_B_Now == 0)) //EC11_B和上一次狀態(tài)相比,為下降沿ScanResult = -1; //反轉(zhuǎn)if((EC11_B_Last == 0)&&(EC11_B_Now == 1)) //EC11_B和上一次狀態(tài)相比,為上升沿ScanResult = 1; //正轉(zhuǎn)//>>>>>>>>>>>>>>>>下面為正轉(zhuǎn)一次再反轉(zhuǎn)或反轉(zhuǎn)一次再正轉(zhuǎn)處理<<<<<<<<<<<<<<<<//if((EC11_B_Last == EC11_B_Now)&&(EC11_B_Now == 0)) //A上升沿時,采集的B不變且為0ScanResult = -1; //反轉(zhuǎn)if((EC11_B_Last == EC11_B_Now)&&(EC11_B_Now == 1)) //A上升沿時,采集的B不變且為1 ScanResult = 1; //正轉(zhuǎn)} EC11_A_Last = EC11_A_Now; //更新編碼器上一個狀態(tài)暫存變量EC11_B_Last = EC11_B_Now; //更新編碼器上一個狀態(tài)暫存變量}} if(EC11_Key == 0) //如果EC11的按鍵按下,并且沒有EC11沒有轉(zhuǎn)動,{if(ScanResult == 0) //按下按鍵時未轉(zhuǎn)動ScanResult = 2; //返回值為2else{if(ScanResult == 1) //按下按鍵時候正轉(zhuǎn)ScanResult = 3; //返回值為3if(ScanResult == -1) //按下按鍵時候反轉(zhuǎn)ScanResult = -3; //返回值為-3}}return ScanResult; //返回值的取值: 0:無動作; 1:正轉(zhuǎn); -1:反轉(zhuǎn); } // 2:只按下按鍵; 3:按著按鍵正轉(zhuǎn); -3:按著按鍵反轉(zhuǎn)//*******************************************************************/ //功能:對EC11旋轉(zhuǎn)編碼器的動作進行分析,并作出相應的動作處理代碼 //形參:無 //返回:char AnalyzeResult = 0;目前無用。若在該函數(shù)里做了動作處理,則函數(shù)的返回值無需理會 //詳解:對EC11旋轉(zhuǎn)編碼器的動作進行模式分析,是單擊還是雙擊還是長按松手還是一直按下。形參從 [ char Encoder_EC11_Scan(unsigned char Set_EC11_TYPE) ] 函數(shù)傳入。在本函數(shù)內(nèi)修改需要的動作處理代碼 //*******************************************************************/ char Encoder_EC11_Analyze(char EC11_Value) {static bit FLAG_KEY_invalid;char AnalyzeResult = 0;static unsigned int TMP_Value = 0; //中間計數(shù)值,用于連續(xù)長按按鍵的動作延時間隔//>>>>>>>>>>>>>>>>編碼器正轉(zhuǎn)處理程序<<<<<<<<<<<<<<<<//if(EC11_Value == 1) //正轉(zhuǎn){//--------編碼器正轉(zhuǎn)動作代碼--------//AnalyzeResult = 1;}//>>>>>>>>>>>>>>>>編碼器反轉(zhuǎn)處理程序<<<<<<<<<<<<<<<<//else if(EC11_Value == -1) //反轉(zhuǎn){//--------編碼器反轉(zhuǎn)動作代碼--------//AnalyzeResult = 2;}//>>>>>>>>>>>>>>>>編碼器按鍵按下并正轉(zhuǎn)處理程序<<<<<<<<<<<<<<<<//else if(EC11_Value == 3){//--------編碼器按鍵按下并正轉(zhuǎn)動作代碼--------//AnalyzeResult = 3;}//>>>>>>>>>>>>>>>>編碼器按鍵按下并反轉(zhuǎn)處理程序<<<<<<<<<<<<<<<<//else if(EC11_Value == -3){//--------編碼器按鍵按下并反轉(zhuǎn)動作代碼--------//AnalyzeResult = 4;}if((AnalyzeResult == 3) || (AnalyzeResult == 4))// 按下并轉(zhuǎn)動{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)) //松開按鍵后,又在定時器在雙擊時間內(nèi)按下按鍵{ //置位雙擊按鍵標志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)) //如果在規(guī)定雙擊時間內(nèi)再次按下按鍵{ //認為按鍵是雙擊動作FLAG_EC11_KEY_DoubleClick = 2;} if((FLAG_EC11_KEY_DoubleClick == 0)&&(EC11_KEY_DoubleClick_Count > KEY_COUNT_DUALCLICKTIME)) //如果沒有在規(guī)定雙擊時間內(nèi)再次按下按鍵FLAG_EC11_KEY_ShotClick = 0; //認為按鍵是單擊動作}if(FLAG_EC11_KEY_LongClick == 1) //檢測到長按按鍵松開FLAG_EC11_KEY_LongClick = 0;}}//>>>>>>>>>>>>>>>>編碼器按鍵分析處理程序<<<<<<<<<<<<<<<<//if(EC11_KEY_COUNT > KEY_COUNT_DESHAKING) //短按按鍵延時到了時間{//短按按鍵動作結(jié)束代碼if((FLAG_EC11_KEY_ShotClick == 0)&&(EC11_KEY_DoubleClick_Count > KEY_COUNT_DUALCLICKTIME)&&(EC11_KEY_COUNT < KEY_COUNT_LONGTIME)) //短按按鍵動作結(jié)束代碼{//--------短按按鍵動作結(jié)束代碼--------//AnalyzeResult = 5;//--------清除標志位--------//EC11_KEY_COUNT = 0;EC11_KEY_DoubleClick_Count = 0;FLAG_EC11_KEY_DoubleClick = 0;}//雙擊按鍵動作結(jié)束代碼if((FLAG_EC11_KEY_DoubleClick == 2)&&(EC11_KEY_DoubleClick_Count > 0)&&(EC11_KEY_DoubleClick_Count <= KEY_COUNT_DUALCLICKTIME)) //雙擊按鍵動作結(jié)束代碼{//--------雙擊按鍵動作結(jié)束代碼--------//AnalyzeResult = 6;//--------清除標志位--------//EC11_KEY_COUNT = 0;EC11_KEY_DoubleClick_Count = 0;FLAG_EC11_KEY_ShotClick = 0;FLAG_EC11_KEY_DoubleClick = 0;}//連續(xù)長按按鍵按下代碼if((FLAG_EC11_KEY_LongClick == 1)&&(EC11_KEY_COUNT >= KEY_COUNT_LONGTIME)) //連續(xù)長按按鍵按下代碼{TMP_Value ++;if(TMP_Value % KEY_LONG_REPEAT_TIME == 0){TMP_Value = 0;//-------連續(xù)長按按鍵按下代碼--------//AnalyzeResult = 8;}}//長按按鍵動作結(jié)束代碼if((FLAG_EC11_KEY_LongClick == 0)&&(EC11_KEY_COUNT >= KEY_COUNT_LONGTIME)) //長按按鍵動作結(jié)束代碼{ //--------長按按鍵按下動作結(jié)束代碼--------//AnalyzeResult = 7;//--------清除標志位--------//EC11_KEY_COUNT = 0;}} }if(EC11_Key == 1){FLAG_KEY_invalid = 0;}return AnalyzeResult;//1:正轉(zhuǎn) // 2:反轉(zhuǎn) // 3:按下并正轉(zhuǎn) // 4:按下并反轉(zhuǎn) // 5:短按 // 6:雙擊 // 7:長按結(jié)束 // 8:長按 }
  • EncoderEC11.h
//---->>>>----文件描述:EC11旋轉(zhuǎn)編碼器底層驅(qū)動程序---<<<<----// //---->>>>----文件版本:V1.0----<<<<----// #ifndef __EncoderEC11_H #define __EncoderEC11_H//#include "config.H" #include <stc8.h>//----------------IO口定義----------------// #define EC11_A_Now P00 //EC11的A引腳,視為時鐘線 #define EC11_B_Now P01 //EC11的B引腳,視為信號線 #define EC11_Key P02 //EC11的按鍵//----------------編碼器動作代碼相關(guān)定義----------------// extern int G_PWM_NUM1; extern int G_PWM_NUM2; extern int G_PWM_NUM3; static unsigned char EC11_NUM_SW = 0;//----------------編碼器參數(shù)微調(diào)宏定義----------------// #define EC11_SCAN_PERIOD_MS 1 //EC11編碼器掃描周期 #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) //長按按鍵的回報率的倒數(shù),即一直長按按鍵時響應的時間間隔//----------------局部文件內(nèi)變量列表----------------// static char EC11_A_Last = 0; //EC11的A引腳上一次的狀態(tài) static char EC11_B_Last = 0; //EC11的B引腳上一次的狀態(tài) static char EC11_Type = 1; //定義變量暫存EC11的類型---->>>>---- 0:一定位對應一脈沖; 1:兩定位對應一脈沖//所謂一定位對應一脈沖,是指EC11旋轉(zhuǎn)編碼器每轉(zhuǎn)動一格,A和B都會輸出一個完整的方波。//而 兩定位對應一脈沖,是指EC11旋轉(zhuǎn)編碼器每轉(zhuǎn)動兩格,A和B才會輸出一個完整的方波,只轉(zhuǎn)動一格只輸出A和B的上升沿或下降沿static int EC11_KEY_COUNT = 0; //EC11按鍵動作計數(shù)器 static int EC11_KEY_DoubleClick_Count = 0; //EC11按鍵雙擊動作計數(shù)器 static char FLAG_EC11_KEY_ShotClick = 0; //EC11按鍵短按動作標志 static char FLAG_EC11_KEY_LongClick = 0; //EC11按鍵長按動作標志 static char FLAG_EC11_KEY_DoubleClick = 0; //EC11按鍵雙擊動作標志//----------------函數(shù)快速調(diào)用(復制粘貼)列表----------------// // /******************************************************************* void Encoder_EC11_Init(unsigned char Set_EC11_TYPE); //初始化EC11旋轉(zhuǎn)編碼器IO口和類型以及變量初始化 char Encoder_EC11_Scan(); //掃描旋轉(zhuǎn)編碼器的動作 void Encoder_EC11_Analyze(char EC11_Value); //分析EC11旋轉(zhuǎn)編碼器的動作以及動作處理代碼 ******************************************************************/ //-------->>>>>>>>--------注意事項:EC11旋轉(zhuǎn)編碼器的掃描時間間隔控制在1~4ms之間,否則5ms及以上的掃描時間在快速旋轉(zhuǎn)時可能會誤判旋轉(zhuǎn)方向--------<<<<<<<<--------// //-------->>>>>>>>--------注意事項:EC11旋轉(zhuǎn)編碼器的掃描時間間隔控制在1~4ms之間,否則5ms及以上的掃描時間在快速旋轉(zhuǎn)時可能會誤判旋轉(zhuǎn)方向--------<<<<<<<<--------// //-------->>>>>>>>--------注意事項:EC11旋轉(zhuǎn)編碼器的掃描時間間隔控制在1~4ms之間,否則5ms及以上的掃描時間在快速旋轉(zhuǎn)時可能會誤判旋轉(zhuǎn)方向--------<<<<<<<<--------////----------------函數(shù)聲明列表----------------// // //*******************************************************************/ //功能:初始化EC11旋轉(zhuǎn)編碼器相關(guān)參數(shù) //形參:EC11旋轉(zhuǎn)編碼器的類型-->> unsigned char Set_EC11_TYPE <<-- :0----一定位對應一脈沖;1(或非0)----兩定位對應一脈沖。 //返回:無 //詳解:對EC11旋轉(zhuǎn)編碼器的連接IO口做IO口模式設(shè)置。以及將相關(guān)的變量進行初始化 //*******************************************************************/ void Encoder_EC11_Init(unsigned char Set_EC11_TYPE);//*******************************************************************/ //功能:掃描EC11旋轉(zhuǎn)編碼器的動作并將參數(shù)返回給動作分析函數(shù)使用 //形參:EC11旋轉(zhuǎn)編碼器的類型-->> unsigned char Set_EC11_TYPE <<-- :0----一定位對應一脈沖;1(或非0)----兩定位對應一脈沖 //返回:EC11旋轉(zhuǎn)編碼器的掃描結(jié)果-->> char ScanResult -->> 0:無動作;1:正轉(zhuǎn); -1:反轉(zhuǎn);2:只按下按鍵;3:按著按鍵正轉(zhuǎn);-3:按著按鍵反轉(zhuǎn) //詳解:只掃描EC11旋轉(zhuǎn)編碼器有沒有動作,不關(guān)心是第幾次按下按鍵或長按或雙擊。返回值直接作為形參傳給 [ void Encoder_EC11_Analyze(char EC11_Value); ] 函數(shù)使用 //*******************************************************************/ char Encoder_EC11_Scan();//*******************************************************************/ //功能:對EC11旋轉(zhuǎn)編碼器的動作進行分析,并作出相應的動作處理代碼 //形參:無 //返回:char AnalyzeResult = 0;目前無用。若在該函數(shù)里做了動作處理,則函數(shù)的返回值無需理會 //詳解:對EC11旋轉(zhuǎn)編碼器的動作進行模式分析,是單擊還是雙擊還是長按松手還是一直按下。形參從 [ char Encoder_EC11_Scan(unsigned char Set_EC11_TYPE) ] 函數(shù)傳入。在本函數(shù)內(nèi)修改需要的動作處理代碼 //*******************************************************************/ char Encoder_EC11_Analyze(char EC11_Value);#endif//---->>>>----函數(shù)使用示例----<<<<----// /********#include "config.h" #include "delay.h" #include "EncoderEC11.h"int cnt = -1; //流水燈速查表偏移變量 unsigned char disp_tmp[] = {~0x01,~0x02,~0x04,~0x08,~0x10,~0x20,~0x40,~0x80}; //流水燈速查表void Timer0Init(void) //1毫秒@22.1184MHz {AUXR &= 0x7F; //定時器時鐘12T模式TMOD &= 0xF0; //設(shè)置定時器模式TL0 = 0xCD; //設(shè)置定時初值TH0 = 0xF8; //設(shè)置定時初值TF0 = 0; //清除TF0標志TR0 = 1; //定時器0開始計時 }void main() {P1_QB_ALL();P2_QB_ALL();P3_QB_ALL();delay_ms(50); //延時100毫秒等待所有MCU復位Encoder_EC11_Init(1);EA = 1;ET0 = 1;Timer0Init();while(1){}}//-------->>>>>>>>--------注意事項:EC11旋轉(zhuǎn)編碼器的掃描時間間隔控制在1~4ms之間,否則5ms及以上的掃描時間在快速旋轉(zhuǎn)時可能會誤判旋轉(zhuǎn)方向--------<<<<<<<<--------// void T0_ISR() interrupt 1 {static int tmp =0;Encoder_EC11_Analyze(Encoder_EC11_Scan());if(P33 == 0){tmp ++;if(tmp == 500){tmp =0;P27 = !P27;}} }********/

這里我買的編碼旋鈕不知道為什么無法把單片機準雙向模式的IO口拉低(拿示波器才發(fā)現(xiàn)),于是設(shè)置為開漏模式,也可以設(shè)置為高阻模式

  • main.c
#include "EncoderEC11.h" #include <stc8.h> #include <stdio.h>void Timer0Init(void); //1毫秒@24.000MHz void UartInit(void); //115200bps@24.000MHz void SeriPushSend(unsigned char *pStr);//int dat;void main(void) { // char str[5];P0M0 = 0xFF;//設(shè)置為開漏模式P0M1 = 0XFF;UartInit(); //115200bps@24.000MHzTimer0Init(); //1毫秒@24.000MHzEncoder_EC11_Init(0);//0-一定位對應一脈沖;1-兩定位對應一脈沖ET0 = 1;EA = 1;while(1){ // if(dat) // { // sprintf(str,"%d\r\n",dat); // SeriPushSend(str); // dat = 0; // }} }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); // dat = 0;} }void Timer0Init(void) //1毫秒@24.000MHz {AUXR |= 0x80; //定時器時鐘1T模式TMOD &= 0xF0; //設(shè)置定時器模式TL0 = 0x40; //設(shè)置定時初值TH0 = 0xA2; //設(shè)置定時初值TF0 = 0; //清除TF0標志TR0 = 1; //定時器0開始計時 } void UartInit(void) //115200bps@24.000MHz {SCON = 0x50; //8位數(shù)據(jù),可變波特率AUXR |= 0x40; //定時器1時鐘為Fosc,即1TAUXR &= 0xFE; //串口1選擇定時器1為波特率發(fā)生器TMOD &= 0x0F; //設(shè)定定時器1為16位自動重裝方式TL1 = 0xCC; //設(shè)定定時初值TH1 = 0xFF; //設(shè)定定時初值ET1 = 0; //禁止定時器1中斷TR1 = 1; //啟動定時器1 } void SeriPushSend(unsigned char *pStr) {while(*pStr != '\0')//不是字符串結(jié)尾就一直執(zhí)行{SBUF = *pStr;//首先發(fā)送第“0”個字符串while(TI == 0);//等待TI由硬件置一TI = 0;//TI置零pStr++;//地址++} }

希望看完原作者文章的你,也能去注冊并點個贊

總結(jié)

以上是生活随笔為你收集整理的EC11旋转编码器驱动程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产激情a | 深夜久久久| 亚洲av永久无码精品一百度影院 | 日韩六区 | 久久久艹| 亚洲男人在线天堂 | 天天干天 | 性欧美成人播放77777 | 成 人免费va视频 | 探花国产 | 欧美久久一级 | 99精品久久久久久 | 日本久久久久久久久 | 日韩电影在线一区二区 | 国产日本欧美在线 | 2024国产精品视频 | 亚洲毛茸茸 | 国产偷人妻精品一区二区在线 | 亚洲精品久久久久久久久 | 日本h漫在线观看 | 亚洲美女视频一区 | 韩国日本美国免费毛片 | 久久久久久亚洲 | 日本一级片在线播放 | 波多野结衣亚洲一区 | 一区二区三区四区免费观看 | 黄色女女 | 亚洲国产日韩一区 | 欧美三级图片 | 亚洲永久免费精品 | 一区二区一级片 | 国产精品国产一区二区 | 欧美日本亚洲韩国国产 | 亚洲免费综合 | 国产在线视频你懂得 | 91久色| 熟女视频一区 | 九九视频精品在线 | 大象传媒成人在线观看 | 久久只有精品 | 国产黄a三级三级三级看三级男男 | 日本女人性视频 | 国产精品亚洲成在人线 | 日本h片在线观看 | 少妇2做爰交换朴银狐 | 成人免费视频观看 | 女同av在线 | 少妇色视频 | 日韩精品一区二区三区在线观看 | 亚洲一区视频在线播放 | 亚洲精品在线影院 | 午夜三级视频 | 日日日日日日bbbbbb | 99re在线视频精品 | 欧美一级成人 | 波多野结衣一区在线 | 亚洲电影中文字幕 | www中文在线| 亚色视频在线观看 | 天天综合网在线 | 99人妻碰碰碰久久久久禁片 | 九色视频在线播放 | 日本美女a级片 | 五月天精品 | 亚洲国产一区二区在线 | 精品久久久久久久久久久久久久久久 | 天天想你在线观看完整版高清 | 国内爆初菊对白视频 | 亚洲24p| 九色在线观看 | 午夜草逼 | 拔擦8x成人一区二区三区 | 嫩色av| wwwyoujizz日本 | 在线观看成人网 | 伊人久久成人网 | 欧美日韩一区二区在线观看 | 日日夜夜操操操 | 男人的天堂免费视频 | 黄色av网站免费 | 无码少妇精品一区二区免费动态 | 96精品视频在线观看 | 伊人国产在线视频 | 91免费黄色 | 性感美女一区二区三区 | 在线视频免费观看 | 亚洲精品另类 | 成人一级片视频 | 欧美午夜精品久久久久久人妖 | 成人黄色在线观看视频 | 看个毛片 | 国产成人超碰人人澡人人澡 | 天天爽天天爽天天爽 | 国产日产精品一区二区三区四区 | 精品欧美一区二区在线观看 | 四虎最新站名点击进入 | 超碰人人搞 | 久久久久国产一区二区三区 | 亚洲精品久久久久av无码 |