hc32l13x 多个编码器开关中断方式例码 ,A相上升沿,B相下降沿,加按键功能加延时程序防抖
时间: 2024-05-16 17:18:09 浏览: 72
以下是基于 HC32L13X 的多个编码器开关中断方式的例程,其中使用了 A 相上升沿和 B 相下降沿来进行编码器的计数,并添加了加按键功能和延时程序防抖:
```c
#include "hc32l13x.h"
#include "hc32l13x_clk.h"
#include "hc32l13x_gpio.h"
#include "hc32l13x_exti.h"
#define ENCODER1_PORT (GPIO_PORT_0) /* 编码器1端口 */
#define ENCODER1_PIN_A (GPIO_PIN_0) /* 编码器1 A 相引脚 */
#define ENCODER1_PIN_B (GPIO_PIN_1) /* 编码器1 B 相引脚 */
#define ENCODER2_PORT (GPIO_PORT_0) /* 编码器2端口 */
#define ENCODER2_PIN_A (GPIO_PIN_2) /* 编码器2 A 相引脚 */
#define ENCODER2_PIN_B (GPIO_PIN_3) /* 编码器2 B 相引脚 */
#define ADD_KEY_PORT (GPIO_PORT_1) /* 加按键端口 */
#define ADD_KEY_PIN (GPIO_PIN_2) /* 加按键引脚 */
#define DEBOUNCE_TIME_MS (20) /* 延时程序防抖时间(ms)*/
/* 编码器1计数变量 */
volatile int32_t g_encoder1_count = 0;
/* 编码器2计数变量 */
volatile int32_t g_encoder2_count = 0;
/* 加按键按下标志 */
volatile uint8_t g_add_key_pressed = 0;
/**
* @brief GPIO中断服务函数
* @param [in] u8Param 中断服务函数参数
* @retval 无
*/
void Gpio_IrqHandler(uint8_t u8Param)
{
if (u8Param == ENCODER1_PIN_A) {
/* A 相上升沿 */
if (Port_GetBit(ENCODER1_PORT, ENCODER1_PIN_A)) {
/* B 相为高电平则加1 */
if (Port_GetBit(ENCODER1_PORT, ENCODER1_PIN_B)) {
g_encoder1_count++;
}
/* B 相为低电平则减1 */
else {
g_encoder1_count--;
}
}
/* A 相下降沿 */
else {
/* B 相为低电平则加1 */
if (!Port_GetBit(ENCODER1_PORT, ENCODER1_PIN_B)) {
g_encoder1_count++;
}
/* B 相为高电平则减1 */
else {
g_encoder1_count--;
}
}
}
else if (u8Param == ENCODER2_PIN_A) {
/* A 相上升沿 */
if (Port_GetBit(ENCODER2_PORT, ENCODER2_PIN_A)) {
/* B 相为高电平则加1 */
if (Port_GetBit(ENCODER2_PORT, ENCODER2_PIN_B)) {
g_encoder2_count++;
}
/* B 相为低电平则减1 */
else {
g_encoder2_count--;
}
}
/* A 相下降沿 */
else {
/* B 相为低电平则加1 */
if (!Port_GetBit(ENCODER2_PORT, ENCODER2_PIN_B)) {
g_encoder2_count++;
}
/* B 相为高电平则减1 */
else {
g_encoder2_count--;
}
}
}
else if (u8Param == ADD_KEY_PIN) {
/* 延时程序防抖 */
Clk_SysTickDelay(DEBOUNCE_TIME_MS);
/* 检查按键是否按下 */
if (!Port_GetBit(ADD_KEY_PORT, ADD_KEY_PIN)) {
g_add_key_pressed = 1;
}
}
}
/**
* @brief 主函数
* @param 无
* @retval 无
*/
void main(void)
{
/* 初始化系统时钟 */
Clk_Init();
/* 初始化编码器1引脚 */
Gpio_InitIO(ENCODER1_PORT, ENCODER1_PIN_A, GpioDirIn);
Gpio_InitIO(ENCODER1_PORT, ENCODER1_PIN_B, GpioDirIn);
/* 初始化编码器2引脚 */
Gpio_InitIO(ENCODER2_PORT, ENCODER2_PIN_A, GpioDirIn);
Gpio_InitIO(ENCODER2_PORT, ENCODER2_PIN_B, GpioDirIn);
/* 初始化加按键引脚 */
Gpio_InitIO(ADD_KEY_PORT, ADD_KEY_PIN, GpioDirIn);
/* 配置编码器1引脚中断 */
Exti_ConfigPin(ENCODER1_PORT, ENCODER1_PIN_A, ExtiFalling);
Exti_ConfigPin(ENCODER1_PORT, ENCODER1_PIN_A, ExtiRising);
Exti_EnableIrq(ENCODER1_PORT, ENCODER1_PIN_A);
/* 配置编码器2引脚中断 */
Exti_ConfigPin(ENCODER2_PORT, ENCODER2_PIN_A, ExtiFalling);
Exti_ConfigPin(ENCODER2_PORT, ENCODER2_PIN_A, ExtiRising);
Exti_EnableIrq(ENCODER2_PORT, ENCODER2_PIN_A);
/* 配置加按键引脚中断 */
Exti_ConfigPin(ADD_KEY_PORT, ADD_KEY_PIN, ExtiFalling);
Exti_EnableIrq(ADD_KEY_PORT, ADD_KEY_PIN);
/* 启用全局中断 */
EnableNvic();
/* 主循环 */
while (1) {
/* 检查加按键是否按下 */
if (g_add_key_pressed) {
/* 处理加按键按下事件 */
// ...
/* 清除加按键按下标志 */
g_add_key_pressed = 0;
}
}
}
```
需要注意的是,以上代码仅供参考,具体实现方式可能因实际需求而异。在使用编码器时,需要根据编码器的型号和规格来确定编码器的计数方式,例如在本例程中,我们使用的是 A 相上升沿和 B 相下降沿来进行计数。另外,为了防止按键的抖动,我们还添加了一个简单的延时程序来进行防抖处理。
阅读全文