使用GD32单片机在ST7789显示屏上实现多级菜单功能——第二部分(ttp223触摸按键)

注:由于内存原因,仅显示部分代码,详情请下载文章置顶的完整工程。

由于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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值