EC11驱动程序

不多做介绍,百度上很多相关的介绍
首先,放上参考文档
代码有正转、反转、按下正转、按下反转、单机、双击、长按和长安松手检测,有什么问题可以在下方留言

我是对该文档代码进行一些修改,偏向于我的习惯做的修改。
主要是作者的代码在按下并旋转的时候会触发长按(也许是我移植的时候,改错了什么所导致的)、双击,
我把它改为不触发。并且让函数做返回值处理,最终的按键操作在主函数或者单独写一个设置,便于后续移植。

  • EncoderEC11.c
//---->>>>----文件描述:EC11旋转编码器底层驱动程序---<<<<----//
//---->>>>----文件版本:V1.0----<<<<----//
#include "EncoderEC11.h"//-------->>>>>>>>--------注意事项:EC11旋转编码器的扫描时间间隔控制在1~4ms之间,否则5ms及以上的扫描时间在快速旋转时可能会误判旋转方向--------<<<<<<<<--------////*******************************************************************/
//功能:初始化EC11旋转编码器相关参数
//形参:EC11旋转编码器的类型-->>  unsigned char Set_EC11_TYPE  <<--  :0----一定位对应一脉冲;1(或非0)----两定位对应一脉冲。
//返回:无
//详解:对EC11旋转编码器的连接IO口做IO口模式设置。以及将相关的变量进行初始化
//*******************************************************************/
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;//--------清除按键计数器和标志位--------//EC11_KEY_COUNT = 0;                     //EC11按键动作计数器EC11_KEY_DoubleClick_Count = 0;         //EC11按键双击动作计数器FLAG_EC11_KEY_ShotClick = 0;            //EC11按键短按动作标志FLAG_EC11_KEY_LongClick = 0;            //EC11按键长按动作标志FLAG_EC11_KEY_DoubleClick = 0;          //EC11按键双击动作标志
}//*******************************************************************/
//功能:扫描EC11旋转编码器的动作并将参数返回给动作分析函数使用
//形参:EC11旋转编码器的类型-->>  unsigned char Set_EC11_TYPE  <<--  :0----一定位对应一脉冲;1(或非0)----两定位对应一脉冲
//返回:EC11旋转编码器的扫描结果-->>  char ScanResult  -->>  0:无动作;1:正转; -1:反转;2:只按下按键;3:按着按键正转;-3:按着按键反转
//详解:只扫描EC11旋转编码器有没有动作,不关心是第几次按下按键或长按或双击。返回值直接作为形参传给 [ void Encoder_EC11_Analyze(char EC11_Value); ] 函数使用
//*******************************************************************/
char Encoder_EC11_Scan()
{//以下储存A、B上一次值的变量声明为静态全局变量,方便对EC11对应的IO口做初始化
//  static char EC11_A_Last = 0;
//  static char EC11_B_Last = 0;char ScanResult = 0;    //返回编码器扫描结果,用于分析编码器的动作//返回值的取值:   0:无动作;      1:正转;           -1:反转;  //                  2:只按下按键;    3:按着按键正转;   -3:按着按键反转//======================================================//if(EC11_Type == 0)      //================一定位对应一脉冲的EC11================//{                       //======================================================//if(EC11_A_Now != EC11_A_Last)   //以A为时钟,B为数据。正转时AB反相,反转时AB同相{if(EC11_A_Now == 0){if(EC11_B_Now ==1)      //只需要采集A的上升沿或下降沿的任意一个状态,若A下降沿时B为1,正转                    ScanResult = 1;     //正转else                    //反转ScanResult = -1;}EC11_A_Last = EC11_A_Now;   //更新编码器上一个状态暂存变量EC11_B_Last = EC11_B_Now;   //更新编码器上一个状态暂存变量}}   //======================================================//else                    //================两定位对应一脉冲的EC11================//{                       //======================================================//if(EC11_A_Now !=EC11_A_Last)        //当A发生跳变时采集B当前的状态,并将B与上一次的状态进行对比。{                                   //若A 0->1 时,B 1->0 正转;若A 1->0 时,B 0->1 正转;//若A 0->1 时,B 0->1 反转;若A 1->0 时,B 1->0 反转if(EC11_A_Now == 1)     //EC11_A和上一次状态相比,为上升沿{if((EC11_B_Last == 1)&&(EC11_B_Now == 0))   //EC11_B和上一次状态相比,为下降沿ScanResult = 1;                         //正转if((EC11_B_Last == 0)&&(EC11_B_Now == 1))   //EC11_B和上一次状态相比,为上升沿               ScanResult = -1;                        //反转//>>>>>>>>>>>>>>>>下面为正转一次再反转或反转一次再正转处理<<<<<<<<<<<<<<<<//if((EC11_B_Last == EC11_B_Now)&&(EC11_B_Now == 0))  //A上升沿时,采集的B不变且为0ScanResult = 1;                                 //正转if((EC11_B_Last == EC11_B_Now)&&(EC11_B_Now == 1))  //A上升沿时,采集的B不变且为1ScanResult = -1;                                //反转}else                    //EC11_A和上一次状态相比,为下降沿{if((EC11_B_Last == 1)&&(EC11_B_Now == 0))   //EC11_B和上一次状态相比,为下降沿ScanResult = -1;                        //反转if((EC11_B_Last == 0)&&(EC11_B_Now == 1))   //EC11_B和上一次状态相比,为上升沿ScanResult = 1;                         //正转//>>>>>>>>>>>>>>>>下面为正转一次再反转或反转一次再正转处理<<<<<<<<<<<<<<<<//if((EC11_B_Last == EC11_B_Now)&&(EC11_B_Now == 0))  //A上升沿时,采集的B不变且为0ScanResult = -1;                                //反转if((EC11_B_Last == EC11_B_Now)&&(EC11_B_Now == 1))  //A上升沿时,采集的B不变且为1   ScanResult = 1;                                 //正转}               EC11_A_Last = EC11_A_Now;   //更新编码器上一个状态暂存变量EC11_B_Last = EC11_B_Now;   //更新编码器上一个状态暂存变量}}                                                                       if(EC11_Key == 0)   //如果EC11的按键按下,并且没有EC11没有转动,{if(ScanResult == 0)         //按下按键时未转动ScanResult = 2;         //返回值为2else{if(ScanResult == 1)     //按下按键时候正转ScanResult = 3;     //返回值为3if(ScanResult == -1)    //按下按键时候反转ScanResult = -3;    //返回值为-3}}return ScanResult;      //返回值的取值:   0:无动作;      1:正转;           -1:反转;
}                           //              2:只按下按键;    3:按着按键正转;   -3:按着按键反转//*******************************************************************/
//功能:对EC11旋转编码器的动作进行分析,并作出相应的动作处理代码
//形参:无
//返回:char AnalyzeResult = 0;目前无用。若在该函数里做了动作处理,则函数的返回值无需理会
//详解:对EC11旋转编码器的动作进行模式分析,是单击还是双击还是长按松手还是一直按下。形参从 [ char Encoder_EC11_Scan(unsigned char Set_EC11_TYPE) ] 函数传入。在本函数内修改需要的动作处理代码
//*******************************************************************/
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;//1:正转
//      2:反转
//      3:按下并正转
//      4:按下并反转
//      5:短按
//      6:双击
//      7:长按结束
//      8:长按
}
  • EncoderEC11.h
//---->>>>----文件描述:EC11旋转编码器底层驱动程序---<<<<----//
//---->>>>----文件版本: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的按键//----------------编码器动作代码相关定义----------------//
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                            //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)       //长按按键的回报率的倒数,即一直长按按键时响应的时间间隔//----------------局部文件内变量列表----------------//
static  char    EC11_A_Last = 0;                        //EC11的A引脚上一次的状态
static  char    EC11_B_Last = 0;                        //EC11的B引脚上一次的状态
static  char    EC11_Type = 1;                          //定义变量暂存EC11的类型---->>>>----  0:一定位对应一脉冲;  1:两定位对应一脉冲//所谓一定位对应一脉冲,是指EC11旋转编码器每转动一格,A和B都会输出一个完整的方波。//而  两定位对应一脉冲,是指EC11旋转编码器每转动两格,A和B才会输出一个完整的方波,只转动一格只输出A和B的上升沿或下降沿static   int    EC11_KEY_COUNT = 0;                     //EC11按键动作计数器
static   int    EC11_KEY_DoubleClick_Count = 0;         //EC11按键双击动作计数器
static  char    FLAG_EC11_KEY_ShotClick = 0;            //EC11按键短按动作标志
static  char    FLAG_EC11_KEY_LongClick = 0;            //EC11按键长按动作标志
static  char    FLAG_EC11_KEY_DoubleClick = 0;          //EC11按键双击动作标志//----------------函数快速调用(复制粘贴)列表----------------//
//
/*******************************************************************
void Encoder_EC11_Init(unsigned char Set_EC11_TYPE);        //初始化EC11旋转编码器IO口和类型以及变量初始化
char Encoder_EC11_Scan();                                   //扫描旋转编码器的动作
void Encoder_EC11_Analyze(char EC11_Value);                 //分析EC11旋转编码器的动作以及动作处理代码
******************************************************************/
//-------->>>>>>>>--------注意事项:EC11旋转编码器的扫描时间间隔控制在1~4ms之间,否则5ms及以上的扫描时间在快速旋转时可能会误判旋转方向--------<<<<<<<<--------//
//-------->>>>>>>>--------注意事项:EC11旋转编码器的扫描时间间隔控制在1~4ms之间,否则5ms及以上的扫描时间在快速旋转时可能会误判旋转方向--------<<<<<<<<--------//
//-------->>>>>>>>--------注意事项:EC11旋转编码器的扫描时间间隔控制在1~4ms之间,否则5ms及以上的扫描时间在快速旋转时可能会误判旋转方向--------<<<<<<<<--------////----------------函数声明列表----------------//
//
//*******************************************************************/
//功能:初始化EC11旋转编码器相关参数
//形参:EC11旋转编码器的类型-->>  unsigned char Set_EC11_TYPE  <<--  :0----一定位对应一脉冲;1(或非0)----两定位对应一脉冲。
//返回:无
//详解:对EC11旋转编码器的连接IO口做IO口模式设置。以及将相关的变量进行初始化
//*******************************************************************/
void Encoder_EC11_Init(unsigned char Set_EC11_TYPE);//*******************************************************************/
//功能:扫描EC11旋转编码器的动作并将参数返回给动作分析函数使用
//形参:EC11旋转编码器的类型-->>  unsigned char Set_EC11_TYPE  <<--  :0----一定位对应一脉冲;1(或非0)----两定位对应一脉冲
//返回:EC11旋转编码器的扫描结果-->>  char ScanResult  -->>  0:无动作;1:正转; -1:反转;2:只按下按键;3:按着按键正转;-3:按着按键反转
//详解:只扫描EC11旋转编码器有没有动作,不关心是第几次按下按键或长按或双击。返回值直接作为形参传给 [ void Encoder_EC11_Analyze(char EC11_Value); ] 函数使用
//*******************************************************************/
char Encoder_EC11_Scan();//*******************************************************************/
//功能:对EC11旋转编码器的动作进行分析,并作出相应的动作处理代码
//形参:无
//返回:char AnalyzeResult = 0;目前无用。若在该函数里做了动作处理,则函数的返回值无需理会
//详解:对EC11旋转编码器的动作进行模式分析,是单击还是双击还是长按松手还是一直按下。形参从 [ char Encoder_EC11_Scan(unsigned char Set_EC11_TYPE) ] 函数传入。在本函数内修改需要的动作处理代码
//*******************************************************************/
char Encoder_EC11_Analyze(char EC11_Value);#endif//---->>>>----函数使用示例----<<<<----//
/********#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;       //设置定时器模式TL0 = 0xCD;     //设置定时初值TH0 = 0xF8;     //设置定时初值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旋转编码器的扫描时间间隔控制在1~4ms之间,否则5ms及以上的扫描时间在快速旋转时可能会误判旋转方向--------<<<<<<<<--------//
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口拉低(拿示波器才发现),于是设置为开漏模式,也可以设置为高阻模式

  • 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;//设置为开漏模式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;       //设置定时器模式TL0 = 0x40;       //设置定时初值TH0 = 0xA2;        //设置定时初值TF0 = 0;       //清除TF0标志TR0 = 1;      //定时器0开始计时
}
void UartInit(void)     //115200bps@24.000MHz
{SCON = 0x50;      //8位数据,可变波特率AUXR |= 0x40;      //定时器1时钟为Fosc,即1TAUXR &= 0xFE;     //串口1选择定时器1为波特率发生器TMOD &= 0x0F;        //设定定时器1为16位自动重装方式TL1 = 0xCC;      //设定定时初值TH1 = 0xFF;        //设定定时初值ET1 = 0;       //禁止定时器1中断TR1 = 1;     //启动定时器1
}
void SeriPushSend(unsigned char *pStr)
{while(*pStr != '\0')//不是字符串结尾就一直执行{SBUF = *pStr;//首先发送第“0”个字符串while(TI == 0);//等待TI由硬件置一TI = 0;//TI置零pStr++;//地址++}
}

希望看完原作者文章的你,也能去注册并点个赞

EC11旋转编码器驱动程序相关推荐

  1. 认识EC11旋转编码器编写驱动程序

    前言 抛开工作,以电子爱好者的身份,单片机玩多了都会想着在单片机的外围设备玩出一些花样来. 这其中首先想到的就是"升级"输入输出设备. 这里先说一说我们常给单片机使用的输入设备. ...

  2. EC11旋转编码器,stm32f103驱动程序

    EC11旋转编码器,stm32f103驱动程序 1.EC11手册的要点 手册中推荐的电路(已含有RC滤波): 输出波形特点: 2.硬件电路 3.驱动程序关键点 4.输出现象 1.EC11手册的要点 注 ...

  3. STM32CubeMX EC11旋转编码器开发心路历程(encode模式 外部中断模式 普通IO口模式 定时器模式探索)

    文章目录 ENCODE模式探索 普通IO口探索 定时器使用 外部中断探索 编码器开关的理解 最后的实现方案 这篇文章主要还是记录整个过程以及想法的不断改进,对于一些实际的操作还有代码,我准备都分开写到 ...

  4. STM32 EC11 旋转编码器

    **先给大家看看我选用的EC11元器件** 代码在最后,复制可直接食用 以及我的电路图 在研究EC11的时序之前首先要了解一点,EC11按旋转的输出动作可以分为两种.一种是转两格,A.B对C端输出一个 ...

  5. 使用Arduino开发板连接ec11旋转编码器

    使用Arduino开发板连接ec11旋转编码器 因为最近要用到旋转编码器,从网上花了好长时间找了好多关于arduino使用旋转编码器的资料,总是找不到合适的,最后总结了一下(部分内容有借鉴,仅作分享, ...

  6. 松下EC11旋转编码器(奥迪旋钮)

    松下EC11旋转编码器(奥迪旋钮) 1. 背景介绍: 一直都很喜欢奥迪旋钮的质感做工,在淘宝上看见A6的旋转编码器,想购入装到DIY设备上. 由于找不到MMI大旋钮的旋转编码器型号,因此选购了音量调节 ...

  7. STM32F103 + 0.96/1.3“ I2C OLED + EC11旋转编码器多级菜单demo

    STM32F103 + 0.96/1.3" I2C OLED + EC11旋转编码器多级菜单demo

  8. linux4.6 EC11旋转编码器的驱动

    最近项目使用了旋转编码器EC11,遍查内核,发现并没有它的驱动,查了查CSDN,终于找到一篇有用的.根据自己的需要和对最基础的gpio_key.c的理解,我改写出了一份EC11的专用驱动. 感谢下面博 ...

  9. ESP32(IDF)EC11旋转编码器使用总结

    ESP32(IDF)EC11旋转编码器使用总结 一.调试过程中遇到的问题 二.硬件 三.电路 接线说明: 四.工作原理 正转波形 反转波形 五.判断正反转 法一 代码实现 结果 法二 法三 代码实现 ...

最新文章

  1. 一些权限管理方面的文章
  2. 如何为模型选择合适的损失函数?所有ML学习者应该知道的5种回归损失函数
  3. 生命科学数据与互联网数据一样已被公认为大数据
  4. 20行python代码的入门级小游戏-python实现石头剪刀布小游戏
  5. 设计模式系列1:单例模式(Singleton Pattern)
  6. HTML发布那一年,开发版内测公告一般发布时间是几点
  7. Github | 谷歌机器学习课程中文版
  8. mysql 存储过程执行ddl_mysql存储过程执行ddl语句
  9. Security+ 学习笔记21 认证
  10. SharePoint2013 App 开发中 自定义网站栏,内容类型,列表。
  11. 卡密激活php代码,全自动PHP授权检测系统,卡密功能自助授权功能源码
  12. android扫描局域网中的所有ip,NMAP扫描局域网内在线IP
  13. 织梦插件,dede采集、发布、翻译伪原创插件
  14. 天津博物馆镇馆之宝——西周太保鼎
  15. 10658830让你的手机会唱歌
  16. 企业微信应用分享(一)
  17. VC++程序设计与应用--菜单、工具栏与状态栏
  18. 海马玩安卓模拟器linux,海马玩模拟器下载安装_海马玩模拟器Droid4X官方下载「手游模拟器」-太平洋下载中心...
  19. 一位“技术宅”自制的自行车码表在B站火了,稚晖君点赞,网友催量产
  20. 免费智能机器人聊天API

热门文章

  1. day03--java基础编程:面向对象,构造方法,代码块讲解,this super,static,final,访问修饰符,方法重写,向上/下造型,main方法,抽象类,接口,设计模式,异常,内部类
  2. 17.AtomicInteger、AtomicBoolean的底层原理
  3. 淘宝新自动化测试框架AutoRobot简要介绍
  4. 【Mybaits】Mybatis一对一查询,结果只返回一条,问题记录及解决方案
  5. 通过OpenCV识别QR二维码
  6. 3D Multi-Object Tracking: A Baseline and New Evaluation Metrics论文阅读记录
  7. 下载人人网相册的所有图片
  8. 【考研英语语法】冠词练习题
  9. 计算机快速格式化u盘启动,小编教你如何解决u盘打不开提示格式化
  10. 破解手机辐射危害健康的流言