用stm32cube写stm32f103zet6带8个灯的流水灯,使用4个按钮分别控制开始,暂停,加速,减速。代码
时间: 2024-02-15 13:05:03 浏览: 92
基于stm32f103zet6的流水灯实验程序
好的,根据您的要求,我为您提供以下代码,希望对您有所帮助:
首先,需要在STM32CubeMX中设置GPIO口的输入输出模式,将8个灯的GPIO口设置为输出模式,4个按钮的GPIO口设置为输入模式。然后在"Pinout & Configuration"中设置好对应GPIO口的引脚号和模式,生成代码后即可进行编程。
以下是流水灯的代码实现:
```c
#include "stm32f1xx_hal.h"
#define LED_NUM 8
GPIO_TypeDef* LED_GPIO_Port[LED_NUM] = {GPIOB, GPIOB, GPIOB, GPIOB, GPIOB, GPIOB, GPIOB, GPIOB};
uint16_t LED_Pin[LED_NUM] = {GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3, GPIO_PIN_4, GPIO_PIN_5, GPIO_PIN_6, GPIO_PIN_7};
GPIO_TypeDef* BTN_GPIO_Port[4] = {GPIOC, GPIOC, GPIOC, GPIOC};
uint16_t BTN_Pin[4] = {GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3};
uint8_t led_state = 0;
uint8_t led_dir = 1;
uint32_t led_speed = 100; // ms
uint32_t led_timer = 0;
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pins : PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void BTN_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOC_CLK_ENABLE();
/*Configure GPIO pins : PC0 PC1 PC2 PC3 */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
void LED_Update(void)
{
if(HAL_GetTick() - led_timer >= led_speed){
led_timer = HAL_GetTick();
if(led_dir == 1){
if(led_state == LED_NUM-1){
led_dir = -1;
led_state--;
}
else{
led_state++;
}
}
else{
if(led_state == 0){
led_dir = 1;
led_state++;
}
else{
led_state--;
}
}
}
for(int i=0; i<LED_NUM; i++){
if(i == led_state){
HAL_GPIO_WritePin(LED_GPIO_Port[i], LED_Pin[i], GPIO_PIN_SET);
}
else{
HAL_GPIO_WritePin(LED_GPIO_Port[i], LED_Pin[i], GPIO_PIN_RESET);
}
}
}
int main(void)
{
HAL_Init();
LED_Init();
BTN_Init();
while (1)
{
if(HAL_GPIO_ReadPin(BTN_GPIO_Port[0], BTN_Pin[0]) == GPIO_PIN_RESET){
led_dir = 1;
}
else if(HAL_GPIO_ReadPin(BTN_GPIO_Port[1], BTN_Pin[1]) == GPIO_PIN_RESET){
led_dir = 0;
}
else if(HAL_GPIO_ReadPin(BTN_GPIO_Port[2], BTN_Pin[2]) == GPIO_PIN_RESET){
led_speed /= 2;
}
else if(HAL_GPIO_ReadPin(BTN_GPIO_Port[3], BTN_Pin[3]) == GPIO_PIN_RESET){
led_speed *= 2;
}
LED_Update();
}
}
```
代码中,LED_Update()函数为流水灯的更新函数,可根据led_state和led_dir的值来控制灯的状态和方向。四个按钮分别对应着修改led_dir、led_speed的值。其中led_speed的单位为毫秒,可根据实际需要进行调整。
阅读全文