【平头哥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)
|