沐若清辰675 2023-05-11 13:49 采纳率: 0%
浏览 206

三个按键进行设置阈值

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

  • 写回答

2条回答 默认 最新

  • QxNL 2023-05-11 14:29
    关注

    你可以使用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。

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

    评论

报告相同问题?

问题事件

  • 修改了问题 5月11日
  • 创建了问题 5月11日

悬赏问题

  • ¥15 preLaunchTask"C/C++: aarch64- apple-darwin22-g++-14 生成活动 文件”已终止,退出代码为-1。
  • ¥18 关于#贝叶斯概率#的问题:这篇文章中利用em算法求出了对数似然值作为概率表参数,然后进行概率表计算,这个概率表是怎样计算的呀
  • ¥20 C#上传XML格式数据
  • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
  • ¥100 单片机hardfaulr
  • ¥20 手机截图相片分辨率降低一半
  • ¥50 求一段sql语句,遇到小难题了,可以50米解决
  • ¥15 速求,对多种商品的购买力优化问题(用遗传算法、枚举法、粒子群算法、模拟退火算法等方法求解)
  • ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)
  • ¥15 虚拟机检测,可以是封装好的DLL,可付费