判断方法:
A信号位于下降沿时,B是高电平,表示顺时针。B是低电平,表示逆时针。
同理:
B信号位于下降沿时,A是高电平,表示顺时针。A是低电平,表示逆时针。
- #include "ec11.h"
-
- uint8_t Encoder[2]={0, 0}; // 存放按键的值
- uint8_t flag[2]={0, 0}; // 按下旋钮标志位
- /**
- * @brief EC11旋转编码器初始化
- * @param
- * @ref none
- * @return none
- * @details
- * @see
- */
- void EC11_Configurature(void)
- {
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
- GPIO_InitTypeDef GPIO_InitStructure;
- //旋转编码器1
- GPIO_InitStructure.GPIO_Pin = TBUT_R | TBUT_D;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 输入模式
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉输入
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
- GPIO_Init(EC11_1_Port,&GPIO_InitStructure);
- // 旋转编码器2
- GPIO_InitStructure.GPIO_Pin = TBUT_L | BBUT_L | BBUT_R | BBUT_D;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 输入模式
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉输入
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
- GPIO_Init(EC11_2_Port,&GPIO_InitStructure);
- }
- /**
- * @brief 读取EC11旋转状态 第一个EC11 上方
- * @param
- * @ref
- * @return
- * -
- * @details
- * @see
- */
- //首先,应该是低电平有效
- //TBUT_L接的B、TBUT_R接的A
- uint8_t EC11_Read_T()
- {
- static uint16_t cou0; // 锁死计时器
- static uint8_t KUP0; // 锁死标志位
- uint8_t kt; // 状态记录标志位
-
- Encoder[0] = 0;
-
- if(GPIO_ReadInputDataBit(EC11_2_Port,TBUT_L))
- KUP0=0; //判断旋钮是否解除锁死
-
- if(!GPIO_ReadInputDataBit(EC11_2_Port,TBUT_L)&&KUP0==0)//判断是否旋转旋钮,同时判断是否有旋钮锁死
- //这里B是下降沿了,判断A的电平。
- {
- // softWareDelay(); // 延时
- kt=GPIO_ReadInputDataBit(EC11_1_Port,TBUT_R); //把旋钮另一端电平状态记录
- // softWareDelay(); //延时
- if(!GPIO_ReadInputDataBit(EC11_2_Port,TBUT_L))//去抖
- {
- if(kt==0)//用另一端判断左或右旋转
- //A是低电平,逆时针
- {
- Encoder[0] = 1; // 右转 //作者写错了,这里应该是左转
- }
- else
- //A是高电平,顺时针
- {
- Encoder[0] = 2; // 左转 //作者写错了,这里应该是右转
- }
- cou0=0; //初始锁死判断计数器
- while(!GPIO_ReadInputDataBit(EC11_2_Port,TBUT_L)&&cou0<1200)
- { //等待放开旋钮,同时累加判断锁死
- cou0++;KUP0=1;softWareDelay(); //
- }
- }
- }
-
- if(GPIO_ReadInputDataBit(EC11_1_Port,TBUT_D))
- flag[0]=0;
-
- if(flag[0]!=1)
- {
- if(!GPIO_ReadInputDataBit(EC11_1_Port,TBUT_D)&&KUP0==0)
- { // 判断旋钮是否按下
- //softWareDelay();
- if(!GPIO_ReadInputDataBit(EC11_1_Port,TBUT_D))
- { // 去抖动
- softWareDelay();
- if(GPIO_ReadInputDataBit(EC11_1_Port,TBUT_D))
- { // 判断是否放开
- Encoder[0] = 3; // 按下
- flag[0]=0;
- }
- else{
- Encoder[0] |= 0x10;
- flag[0]=1;
- }
- }
- }
- }
- else
- {
- Encoder[0] |= 0x10;
- }
-
- if(Encoder[0] == 0x10)
- Encoder[0]=0;
-
- return Encoder[0];
- }
- /**
- * @brief 读取EC11旋转状态 第二个EC11 下方
- * @param
- * @ref
- * @return
- * -
- * @details
- * @see
- */
- uint8_t EC11_Read_D()
- {
- static uint16_t cou; // 锁死计时器
- static uint8_t KUP; // 锁死标志位
- uint8_t kt; // 状态记录标志位
- Encoder[1] = 0;
- if(GPIO_ReadInputDataBit(EC11_2_Port,BBUT_L))
- KUP=0; //判断旋钮是否解除锁死
-
- if(!GPIO_ReadInputDataBit(EC11_2_Port,BBUT_L)&&KUP==0){ //判断是否旋转旋钮,同时判断是否有旋钮锁死
- // softWareDelay(); // 延时
- kt=GPIO_ReadInputDataBit(EC11_2_Port,BBUT_R); //把旋钮另一端电平状态记录
- // softWareDelay(); //延时
- if(!GPIO_ReadInputDataBit(EC11_2_Port,BBUT_L)){ //去抖
- if(kt==0){ //用另一端判断左或右旋转
- Encoder[1] = 1; // 右转
- }else{
- Encoder[1] = 2; // 左转
- }
- cou=0; //初始锁死判断计数器
- while(!GPIO_ReadInputDataBit(EC11_2_Port,BBUT_L)&&cou<1200){ //等待放开旋钮,同时累加判断锁死
- cou++;KUP=1;softWareDelay(); //
- }
- }
- }
-
- if(GPIO_ReadInputDataBit(EC11_2_Port,BBUT_D))
- flag[1]=0;
-
- if(flag[1]!=1)
- {
- if(!GPIO_ReadInputDataBit(EC11_2_Port,BBUT_D)&&KUP==0){ // 判断旋钮是否按下
- //softWareDelay();
- if(!GPIO_ReadInputDataBit(EC11_2_Port,BBUT_D)){ // 去抖动
- softWareDelay();
- if(GPIO_ReadInputDataBit(EC11_2_Port,BBUT_D)){ // 判断是否放开
- Encoder[1] = 3; // 按下
- flag[1]=0;
- }else{
- Encoder[1] |= 0x10;
- flag[1]=1;
- }
- }
- }
- }else{
- Encoder[1] |= 0x10;
- }
-
- if(Encoder[1] == 0x10)
- Encoder[1]=0;
-
- return Encoder[1];
- }
-
|