【平头哥RVB2601创意应用开发】 四、RVB2601之按键测试(带防抖处理)
本帖最后由 kit7828 于 2022-3-13 14:54 编辑<p>平头哥的开发文档中可以得到以下两个按键的信息</p>
<p> 分别是Key1对应管脚PA11,Key2对应管脚PA12。</p>
<p>前面几次的测试中一直没有评测按键,这次把按键加上,顺便做了防抖处理</p>
<p>首先通过CDK增加一个新的C文件,key.c</p>
<p> 具体代码如下:</p>
<pre>
<code>#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;
}</code></pre>
<p>包含的头文件不是很精准,个人感觉应该可以少包含几个文件</p>
<p>对按键的处理采用了防抖,结合main例程中的循环延时实现</p>
<pre>
<code>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();
}
}
</code></pre>
<p>只是这个延时还会影响到RGB三色LED的显示周期,依然采用PWM方式控制的显示</p>
<p>在led_refresh函数中加入了按键的处理,是防抖处理后释放时才起作用的,也符合一般按键的处理</p>
<p>部分代码如下</p>
<pre>
<code>//持续按键后释放
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;
}</code></pre>
<p>整体完成后的效果如下</p>
<p> 由于gif文件大小的限制,只转了key1按键的视频。</p>
<p>工程APP部分的代码 App.rar</p>
页:
[1]