原贴链接:http://www.openedv.com/forum.php?mod=viewthread&tid=106395
下面的程序已在我的音量控制板上使用了几天,感觉还可以,这个程序的最大好处是简单明了。与大家分享。
用的是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);
}
}
|