三个按键进行设置阈值

Stm32控制三个按键,第一个按键可以进行阈值类型的选择,第二个进行阈值加,第三个进行阈值减的程序应该怎么搞

你可以使用STM32的GPIO模块来控制按键,使用定时器模块来检测按键状态的变化。下面是一个简单的示例代码,你可以参考一下:

#include "stm32f10x.h"

#define KEY1_PIN GPIO_Pin_0
#define KEY2_PIN GPIO_Pin_1
#define KEY3_PIN GPIO_Pin_2

#define THRESHOLD_MAX 100
#define THRESHOLD_MIN 0

uint8_t threshold_type = 0; // 阈值类型,0表示A阈值,1表示B阈值
uint8_t threshold_value = 50; // 阈值初始值为50

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin = KEY1_PIN | KEY2_PIN | KEY3_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void TIM_Configuration(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    TIM_TimeBaseStructure.TIM_Period = 1000; // 定时器周期为1ms
    TIM_TimeBaseStructure.TIM_Prescaler = 7200 - 1; // 定时器分频系数为7200
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    TIM_Cmd(TIM2, ENABLE);
}

void TIM2_IRQHandler(void)
{
    static uint8_t key1_state = 1, key2_state = 1, key3_state = 1;
    uint8_t key1_new_state, key2_new_state, key3_new_state;

    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
    {
        key1_new_state = GPIO_ReadInputDataBit(GPIOA, KEY1_PIN);
        key2_new_state = GPIO_ReadInputDataBit(GPIOA, KEY2_PIN);
        key3_new_state = GPIO_ReadInputDataBit(GPIOA, KEY3_PIN);

        if (key1_new_state == 0 && key1_state == 1) // KEY1按下
        {
            threshold_type = !threshold_type; // 切换阈值类型
        }

        if (key2_new_state == 0 && key2_state == 1) // KEY2按下
        {
            if (threshold_value < THRESHOLD_MAX)
            {
                threshold_value++; // 阈值加1
            }
        }

        if (key3_new_state == 0 && key3_state == 1) // KEY3按下
        {
            if (threshold_value > THRESHOLD_MIN)
            {
                threshold_value--; // 阈值减1
            }
        }

        key1_state = key1_new_state;
        key2_state = key2_new_state;
        key3_state = key3_new_state;

        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    }
}

int main(void)
{
    GPIO_Configuration();
    TIM_Configuration();

    while (1)
    {
    }
}

在上面的代码中,我们使用了定时器TIM2来检测按键状态的变化。定时器的周期为1ms,每隔1ms就会触发一次中断,在中断处理函数中检测按键状态的变化。如果检测到按键被按下,则进行相应的操作。

在这个示例代码中,我们使用了三个按键,KEY1用于切换阈值类型,KEY2用于增加阈值,KEY3用于减小阈值。阈值类型有两种,分别为A阈值和B阈值,阈值的初始值为50,最大值为100,最小值为0。

你可以根据自己的需求修改代码,比如增加更多的按键、修改阈值的范围等等。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7679312
  • 这篇博客也不错, 你可以看下【物联网开发】基于STM32和阿里云的室内温、湿、亮度监测系统(一)—— 物联网介绍和系统初步设计
  • 除此之外, 这篇博客: 通过STM32单片机计算并控制小车速度,通过控制速度的思想扩展到控制其它变化量中的 二、单片机相关定时器的作用以及配置 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 本次用到了3个定时器,分别是TIM2、TIM3、TIM4,定时器2用于定时,也就是定时10ms产生中断,然后到中断服务函数中去计算速度,定时器3用于输出PWM波来控制小车的行走,定时器4用来配置成编码器模式,用来读取编码器的数据。

  • 您还可以看一下 Abel小智老师的嵌入式开发系统学习路线 从基础到项目 精品教程 工程师必备课程 物联网课程中的 单片机STM32项目开发流程介绍小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题优化:如何编写一个程序,通过Stm32控制三个按键,分别实现阈值类型的选择、阈值的加法和减法?

    问题提示:需要用到Stm32的GPIO模块来控制按键的输入,通过判断按键的状态来实现功能。另外,需要定义变量来储存当前的阈值类型及其值,并在按键触发后修改这些变量的值。可以使用switch-case语句来实现阈值类型的选择,用if-else语句来实现阈值的加减。最后,需要将阈值输出到串口或其他显示模块上,方便调试和查看。

    解决方案:

    1. 确定使用的GPIO端口以及按键引脚的位置及命名,以便后续的代码实现。
    #define THRESHOLD_PORT GPIOB
    #define THRESHOLD_TYPE_PIN GPIO_PIN_0
    #define THRESHOLD_ADD_PIN GPIO_PIN_1
    #define THRESHOLD_SUB_PIN GPIO_PIN_2
    
    1. 初始化GPIO模块,将按键引脚配置为输入模式,并使能对应的端口。
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = THRESHOLD_TYPE_PIN | THRESHOLD_ADD_PIN | THRESHOLD_SUB_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(THRESHOLD_PORT, &GPIO_InitStruct);
    
    1. 定义变量来储存阈值类型及值,以及临时变量来存储按键状态,初始值为0。
    #define THRESHOLD_TEMP_CHANGE 10
    #define THRESHOLD_TEMP_CHANGE_TYPE 0
    #define THRESHOLD_HUM_CHANGE 5
    #define THRESHOLD_HUM_CHANGE_TYPE 1
    #define THRESHOLD_PRESS_CHANGE 20
    #define THRESHOLD_PRESS_CHANGE_TYPE 2
    
    int threshold_type = THRESHOLD_TEMP_CHANGE_TYPE; // 初始阈值类型为温度
    int threshold_value = 0; // 初始阈值为0
    
    int temp_val = 0;
    int add_val = 0;
    int sub_val = 0;
    
    1. 在主循环中检测按键状态,根据按键状态执行相应的操作。
    temp_val = HAL_GPIO_ReadPin(THRESHOLD_PORT, THRESHOLD_TYPE_PIN);
    if (!temp_val) // 判断阈值类型选择按键是否按下
    {
        switch (threshold_type) // 根据当前阈值类型改变阈值类型
        {
            case THRESHOLD_TEMP_CHANGE_TYPE:
                threshold_type = THRESHOLD_HUM_CHANGE_TYPE;
                break;  
            case THRESHOLD_HUM_CHANGE_TYPE:
                threshold_type = THRESHOLD_PRESS_CHANGE_TYPE;
                break;
            case THRESHOLD_PRESS_CHANGE_TYPE:
                threshold_type = THRESHOLD_TEMP_CHANGE_TYPE;
                break;
        }
    }
    
    add_val = HAL_GPIO_ReadPin(THRESHOLD_PORT, THRESHOLD_ADD_PIN); // 判断阈值加按键是否按下
    if (!add_val)
    {
        switch (threshold_type) // 根据当前阈值类型进行加减
        {
            case THRESHOLD_TEMP_CHANGE_TYPE:
                threshold_value += THRESHOLD_TEMP_CHANGE;
                break;
            case THRESHOLD_HUM_CHANGE_TYPE:
                threshold_value += THRESHOLD_HUM_CHANGE;
                break;
            case THRESHOLD_PRESS_CHANGE_TYPE:
                threshold_value += THRESHOLD_PRESS_CHANGE;
                break;
        }
    }
    
    sub_val = HAL_GPIO_ReadPin(THRESHOLD_PORT, THRESHOLD_SUB_PIN); // 判断阈值减按键是否按下
    if (!sub_val)
    {
        switch (threshold_type) // 根据当前阈值类型进行加减
        {
            case THRESHOLD_TEMP_CHANGE_TYPE:
                threshold_value -= THRESHOLD_TEMP_CHANGE;
                break;
            case THRESHOLD_HUM_CHANGE_TYPE:
                threshold_value -= THRESHOLD_HUM_CHANGE;
                break;
            case THRESHOLD_PRESS_CHANGE_TYPE:
                threshold_value -= THRESHOLD_PRESS_CHANGE;
                break;
        }
    }
    
    1. 在适当的时候将阈值输出到串口或其他显示模块上。
    char buf[32];
    sprintf(buf, "Threshold type: %d, value: %d\r\n", threshold_type, threshold_value);
    HAL_UART_Transmit(&huart1, (uint8_t *)buf, strlen(buf), 0xFFFF);