我们有一个嵌入式C编程任务,我们必须实现一个状态机,该状态机根据操纵杆的输入改变一系列LED。其中两种情况是:“如果左LED亮起并按下Down,则更改为右LED”和“如果右LED亮起并按下Down,则更改为左LED”。我知道如何打开某些LED的on按钮,但我不知道如何检查GPIO引脚/LED的状态,并根据使用操纵杆时的状态更改另一个LED。我基本上只想知道如何“调用”LED的状态。
这是到目前为止的状态机示例代码:
void
StateMachine ()
{
// REPLACE THE FOLLOW CODE WITH YOUR SOLUTION
// This code just toggles top LED and set left or right LED.
//
// Solution.
uint8_t Joystick;
uint8_t Toggle = 0;
while (1)
{
Joystick = GetJoystick();
if (Joystick == 'L')
{
WriteLED ('L', LED_ON);
WriteLED ('R', LED_OFF);
}
else if (Joystick == 'R')
{
WriteLED ('L', LED_OFF);
WriteLED ('R', LED_ON);
}
if (Toggle == 0)
{
WriteLED ('T', LED_ON);
Toggle = 1;
}
else
{
WriteLED ('T', LED_OFF);
Toggle = 0;
}
}
}更新:这是我的WriteLED方法
void
WriteLED (uint8_t LED, uint8_t State)
{
// Check for correct state
if ((State != LED_OFF) && (State != LED_ON))
{
return;
}
// Turn on/off the LED
switch (LED)
{
case 'L':
HAL_GPIO_WritePin (LD4_GPIO_Port, LD4_Pin, State);
break;
case 'T':
HAL_GPIO_WritePin (LD3_GPIO_Port, LD3_Pin, State);
break;
case 'B':
HAL_GPIO_WritePin (LD6_GPIO_Port, LD6_Pin, State);
break;
case 'R':
HAL_GPIO_WritePin (LD5_GPIO_Port, LD5_Pin, State);
break;
}
return;
}发布于 2019-04-03 17:08:00
如果分配特别要求一个“状态机”,那么软件应该以某种方式具有不同的内部“状态”,对应于不同的LED输出要求。表示状态机的方法有很多种-- (您看过吗?) --例如:
// enumeration of the required states
enum OutputState {
stateAllOff, // I'm *guessing* this is the required initial state?
stateLeftLED,
stateRightLED,
// ... any other states that are specified.
// ... but *not* random combinations of LEDs that are not part of the specification.
};
enum OutputState currentState = stateAllOff; // or whatever initial state is required
// [...] I'm not going to do the actual assignment here状态机不需要读取发光二极管的状态,它只需要在currentState变量中“记住”它们。现在,代码的其余部分变成了对给定条件的直接实现,所以……
“如果左侧指示灯亮起并按下向下按钮,则更改为右侧指示灯”
if (currentState == stateLeftLED) {
if (Joystick == "D") {
WriteLED ('R', LED_ON);
WriteLED ('L', LED_OFF);
currentState = stateRightLED;
}
}发布于 2019-04-03 16:25:33
STM的HAL库提供了一个与您已经使用的WritePin函数类似的ReadPin函数。
它的声明如下所示:
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)这意味着你可以像这样读取某个引脚的状态:
GPIO_PinState ld6_state = HAL_GPIO_ReadPin(LD6_GPIO_Port, LD6_Pin);GPIO_PinState是一个枚举:
typedef enum
{
GPIO_PIN_RESET = 0,
GPIO_PIN_SET
}GPIO_PinState;剩下的工作就是将read函数(ld6_state)的返回值与枚举值进行比较。正如第一个答案所提到的,您很可能会遇到一些输入的跳动,这是由按钮的机械结构造成的。我想找出如何解决这个问题是任务的一部分,所以我会把它留给你。要查找的关键字:去抖动或去抖动
发布于 2019-04-03 15:26:08
通常,GPIO的状态保存在寄存器变量中。您要么需要这个变量的定义,要么需要一个指向它的地址的向量来直接读取(或操作)它。您有WriteLED方法的文档吗?它可以给你一个提示。
如果您没有找到任何东西,您仍然可以实现一个标志来指示您最近打开的是哪个LED。
通常,嵌入式编程在很大程度上依赖于您正在使用的芯片和相应的编译器。因此,为了给你一个更好的答案,你应该首先提供重要的信息,比如你正在使用的硬件和软件以及你想要实现的库。
https://stackoverflow.com/questions/55489106
复制相似问题