#2020征文-开发板# Hi3861 OLED板模拟开关按键操作

幸运兔脚
发布于 2020-12-17 17:51
浏览
0收藏

玩玩OLED板子上面的两个模拟开关S1与S2。
首先查看原理图:
这两个按键是连接在GPIO5上面的,我在上一个帖子上面使用的User按键也是连接在这个端口的,GPIO是一个模拟端口使用了ADC2,通过这个模拟端口我们可以一次性读取三个按钮的值了。
从原理图可以看出,S1按钮的值就为参考电压*(1/(4.7+1)),S2按钮的值就为参考电压*((1+1)/(4.7+1+1)),具体数值可以写一个程序用串口读取读出的ADC数字来查看。

#2020征文-开发板# Hi3861 OLED板模拟开关按键操作-鸿蒙开发者社区

#2020征文-开发板# Hi3861 OLED板模拟开关按键操作-鸿蒙开发者社区

#2020征文-开发板# Hi3861 OLED板模拟开关按键操作-鸿蒙开发者社区

我最开始写了一个程序用来读取按下按键之后的ADC的电压。
按下User按键之后电压值为160,而且按下User+S2+S2都是这个值,因为User按钮没有接电阻,按下之后相当于电流没有从S1和S2流过。
单独按下S1的值大概为320。同时按下S1和S2的话,值也是S1的值320.因为电流也只会从S1流过,感觉这个模拟开关设计不是很好,应该多加两个电阻,让S1和S2同时按下的时候有不同的值,这样相当于多了一种按键情况。
单独按下S2的值为548.

 

我在写程序的时候发现ADC并不需要初始化,可以直接读取就行了。
所以设计程序如下:
创建任务

    static void KeyEntry(void)
    {
        osThreadAttr_t attr;

    //    GpioInit();
        // IoSetFunc(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_IO_FUNC_GPIO_5_GPIO);
        // GpioSetDir(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_GPIO_DIR_IN);
    //    AdcRead();

        attr.name = "KeyTask";
        attr.attr_bits = 0U;
        attr.cb_mem = NULL;
        attr.cb_size = 0U;
        attr.stack_mem = NULL;
        attr.stack_size = KEY_TASK_STACK_SIZE;
        attr.priority = KEY_TASK_PRIO;

        if (osThreadNew((osThreadFunc_t)KeyTask, NULL, &attr) == NULL) {
            printf("[KeyTask] Falied to create KeyTask!\n");
        }
    }
    SYS_RUN(KeyEntry);

模拟开关值读取:

    <!--StartFragment-->
    <div><div>static void *KeyTask(const char *arg)</div><div>{</div><div>    (void)arg;</div><div>
    </div><div>    hi_u16 Key_adc_value = 0u;</div><div>    hi_u32 ret = 0;</div>
    <div>    while (1) {</div><div>        ret = hi_adc_read((hi_adc_channel_index)HI_ADC_CHANNEL_2, &Key_adc_value, </div><div>                    HI_ADC_EQU_MODEL_1, HI_ADC_CUR_BAIS_DEFAULT, 0);</div><div>        if (ret != HI_ERR_SUCCESS) {</div><div>            printf("ADC Read Fail\n");</div><div>        }</div><div>        else</div><div>        {</div><div>//            printf("ADC value = %d", Key_adc_value);</div><div>        }</div>
    <div>        /*User 按键ADC值读出来大概为116*/</div><div>        /*S1 按键ADC读出来大概为320*/</div><div>        /*S2 按键ADC读出来大概为548*/</div><div>        if(Key_adc_value <= 200)</div><div>        {</div><div>            printf("User key pressed\n");</div><div>        }</div><div>        else if(Key_adc_value <= 400)</div><div>        {</div><div>            printf("User S1 pressed\n");</div><div>        }   </div><div>        else if(Key_adc_value <= 600)</div><div>        {</div><div>            printf("User S2 pressed\n");</div><div>        }</div><div>        else</div><div>        {</div><div>            </div><div>        }</div><div>        </div><div>        usleep(KEY_INTERVAL_TIME_US);</div><div>    }</div>
    <div>    return NULL;</div><div>}</div></div><!--EndFragment-->

 测试效果如下:

#2020征文-开发板# Hi3861 OLED板模拟开关按键操作-鸿蒙开发者社区

分类
标签
已于2020-12-17 17:51:54修改
收藏
回复
举报
回复
    相关推荐