时序图

程序思路
把A端或B端充当时钟信号,可以上升沿或下降沿触发都ok利用触发后判断另一端是低电平还是高电平来判断顺时针还是逆时针中断尽量只处理标志位不然可能使程序不按照预设的进行
程序
#define EC11_ PAin(4)//按下
#define EC11B PAin(6)//用B高低电平判断旋转方向
#define EC11A PAin(5)//用A充当时钟信号
void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //外部中断,需要使能AFIO时钟
//引脚初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PORTA时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;//PA
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA
//GPIOA.5 中断线以及中断初始化配置
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);
EXTI_InitStructure.EXTI_Line = EXTI_Line5;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //使能按键所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
}
void EXTI9_5_IRQHandler ( void )
{
if ( EC11A == 0 )
{
delay_ms ( 10 );
if ( EC11A == 0 && EC11B == 0 ) //逆时针
{
}
else if ( EC11A == 0 && EC11B == 1 ) //顺时针
{
}
//8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
}
}
EXTI_ClearITPendingBit ( EXTI_Line5 ); //清除LINE5上的中断标志位
}
=======================================================================================================================================================================================================================================================================================================================================================

最低0.47元/天 解锁文章
2691

被折叠的 条评论
为什么被折叠?



