• Lv0
    粉丝0

积分6 / 贡献0

提问3答案被采纳0文章0

关于gpio按键输入控制led灯亮灭的问题

hentaiplus 显示全部楼层 发表于 2024-4-14 13:07:02

include<stdio.h>

include"ohos_init.h"

include"cmsis_os2.h"

include"iot_gpio.h"

include"hi_io.h"

define LED_TASK_GPIO 9

static void LedTask(void *arg) { (void)arg IoTGpioInit(LED_TASK_GPIO); hi_io_set_func(LED_TASK_GPIO,HI_IO_FUNC_GPIO_9_GPIO); IoTGpioSetDir(LED_TASK_GPIO,IOT_GPIO_DIR_OUT); while(1) { IoTGpioSetOutputVal(LED_TASK_GPIO<IOT_GPIO_VALUE0); osDelay(50); IoTGpioSetOutputVal(LED_TASK_GPIO,IOT_GPIO_VALUE1); osDelay(100); } } static void LedEntry(void) { osThreadAttr_t attr; attr.name="LedTask" sttr.stack_size=4096 attr.priority=osPriorityNormal;

if (osThreadNew(LedTask,NULL,&attr)==NULL)
{
    printf("[LedDemo] Creat LedTask failed!\n")
}

} SYS_RUN(LedEntry);

这段代码可以让led灯一直闪,灯亮的时间和间隔是由while循环里的语句决定的

include<stdio.h>

include"ohos_init.h"

include"cmsis_os2.h"

include"iot_gpio.h"

include"hi_io.h"

define LED_GPIO 9

define BUTTON_GPIO 5

static void GpioTask(void *arg) { (void)arg; IoTGpioInit(LED_GPIO); IoTGpioInit(BUTTON_GPIO); hi_io_set_func(LED_TASK_GPIO,HI_IO_FUNC_GPIO_9_GPIO); IoTGpioSetDir(LED_GPIO,IOT_GPIO_DIR_OUT); hi_io_set_func(BUTTON_GPIO,HI_IO_FUNC_GPIO_5_GPIO); IoTGpioSetDir(BUTTON_GPIO,IOT_GPIO_DIR_IN); hi_io_set_pull(BUTTON_GPIO,HI_IO_PULL_UP); while(1) { IoTGpioValue value=IOT_GPIO_VALUE0; IoTGpioGetInputVal(BUTTON_GPIO,&value); printf("Button value:%d\n",value); IoTGpioSetOutputVal(LED_GPIO,value); osDelay } } static void GpioEntry(void) { osThreadAttr_t attr={0}; attr.name="GpioTask"; attr.stack_sick=4096; attr.priority=osPriorityNormal; if(osThreadNew(GpioTask,NULL,&attr)==NULL) { printf("[GpioDemo] Create GpioTask failed!\n") } } SYS_RUN(GpioEntry)

用这段代码可以实现用按钮当开关,按一下亮再按一下灭

那么为什么把第一段代码的工作循环中的代码放在第二段代码的工作循环里不能实现按一下闪一次,而是直接就灭灯怎么也不亮了呢🤔

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

精彩评论1

论坛小助手 官方账号

沙发 发表于 2024-4-15 19:53:46
第一段代码是一个简单的LED闪烁任务,第二段代码则是一个基于GPIO输入的按钮读取和LED控制任务。这些代码片段是基于OpenHarmony操作系统的吧,建议在支持OpenHarmony的环境中编译和运行。同时,请确保GPIO引脚的编号和功能与实际硬件相匹配。

看看这两段的改进建议是否适合:
第一段:
代码中有一些语法错误,例如sttr应该是attr.stack_size。
IoTGpioSetOutputVal函数调用时缺少参数,应该是IoTGpioSetOutputVal(LED_TASK_GPIO, value);。
osDelay函数的参数应该是毫秒数,所以50和100代表延时50毫秒和100毫秒。

第二段:
代码中有一些语法错误,例如attr.stack_sick应该是attr.stack_size。
osDelay函数调用后缺少参数和分号,应该是osDelay(某个值);。
为了避免在读取按钮状态和设置LED状态之间产生竞争条件,可以考虑使用互斥量(mutex)来同步这两个操作。
如果按钮的状态变化不频繁,可以考虑在读取按钮状态后加入一个短暂的延时,以减少CPU的使用率。

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部