本帖最后由 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);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
A相设置为外部中断,B相为普通IO口,C接地。我没有用外接上拉电阻,只是设置内部上拉,如果正转时音量反而减小,那只要将音量增和减的语句交换位置即可,即将if..... else....里的语句交换一下位置即可。以上代码经使用,还是比较可靠的。
这个音量控制板有如下功能:红外遥控器自学习功能(只要是常用的NEC格式的都行),第一次使用时只要学习一次即可。所有设置都可记忆(输入端口选择,本次音量值关机记忆,红外遥控器学习等,保存在24C02中),开机大音量保护,100级指数式音量平滑调节,音量控制用12个继电器,平衡电路要两块继电器板。非常实用,这个代码是我从用了多年的PIC,AVR单片机上移植过来的。是我学习STM32 的第一个成果。用的是STM32F103C8T6.
我画电路板一般不画电路图,只是将单片机的所有IO脚的用途写下来,画PCB时就按这个画就行了。
一楼代码的注释有几处笔误,请看官包涵。代码是没有错误的。
,
一周热门 更多>