kit7828 发表于 2022-3-13 14:52

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

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

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

<p>&nbsp;分别是Key1对应管脚PA11,Key2对应管脚PA12。</p>

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

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

<p>&nbsp; 具体代码如下:</p>

<pre>
<code>#define _DEFAULT_SOURCE /* needed for usleep() */
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt;
#include &lt;time.h&gt;
#include &lt;aos/aos.h&gt;
#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 &lt;drv/pin.h&gt;

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(&amp;key1, PA11);
    csi_gpio_pin_dir(&amp;key1, GPIO_DIRECTION_INPUT);
    csi_gpio_pin_init(&amp;key2, PA12);
    csi_gpio_pin_dir(&amp;key2, GPIO_DIRECTION_INPUT);
        g_key1 = 0;
        g_key2 = 0;
}

void key_loop(void)
{
        if(GPIO_PIN_LOW == csi_gpio_pin_read(&amp;key1)) {
                //持续按键置标志
                if(g_key1) g_key1 |= 0x40;
                else g_key1 = 1;
        }
        //持续按键后释放
        else if(g_key1 &amp; 0x40)        g_key1=0x80;
        else g_key1 = 0;
       
        if(GPIO_PIN_LOW == csi_gpio_pin_read(&amp;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 &amp; 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 &amp; 0x80) {
                printf("===key1:%s, %d\n", __FUNCTION__, __LINE__);
                g_ctr++;
                if (g_ctr == 3) g_ctr = 0;
                g_key1 = 0;
        }
        if(g_key2 &amp; 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>&nbsp;由于gif文件大小的限制,只转了key1按键的视频。</p>

<p>工程APP部分的代码 App.rar</p>
页: [1]
查看完整版本: 【平头哥RVB2601创意应用开发】 四、RVB2601之按键测试(带防抖处理)