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。
你可以根据自己的需求修改代码,比如增加更多的按键、修改阈值的范围等等。
本次用到了3个定时器,分别是TIM2、TIM3、TIM4,定时器2用于定时,也就是定时10ms产生中断,然后到中断服务函数中去计算速度,定时器3用于输出PWM波来控制小车的行走,定时器4用来配置成编码器模式,用来读取编码器的数据。
问题优化:如何编写一个程序,通过Stm32控制三个按键,分别实现阈值类型的选择、阈值的加法和减法?
问题提示:需要用到Stm32的GPIO模块来控制按键的输入,通过判断按键的状态来实现功能。另外,需要定义变量来储存当前的阈值类型及其值,并在按键触发后修改这些变量的值。可以使用switch-case语句来实现阈值类型的选择,用if-else语句来实现阈值的加减。最后,需要将阈值输出到串口或其他显示模块上,方便调试和查看。
解决方案:
#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
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);
#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;
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;
}
}
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);