【HarmonyOS HiSpark Wi-Fi IoT 套件试用连载】4, 按键驱动LED

描述

本文来源电子发烧友社区,作者:hehung, 帖子地址:https://bbs.elecfans.com/jishu_2013493_1_1.html


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

核心板上有一个LED以及按键,我们查看原理图可以知道,LED连接到GPIO9,按键连接到了GPIO5.
wi-fi wi-fi
所以只需要初始化这两个引脚作为输入输出就行了,还是比较简单的,因为是学习,所以从简单的开始入手。

初始化代码如下:
LED初始化,初始化为输出:
  1. GpioInit();
  2.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO);
  3.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);
复制代码


KEY初始化函数,初始化为输入:
  1. GpioInit();
  2.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_IO_FUNC_GPIO_5_GPIO);
  3.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_GPIO_DIR_IN);
复制代码


如何调用呢?
看下边:
控制GPIO输出,1为输出高,0位输出低:
  1. GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
复制代码
获取GPIO输入电平:
  1. WifiIotGpioValue Key_Status = WIFI_IOT_GPIO_VALUE1;
  2. GpioGetinputVal(WIFI_IOT_IO_NAME_GPIO_5, &Key_Status);
复制代码
其中:Key_Status
就是获取的电平值,GpioGetInputVal()的返回值表示获取是否成功的标志。
我创建了两个任务:
一个任务专门控制LED,一个任务控制Key。
上电之后,LED闪烁,频率是500ms。
按下user按键之后,LED灭
再次按下user按键,LED亮
再次按下user按键,再次闪烁
以此循环。

完整代码如下:
BUILD.gn
  1. static_library("myapp") {
  2.     sources = [
  3.         "my_main.c"
  4.     ]
  5.     include_dirs = [
  6.         "//utils/native/lite/include",
  7.         "//kernel/liteos_m/components/cmsis/2.0",
  8.         "//base/iot_hardware/interfaces/kits/wifiiot_lite",
  9.         "//vender/hisi/hi3861/hi3861/include"
  10.     ]
  11. }
复制代码


my_main.c函数
  1. /*this is my first application*/
  2. /*2020/11/08*/
  3.  
  4. #include
  5. #include "ohos_init.h"
  6. #include "ohos_types.h"
  7. #include
  8.  
  9. #include
  10.  
  11. #include "ohos_init.h"
  12. #include "cmsis_os2.h"
  13. #include "wifiiot_gpio.h"
  14. #include "wifiiot_gpio_ex.h"
  15. #include "wifiiot_adc.h"
  16.  
  17. #include
  18. #include
  19. #include
  20. #include
  21.  
  22.  
  23.  
  24. #define LED_INTERVAL_TIME_US 500000    /*500ms*/
  25. #define LED_TASK_STACK_SIZE 512
  26. #define LED_TASK_PRIO 25
  27.  
  28. #define KEY_INTERVAL_TIME_US 10000    /*10ms*/
  29. #define KEY_TASK_STACK_SIZE 1024
  30. #define KEY_TASK_PRIO 26
  31.  
  32. static void *LedTask(const char *arg);
  33. static void *KeyTask(const char *arg);
  34.  
  35. /*LED Control*/
  36. enum LedState {
  37.     LED_ON = 0,
  38.     LED_OFF,
  39.     LED_SPARK,
  40. };
  41. enum LedState g_ledState = LED_SPARK;
  42.  
  43.  
  44.  
  45.  
  46. static void *LedTask(const char *arg)
  47. {
  48.     (void)arg;
  49.    
  50.     while (1) {
  51.         switch (g_ledState) {
  52.             case LED_ON:
  53.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
  54.                 usleep(LED_INTERVAL_TIME_US);
  55.                 break;
  56.             case LED_OFF:
  57.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0);
  58.                 usleep(LED_INTERVAL_TIME_US);
  59.                 break;
  60.             case LED_SPARK:
  61.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0);
  62.                 usleep(LED_INTERVAL_TIME_US);
  63.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
  64.                 usleep(LED_INTERVAL_TIME_US);
  65.                 break;
  66.             default:
  67.                 usleep(LED_INTERVAL_TIME_US);
  68.                 break;
  69.         }
  70.     }
  71.  
  72.     return NULL;
  73. }
  74.  
  75. static void Led0Entry(void)
  76. {
  77.     osThreadAttr_t attr;
  78.  
  79.     GpioInit();
  80.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO);
  81.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);
  82.  
  83.     attr.name = "LedTask";
  84.     attr.attr_bits = 0U;
  85.     attr.cb_mem = NULL;
  86.     attr.cb_size = 0U;
  87.     attr.stack_mem = NULL;
  88.     attr.stack_size = LED_TASK_STACK_SIZE;
  89.     attr.priority = LED_TASK_PRIO;
  90.  
  91.     if (osThreadNew((osThreadFunc_t)LedTask, NULL, &attr) == NULL) {
  92.         printf("[Led0Task] Falied to create LedTask!n");
  93.     }
  94. }
  95. SYS_RUN(Led0Entry);
  96.  
  97. /*OLED board KEY Control - vased on ADC input*/
  98. static void *KeyTask(const char *arg)
  99. {
  100.     (void)arg;
  101.  
  102.     WifiIotGpioValue Key_Status = WIFI_IOT_GPIO_VALUE1;
  103.     WifiIotGpioValue Last_key_Status = WIFI_IOT_GPIO_VALUE1;
  104.     uint8_t Key_press_cnt = 0u;
  105.  
  106.     while (1) {
  107.         GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_5, &Key_Status);
  108. //        printf("%dn", Key_Status);
  109.  
  110.         if((Key_Status == WIFI_IOT_GPIO_VALUE0) && (Last_key_Status != Key_Status))
  111.         {
  112. //            Key_press_cnt = (Key_press_cnt>2) ? 0:(++Key_press_cnt);
  113.             if(Key_press_cnt >= 2)
  114.             {
  115.                 Key_press_cnt = 0;
  116.             }
  117.             else
  118.             {
  119.                 Key_press_cnt ++;
  120.             }
  121.             switch(Key_press_cnt)
  122.             {
  123.                 case 0:g_ledState = LED_ON;break;
  124.                 case 1:g_ledState = LED_OFF;break;
  125.                 case 2:g_ledState = LED_SPARK;break;
  126.             }
  127.         }
  128.         else
  129.         {
  130.  
  131.         }
  132.         
  133.         Last_key_Status = Key_Status;
  134.         usleep(LED_INTERVAL_TIME_US);
  135.     }
  136.  
  137.     return NULL;
  138. }
  139.  
  140. static void KeyEntry(void)
  141. {
  142.     osThreadAttr_t attr;
  143.  
  144.     GpioInit();
  145.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_IO_FUNC_GPIO_5_GPIO);
  146.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_GPIO_DIR_IN);
  147. //    AdcRead();
  148.  
  149.     attr.name = "KeyTask";
  150.     attr.attr_bits = 0U;
  151.     attr.cb_mem = NULL;
  152.     attr.cb_size = 0U;
  153.     attr.stack_mem = NULL;
  154.     attr.stack_size = KEY_TASK_STACK_SIZE;
  155.     attr.priority = KEY_TASK_PRIO;
  156.  
  157.     if (osThreadNew((osThreadFunc_t)KeyTask, NULL, &attr) == NULL) {
  158.         printf("[KeyTask] Falied to create KeyTask!n");
  159.     }
  160. }
  161. SYS_RUN(KeyEntry);
  162.  
复制代码

我的软件目录如下:
wi-fi

最后效果图见视频。
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分