零基础RT-thread第二节:按键控制

我这里依然使用的是野火开发板,F767芯片。

这一节写一下按键控制LED亮灭。

这是按键以及LED的原理图。

按键对应的引脚不按下时是低电平,按下后是高电平。

LED是在低电平点亮。

接下来是key.c:

c 复制代码
/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2025-06-13     c       the first version
 */

#include "key.h"

/* 初始化按键引脚 */
void key_init(void)
{
    rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT);
    rt_pin_mode(KEY2_PIN, PIN_MODE_INPUT);
}

/* 获取指定按键状态 */
rt_bool_t key_state_get(rt_base_t pin)
{
    if(rt_pin_read(pin))
    {
        while(rt_pin_read(pin));
        return 1;
    }
    else {
        return 0;
    }
}

然后是key.h文件

c 复制代码
/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2025-06-13     c       the first version
 */
#ifndef APPLICATIONS_KEY_H_
#define APPLICATIONS_KEY_H_

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

#define KEY1_PIN GET_PIN(A, 0)
#define KEY2_PIN GET_PIN(C, 13)


void key_init(void);

rt_bool_t key_state_get(rt_base_t pin);

#endif /* APPLICATIONS_KEY_H_ */

最后是main.c文件:

c 复制代码
// main.c
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <key.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#define LED_R_PIN    GET_PIN(H, 10)  // PH10 (122)
#define LED_G_PIN    GET_PIN(H, 11)  // PH11 (123)
#define LED_B_PIN    GET_PIN(H, 12)  // PH12 (124)

static rt_base_t led_r_stat = PIN_LOW;
static rt_base_t led_g_stat = PIN_HIGH;
static rt_base_t led_b_stat = PIN_HIGH;

int main(void)
{
    LOG_I("System startup!");

    rt_pin_mode(LED_R_PIN, PIN_MODE_OUTPUT);
    rt_pin_mode(LED_G_PIN, PIN_MODE_OUTPUT);
    rt_pin_mode(LED_B_PIN, PIN_MODE_OUTPUT);

    rt_pin_write(LED_G_PIN, led_g_stat);
    rt_pin_write(LED_B_PIN, led_b_stat);

    while (1)
    {
        if (key_state_get(KEY1_PIN)) {//key1控制红灯 
            led_r_stat = (led_r_stat == PIN_LOW) ? PIN_HIGH : PIN_LOW;
            rt_pin_write(LED_R_PIN, led_r_stat);
        }
        if (key_state_get(KEY2_PIN)) {//key2控制绿灯
            led_g_stat = (led_g_stat == PIN_LOW) ? PIN_HIGH : PIN_LOW;
            rt_pin_write(LED_G_PIN, led_g_stat);
        }
        rt_thread_mdelay(500);
    }
    return RT_EOK;
}

这段代码很简单,但其实我在写代码时遇到了很多问题,按键一直不管用,LED也不能正常点亮。然后我胡乱调试,突然间就可以了 ,具体是什么原因也没有找到,很可惜没有发现到底问题出在哪里。

不管怎么说,实验最后还是成功了。

相关推荐
LDR0062 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
✎ ﹏梦醒͜ღ҉繁华落℘2 天前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
Luminous.2 天前
C语言--day30
c语言·开发语言
玖玥拾2 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
謓泽2 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言
不会C语言的男孩2 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
牛根生同志2 天前
SPI数据收发的时候 TXE与RXNE标志位置位的时机
stm32·spi·transfer
2601_951643882 天前
C语言长文整理,关键字和数据类型
c语言·数据类型·关键字·嵌入式开发·格式化输出
goldenrolan2 天前
学习型红外控制系统稳定性挂测工装专项总结
软件测试·python·stm32·嵌入式·红外
m0_547486662 天前
《C#语言程序设计与实践》 全套PPT课件
c语言·c#·c语言程序设计