注:由于内存原因,仅显示部分代码,详情请下载文章置顶的完整工程。
由于GD32单片机自身只有一个复位按键,需要外界两个触摸按键对菜单进行切换。
一、定时器延时,进行按键消抖
timer.c
#include "timer.h"
#include "usart.h"
#include <stdio.h>
volatile static uint32_t gs_count = 0;
void TIM5_Init (void)
{
/* 开启时钟 */
rcu_periph_clock_enable(BSP_TIMER_RCU); // 开启定时器时钟
timer_parameter_struct timer_initpara; // 定义定时器结构体
timer_deinit(BSP_TIMER); // 复位定时器
timer_prescaler_config(BSP_TIMER, 1, TIMER_PSC_RELOAD_NOW);
timer_struct_para_init(&timer_initpara); // 初始化结构体
/* 配置定时器参数 */
timer_initpara.prescaler = 36000 -1; // 时钟预分频值 0-65535 psc_clk = CK_TIMER / pre
timer_initpara.alignedmode = TIMER_COUNTER_EDGE; // 边缘对齐
timer_initpara.counterdirection = TIMER_COUNTER_UP; // 向上计数
timer_initpara.period = 2 - 1; // 周期
/* 在输入捕获的时候使用 数字滤波器使用的采样频率之间的分频比例 */
timer_initpara.clockdivision = TIMER_CKDIV_DIV1; // 分频因子
/* 只有高级定时器才有 配置为x,就重复x+1次进入中断 */
timer_initpara.repetitioncounter = 0; // 重复计数器 0-255
timer_init(BSP_TIMER,&timer_initpara); // 初始化定时器
timer_interrupt_flag_clear(BSP_TIMER, TIMER_INT_FLAG_UP);
nvic_irq_enable(BSP_TIMER_IRQ, 1); // 设置中断优先级
/* 使能中断 */
timer_interrupt_enable(BSP_TIMER, TIMER_INT_UP); // 使能更新事件中断
/* 使能定时器 */
timer_enable(BSP_TIMER);
}
int time=0;
void BSP_TIMER_IRQHandler(void)
{
/* 这里是定时器中断 */
if(timer_interrupt_flag_get(BSP_TIMER,TIMER_INT_FLAG_UP) == SET)
{
timer_interrupt_flag_clear(BSP_TIMER,TIMER_INT_FLAG_UP); // 清除中断标志位
/* 执行操作 */
gs_count++;
}
}
void TIM_delay_ms(uint32_t ms)
{
uint32_t start_count = gs_count;
while((gs_count - start_count) < ms);
}
timer.h
#ifndef __TIMER_H
#define __TIMER_H
#include "gd32e23x.h"
#define BSP_TIMER_RCU RCU_TIMER5 // 定时器时钟
#define BSP_TIMER TIMER5 // 定时器
#define BSP_TIMER_IRQ TIMER5_IRQn // 定时器中断
#define BSP_TIMER_IRQHandler TIMER5_IRQHandler // 定时器中断服务函数;
void TIM5_Init (void);
void TIM_delay_ms(uint32_t ms);
#endif
二、按键输入,通过单片机读取引脚的电平,判断按键是否按下
ttp223.c
#include "ttp223.h"
#include "gd32e23x.h"
#include "systick.h"
#include "timer.h"
void TTP223_GPIO_Init(void)
{
/* 开启时钟 */
rcu_periph_clock_enable(RCU_SIG);
/* 配置IN1 为输入模式 上拉模式 */
gpio_mode_set(PORT_SIG,GPIO_MODE_INPUT,GPIO_PUPD_PULLUP,GPIO_SIG1);
gpio_mode_set(PORT_SIG,GPIO_MODE_INPUT,GPIO_PUPD_PULLUP,GPIO_SIG2);
}
char Key_SIG_Scanf(void)
{
uint8_t key_flag=0;
if(KEY_SIG1==1) key_flag=1;
if(KEY_SIG2==1) key_flag=2;
TIM_delay_ms(150);
return key_flag;
}
ttp223.h
#ifndef __TTP223_H
#define __TTP223_H
#include "gd32e23x.h"
#define RCU_SIG RCU_GPIOA
#define PORT_SIG GPIOA
#define GPIO_SIG1 GPIO_PIN_7
#define GPIO_SIG2 GPIO_PIN_0
#define KEY_SIG1 gpio_input_bit_get(PORT_SIG, GPIO_SIG1)
#define KEY_SIG2 gpio_input_bit_get(PORT_SIG, GPIO_SIG2)
void TTP223_GPIO_Init(void);//引脚初始化
char Key_SIG_Scanf(void);
#endif