#2020征文-开发板# Hi3861按键驱动LED

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

有一周多没有时间弄这个板子了,这段时间实在是有点忙,这周末抓紧了点时间弄了弄。资料确实有点少了,只能一点一点的摸索。弄了一个按键控制LED的程序。

 

核心板上有一个LED以及按键,我们查看原理图可以知道,LED连接到GPIO9,按键连接到了GPIO5.

#2020征文-开发板# Hi3861按键驱动LED-鸿蒙开发者社区

#2020征文-开发板# Hi3861按键驱动LED-鸿蒙开发者社区

 

所以只需要初始化这两个引脚作为输入输出就行了,还是比较简单的,因为是学习,所以从简单的开始入手。

初始化代码如下:
LED初始化,初始化为输出:

    GpioInit();
        IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO);
        GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);
  • 1.
  • 2.
  • 3.

 KEY初始化函数,初始化为输入:

    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);
  • 1.
  • 2.
  • 3.

如何调用呢?
看下边:
控制GPIO输出,1为输出高,0位输出低:

    GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
  • 1.

获取GPIO输入电平:

    WifiIotGpioValue Key_Status = WIFI_IOT_GPIO_VALUE1;
    GpioGetinputVal(WIFI_IOT_IO_NAME_GPIO_5, &Key_Status);
  • 1.
  • 2.

其中:Key_Status 
就是获取的电平值,GpioGetInputVal()的返回值表示获取是否成功的标志。
我创建了两个任务:
一个任务专门控制LED,一个任务控制Key。
上电之后,LED闪烁,频率是500ms。
按下user按键之后,LED灭
再次按下user按键,LED亮
再次按下user按键,再次闪烁
以此循环。

 

完整代码如下:
BUILD.gn

    static_library("myapp") {
        sources = [
            "my_main.c"
        ]
        include_dirs = [
            "//utils/native/lite/include",
            "//kernel/liteos_m/components/cmsis/2.0",
            "//base/iot_hardware/inteRFaces/kits/wifiiot_lite",
            "//vender/hisi/hi3861/hi3861/include"
        ]
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

 

 my_main.c函数

/*this is my first application*/
/*2020/11/08*/

#include <stdio.h>
#include "ohos_init.h"
#include "ohos_types.h"
#include <stdio.h>

#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_adc.h"

#include <hi_types_base.h>
#include <hi_i2c.h>
#include <hi_early_debug.h>
#include <hi_stdlib.h>



#define LED_INTERVAL_TIME_US 500000    /*500ms*/
#define LED_TASK_STACK_SIZE 512
#define LED_TASK_PRIO 25

#define KEY_INTERVAL_TIME_US 10000    /*10ms*/
#define KEY_TASK_STACK_SIZE 1024
#define KEY_TASK_PRIO 26

static void *LedTask(const char *arg);
static void *KeyTask(const char *arg);

/*LED Control*/
enum LedState {
    LED_ON = 0,
    LED_OFF,
    LED_SPARK,
};
enum LedState g_ledState = LED_SPARK;




static void *LedTask(const char *arg)
{
    (void)arg;
   
    while (1) {
        switch (g_ledState) {
            case LED_ON:
                GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
                usleep(LED_INTERVAL_TIME_US);
                break;
            case LED_OFF:
                GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0);
                usleep(LED_INTERVAL_TIME_US);
                break;
            case LED_SPARK:
                GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0);
                usleep(LED_INTERVAL_TIME_US);
                GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
                usleep(LED_INTERVAL_TIME_US);
                break;
            default:
                usleep(LED_INTERVAL_TIME_US);
                break;
        }
    }

    return NULL;
}

static void Led0Entry(void)
{
    osThreadAttr_t attr;

    GpioInit();
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO);
    GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);

    attr.name = "LedTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = LED_TASK_STACK_SIZE;
    attr.priority = LED_TASK_PRIO;

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

/*OLED board KEY Control - vased on ADC input*/
static void *KeyTask(const char *arg)
{
    (void)arg;

    WifiIotGpioValue Key_Status = WIFI_IOT_GPIO_VALUE1;
    WifiIotGpioValue Last_key_Status = WIFI_IOT_GPIO_VALUE1;
    uint8_t Key_press_cnt = 0u;

    while (1) {
        GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_5, &Key_Status);
//        printf("%d\n", Key_Status);

        if((Key_Status == WIFI_IOT_GPIO_VALUE0) && (Last_key_Status != Key_Status))
        {
//            Key_press_cnt = (Key_press_cnt>2) ? 0:(++Key_press_cnt);
            if(Key_press_cnt >= 2)
            {
                Key_press_cnt = 0;
            }
            else
            {
                Key_press_cnt ++;
            }
            switch(Key_press_cnt)
            {
                case 0:g_ledState = LED_ON;break;
                case 1:g_ledState = LED_OFF;break;
                case 2:g_ledState = LED_SPARK;break;
            }
        }
        else
        {

        }
        
        Last_key_Status = Key_Status;
        usleep(LED_INTERVAL_TIME_US);
    }

    return NULL;
}

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);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.

 

 我的软件目录如下:

#2020征文-开发板# Hi3861按键驱动LED-鸿蒙开发者社区

 

 

 

分类
已于2020-12-17 17:52:07修改
1
收藏 2
回复
举报
1
2
回复
    相关推荐