1625|0

309

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【平头哥RVB2601创意应用开发】 四、RVB2601之按键测试(带防抖处理) [复制链接]

  本帖最后由 kit7828 于 2022-3-13 14:54 编辑

平头哥的开发文档中可以得到以下两个按键的信息

 分别是Key1对应管脚PA11,Key2对应管脚PA12。

前面几次的测试中一直没有评测按键,这次把按键加上,顺便做了防抖处理

首先通过CDK增加一个新的C文件,key.c

  具体代码如下:

#define _DEFAULT_SOURCE /* needed for usleep() */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <aos/aos.h>
#include "app_config.h"
#include "app_init.h"
#include "csi_config.h"
#include "hw_config.h"

#include "board_config.h"
#include "drv/gpio_pin.h"
#include <drv/pin.h>

static csi_gpio_pin_t key1;
static csi_gpio_pin_t key2;

extern volatile uint8_t g_key1;
extern volatile uint8_t g_key2;

void key_pinmux_init(void)
{
    csi_pin_set_mux(PA11, PIN_FUNC_GPIO);
    csi_pin_set_mux(PA12, PIN_FUNC_GPIO);

    csi_gpio_pin_init(&key1, PA11);
    csi_gpio_pin_dir(&key1, GPIO_DIRECTION_INPUT);
    csi_gpio_pin_init(&key2, PA12);
    csi_gpio_pin_dir(&key2, GPIO_DIRECTION_INPUT);
	g_key1 = 0;
	g_key2 = 0;
}

void key_loop(void)
{
	if(GPIO_PIN_LOW == csi_gpio_pin_read(&key1)) {
		//持续按键置标志
		if(g_key1) g_key1 |= 0x40;
		else g_key1 = 1;
	}
	//持续按键后释放
	else if(g_key1 & 0x40)	g_key1=0x80;
	else g_key1 = 0;
	
	if(GPIO_PIN_LOW == csi_gpio_pin_read(&key2)) {
		//printf("===key2=%d, %s, %d\n", g_key2, __FUNCTION__, __LINE__);
		if(g_key2) g_key2 |= 0x40;
		else g_key2 = 1;
	}
	else if(g_key2 & 0x40)	g_key2=0x80;
	else g_key2 = 0;
}

包含的头文件不是很精准,个人感觉应该可以少包含几个文件

对按键的处理采用了防抖,结合main例程中的循环延时实现

static void demo_task(void *arg)
{
    lv_init();
    oled_init();
	key_pinmux_init();
    lable_test();
    led_pinmux_init();
	

    while (1)
    {
        lv_task_handler();
        udelay(1000*10);
        lv_tick_inc(1);
		key_loop();
        led_refresh();
    }
}

只是这个延时还会影响到RGB三色LED的显示周期,依然采用PWM方式控制的显示

在led_refresh函数中加入了按键的处理,是防抖处理后释放时才起作用的,也符合一般按键的处理

部分代码如下

//持续按键后释放	
	if(g_key1 & 0x80) {
		printf("===key1:%s, %d\n", __FUNCTION__, __LINE__);
		g_ctr++;
		if (g_ctr == 3) g_ctr = 0;
		g_key1 = 0;
	}
	if(g_key2 & 0x80) {
		printf("===key2:%s, %d\n", __FUNCTION__, __LINE__);
		if (g_ctr == 0) g_ctr = 3;
		g_ctr--;
		g_key2 = 0;
	}

整体完成后的效果如下

 由于gif文件大小的限制,只转了key1按键的视频。

工程APP部分的代码 App.rar app.rar (8.39 KB, 下载次数: 5)

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表