简单实用的编码器程序

2019-08-16 20:51发布

本帖最后由 rjx007 于 2017-7-9 14:10 编辑

下面的程序已在我的音量控制板上使用了几天,感觉还可以,这个程序的最大好处是简单明了。与大家分享。
用的是EC11编码器,用用了一个外部中断,编码器A相接中断。

头文件:ec11.h
#ifndef _ec11_H
#define _ec11_H
#include "stm32f10x.h"

extern u8  VOLUME_1;

#define EA GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)   //PA1
#define EB GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)   //PA1

void ec11_init(void);
#endif



void ec11_init(void)           //编码器管脚配置及中断初始化
{
        GPIO_InitTypeDef GPIO_InitStructure;          //声明一个结构体变量,用来初始化GPIO
        
        EXTI_InitTypeDef EXTI_InitStructure;

        NVIC_InitTypeDef NVIC_InitStructure;
        
        /* 开启GPIO时钟 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
        
        /*  配置GPIO的模式和IO口 */
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1 |GPIO_Pin_2 ;           //选择你要设置的IO口
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入  
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;           //设置传输速率
        GPIO_Init(GPIOA,&GPIO_InitStructure);                  /* 初始化GPIO */               
         
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);//选择GPIO管脚用作外部中断线路
        //此处一定要记住给端口管脚加上中断外部线路
        /* 设置外部中断的模式 */
        EXTI_InitStructure.EXTI_Line=EXTI_Line1;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);
        
        /* 设置NVIC参数 */        
        //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                 
        NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;         //打开EXTI2的全局中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为0
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                  //响应优先级为0
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                   //使能
        NVIC_Init(&NVIC_InitStructure);               
}


void EXTI1_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line1) != RESET)
  {               
     delay_ms(2);//消抖
               
    if(EA!=EB)
        {
                 if(VOLUME_1>0)    //最小值
                    { VOLUME_1--;}
                else
                    {VOLUME_1=0;}
         }
    else
         {
                 if(VOLUME_1<100)     //最大值
                     { VOLUME_1++;}
                 else
                     {VOLUME_1=100;}                        
                                
          }
    EXTI_ClearITPendingBit(EXTI_Line1);
  }
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。