按键单按、双按、长按的中断与非中断处理

本文介绍了一款基于GD32E103R-START开发板的按键处理程序,包括非中断及中断处理两种方式。通过定时器和外部中断实现了对按键的长按、短按及双击识别。

开发板是GD32E103R-START,2020-6 V1.0
以下是非中断处理,代码比较简陋

#include "gd32e10x.h

int main(void)
{
   
   
    volatile static uint8_t a = 0, b = 0, c = 0, d = 0;
    systick_config();
    rcu_periph_clock_enable(RCU_GPIOC);
    gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_6);
    rcu_periph_clock_enable(RCU_GPIOA);
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_0);

    while(1){
   
   
        if (gpio_input_bit_get(GPIOA, GPIO_PIN_0)){
   
   
            delay_1ms(20);
            if (gpio_input_bit_get(GPIOA, GPIO_PIN_0)){
   
   
                while (gpio_input_bit_get(GPIOA, GPIO_PIN_0) && c < 100){
   
   
                    c++;
                    delay_1ms(10);
                }
            }
        }
        
        if (c >= 100){
   
   
            a = 0;
            b = 0;
            c = 0;
            d = 0;
            gpio_bit_write(GPIOC, GPIO_PIN_6, 1);
        }
        else{
   
   
            c = 0;

            if (a == 1){
   
   
                gpio_bit_write(GPIOC, GPIO_PIN_6, 1);
                delay_1ms(500);
                gpio_bit_write(GPIOC, GPIO_PIN_6, 0);
                delay_1ms(500);
            }

            if ((a == 1) && (b == 0) && (!(gpio_input_bit_get(GPIOA, GPIO_PIN_0))) && (d == 0)){
   
   
                delay_1ms(20);
                if (!gpio_input_bit_get(GPIOA, GPIO_PIN_0)){
   
   
                    d = 1;
                }
            }

            
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值