我正在编写一个程序来打开stm 32板上的leds (Kameleon-STM32L496ZGT6型)。
我有LED 7 6 5 4 3 1 0
当我运行程序时,它从0到7,而不是反弹,然后从7到0,依此类推。
当我点击操纵杆(GPIOE,GPIO_PIN_15)时,它会改变方向。
下面的代码可以工作,但我觉得它可能更清晰和/或更优化。是否可以重写main (我宁愿不重写setSingleLED函数)。
void setSingleLED(int which)
{
if(which > 7 || which < 0)
{
return;
}
GPIO_TypeDef * ports[8] = {GPIOC, GPIOC, GPIOC, GPIOC, GPIOE, GPIOD, GPIOE, GPIOE};
uint16_t pins[8] = {GPIO_PIN_6, GPIO_PIN_7, GPIO_PIN_8, GPIO_PIN_9, GPIO_PIN_4, GPIO_PIN_3, GPIO_PIN_5, GPIO_PIN_6};
for (int i = 0; i < 8; i++)
{
HAL_GPIO_WritePin(ports[i], pins[i], GPIO_PIN_RESET);
}
HAL_GPIO_WritePin(ports[which], pins[which], GPIO_PIN_SET);
}
int main(void)
{
int zmienna=0;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, RESET);
int current_diode = 0;
int dir = 1;
while (1)
{
if (current_diode < 0)
{
zmienna=0;
current_diode = 1;
dir=1;
}
else if (current_diode > 8)
{
zmienna=1;
current_diode=7;
dir=1;
}
setSingleLED(current_diode);
//HAL_Delay(100);
unsigned int i = 0;
int ischange=0;
while (i < 5000)
{
if((HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_15) == 0)&&(ischange==0))
{
ischange=1;
if(dir==1)
{
dir= -1;
}
else
{
dir= 1;
}
}
i++;
}
if(zmienna>0)
{
current_diode -= dir;
}
else
{
current_diode += dir;
}
}
}发布于 2022-04-23 19:28:06
下面是一些改进代码的方法:
once
i == which ports和pins数组移出函数之外,以确保它们仅为选择ports状态而初始化ports和pins。这样就不需要检查which是否在范围之内。zmienna和dir合并成一个单一变量dir,因为如果由于用户交互需要改变方向,或者由于到达上或下循环到5000,则没有任何区别,这似乎是一种取消按钮的方法。这不应该需要,因为循环包含一个HAL_Delay()来控制移动的速度。如果这还不够,在If子句中添加更多的HAL_Delay()以检测按下的按钮。dir = -dir来更改方向(而不是if 代码,这样current_diode的更新就更接近了)。
static GPIO_TypeDef * ports[8] = {GPIOC, GPIOC, GPIOC, GPIOC, GPIOE, GPIOD, GPIOE, GPIOE};
static uint16_t pins[8] = {GPIO_PIN_6, GPIO_PIN_7, GPIO_PIN_8, GPIO_PIN_9, GPIO_PIN_4, GPIO_PIN_3, GPIO_PIN_5, GPIO_PIN_6};
void setSingleLED(int which)
{
for (int i = 0; i < 8; i++)
{
HAL_GPIO_WritePin(ports[i], pins[i], i == which ? GPIO_PIN_SET : GPIO_PIN_RESET);
}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, RESET);
int current_diode = 0;
int dir = 1;
while (1)
{
// light up selected LED
setSingleLED(current_diode);
// check if button has been pressed
if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_15) == 0)
{
dir = -dir; // change direction
}
// update selected LED position
current_diode += dir;
if (current_diode < 0)
{
current_diode = 0;
dir = 1;
}
else if (current_diode > 7)
{
current_diode = 7;
dir = -1;
}
// delay to control speed of effect
HAL_Delay(100);
}
}https://stackoverflow.com/questions/71926768
复制相似问题