hc32l13x 多个编码器开关中断方式例码 ,A相上升沿,B相下降沿,加按键功能,加延时程序防抖
时间: 2024-05-16 15:18:09 浏览: 75
以下是基于HC32L13X芯片的多个编码器开关中断方式的例程。该例程使用A相上升沿和B相下降沿的方式来检测编码器旋转,并且添加了按键功能和延时程序防抖。
```
#include "hc32l13x.h"
#define ENCODER1_A_PORT GpioPortA
#define ENCODER1_A_PIN GpioPin9
#define ENCODER1_B_PORT GpioPortA
#define ENCODER1_B_PIN GpioPin10
#define ENCODER1_KEY_PORT GpioPortB
#define ENCODER1_KEY_PIN GpioPin0
#define ENCODER2_A_PORT GpioPortA
#define ENCODER2_A_PIN GpioPin11
#define ENCODER2_B_PORT GpioPortA
#define ENCODER2_B_PIN GpioPin12
#define ENCODER2_KEY_PORT GpioPortB
#define ENCODER2_KEY_PIN GpioPin1
volatile uint8_t g_u8Encoder1Value = 0;
volatile uint8_t g_u8Encoder2Value = 0;
void EXTINT09_10_IRQHandler(void)
{
if (Set == EXTINT_GetExtIntStatus(ExtiCh09))
{
if (Reset == GPIO_ReadInputPortPin(ENCODER1_A_PORT, ENCODER1_A_PIN))
{
if (Reset == GPIO_ReadInputPortPin(ENCODER1_B_PORT, ENCODER1_B_PIN))
{
g_u8Encoder1Value--;
}
else
{
g_u8Encoder1Value++;
}
}
else
{
if (Reset == GPIO_ReadInputPortPin(ENCODER1_B_PORT, ENCODER1_B_PIN))
{
g_u8Encoder1Value++;
}
else
{
g_u8Encoder1Value--;
}
}
EXTINT_ClrExtIntStatus(ExtiCh09);
}
if (Set == EXTINT_GetExtIntStatus(ExtiCh10))
{
if (Reset == GPIO_ReadInputPortPin(ENCODER2_A_PORT, ENCODER2_A_PIN))
{
if (Reset == GPIO_ReadInputPortPin(ENCODER2_B_PORT, ENCODER2_B_PIN))
{
g_u8Encoder2Value--;
}
else
{
g_u8Encoder2Value++;
}
}
else
{
if (Reset == GPIO_ReadInputPortPin(ENCODER2_B_PORT, ENCODER2_B_PIN))
{
g_u8Encoder2Value++;
}
else
{
g_u8Encoder2Value--;
}
}
EXTINT_ClrExtIntStatus(ExtiCh10);
}
}
void EXTINT01_IRQHandler(void)
{
if (Set == EXTINT_GetExtIntStatus(ExtiCh01))
{
// 延时程序防抖
uint32_t u32Delay = 1000000;
while (u32Delay--);
if (Reset == GPIO_ReadInputPortPin(ENCODER1_KEY_PORT, ENCODER1_KEY_PIN))
{
// 执行按键功能
}
EXTINT_ClrExtIntStatus(ExtiCh01);
}
}
void EXTINT03_IRQHandler(void)
{
if (Set == EXTINT_GetExtIntStatus(ExtiCh03))
{
// 延时程序防抖
uint32_t u32Delay = 1000000;
while (u32Delay--);
if (Reset == GPIO_ReadInputPortPin(ENCODER2_KEY_PORT, ENCODER2_KEY_PIN))
{
// 执行按键功能
}
EXTINT_ClrExtIntStatus(ExtiCh03);
}
}
int main(void)
{
stc_gpio_init_t stcGpioInit;
stc_extint_config_t stcExtIntCfg;
DDL_ZERO_STRUCT(stcGpioInit);
DDL_ZERO_STRUCT(stcExtIntCfg);
// 使能GPIO外设时钟
PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_GPIO, Enable);
// 初始化编码器1的A相和B相
stcGpioInit.u16PinAttr = Pin_PullUp;
GPIO_Init(ENCODER1_A_PORT, ENCODER1_A_PIN, &stcGpioInit);
GPIO_Init(ENCODER1_B_PORT, ENCODER1_B_PIN, &stcGpioInit);
// 初始化编码器2的A相和B相
GPIO_Init(ENCODER2_A_PORT, ENCODER2_A_PIN, &stcGpioInit);
GPIO_Init(ENCODER2_B_PORT, ENCODER2_B_PIN, &stcGpioInit);
// 初始化编码器1的按键
stcGpioInit.u16PinDir = Pin_Input;
GPIO_Init(ENCODER1_KEY_PORT, ENCODER1_KEY_PIN, &stcGpioInit);
// 初始化编码器2的按键
GPIO_Init(ENCODER2_KEY_PORT, ENCODER2_KEY_PIN, &stcGpioInit);
// 配置外部中断
stcExtIntCfg.u32ExtIntFilterA = ExtIntFilterPclk1Div8;
stcExtIntCfg.u32ExtIntFilterB = ExtIntFilterPclk1Div8;
stcExtIntCfg.u32ExtIntLevel = ExtIntBothEdge;
stcExtIntCfg.u32ExtIntMode = ExtIntMode;
// 配置编码器1的A相和B相中断
stcExtIntCfg.u32ExtIntNum = ExtiCh09;
EXTINT_Init(&stcExtIntCfg);
GPIO_SetFunc(ENCODER1_A_PORT, ENCODER1_A_PIN, GpioAf3);
GPIO_SetFunc(ENCODER1_B_PORT, ENCODER1_B_PIN, GpioAf3);
// 配置编码器2的A相和B相中断
stcExtIntCfg.u32ExtIntNum = ExtiCh10;
EXTINT_Init(&stcExtIntCfg);
GPIO_SetFunc(ENCODER2_A_PORT, ENCODER2_A_PIN, GpioAf3);
GPIO_SetFunc(ENCODER2_B_PORT, ENCODER2_B_PIN, GpioAf3);
// 配置编码器1的按键中断
stcExtIntCfg.u32ExtIntNum = ExtiCh01;
EXTINT_Init(&stcExtIntCfg);
GPIO_SetFunc(ENCODER1_KEY_PORT, ENCODER1_KEY_PIN, GpioDirIn);
GPIO_SetFunc(ENCODER1_KEY_PORT, ENCODER1_KEY_PIN, GpioAf3);
// 配置编码器2的按键中断
stcExtIntCfg.u32ExtIntNum = ExtiCh03;
EXTINT_Init(&stcExtIntCfg);
GPIO_SetFunc(ENCODER2_KEY_PORT, ENCODER2_KEY_PIN, GpioDirIn);
GPIO_SetFunc(ENCODER2_KEY_PORT, ENCODER2_KEY_PIN, GpioAf3);
// 使能中断
NVIC_EnableIRQ(EXTINT09_10_IRQn);
NVIC_EnableIRQ(EXTINT01_IRQn);
NVIC_EnableIRQ(EXTINT03_IRQn);
while (1)
{
// 主循环
}
}
```
需要注意的是,该例程只演示了如何使用HC32L13X芯片实现多个编码器开关中断方式,并添加了按键功能和延时程序防抖。具体的编码器旋转功能需要根据具体的应用需求进行实现。
阅读全文