如何在C中对键盘,LCD及其相关上下文进行编码[关闭]

yzckvree  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(80)

已关闭,此问题需要更focused。它目前不接受回答。
**想改善这个问题吗?**更新问题,使其只关注editing this post的一个问题。

10天前关闭。
Improve this question
我正在尝试构建一个嵌入式应用程序。其中,我有一个键盘接口和一个LCD显示接口.我使用“C编程”进行编码。
我有MenuUpDownRightLeftSelectExit(7)键。
根据上下文,我应该在LCD上显示内容。
比如说,

  • Menu键被按下,我需要显示菜单选项.
  • 在这些菜单选项中,根据UpDownRightLeft按键,我需要在LCD上导航不同的选项。
  • 如果用户选择“一个选项”从上面的上下文,那么我需要显示该选项的相关内容。

因此,有许多可能的组合。我知道,我可以放置足够的条件语句/切换案例来构建我的应用程序;但是,我想知道是否有更优雅的编码方式。
明天,如果我得到20+键和100+不同的LCD上下文显示在屏幕上,那么可以肯定的是,使用条件语句将不起作用(或变得太乏味!)
有没有什么好的编程技术可以解决这个问题?

t3irkdon

t3irkdon1#

就像迪米奇说的...你可以使用有限状态机来扩展你的应用程序,通过向转换表添加更多的状态和事件来处理额外的键和LCD上下文,而不用用一堆条件语句来弄乱你的代码。这将使您的代码更加模块化,并且随着应用程序的增长而更加易于维护。
定义状态,然后定义事件,然后创建转换表,然后实现fsm。
1.定义状态:确定应用程序可能处于的不同状态。在您的情况下,状态可能包括“主菜单”、“子菜单1”、“子菜单2”等。每个状态对应于特定的LCD上下文。
1.定义事件:识别可能触发状态转换的事件或用户输入。这些事件可以是您提到的按键(菜单、向上、向下、向右、向左、选择、退出)。
1.创建状态转换表:构建一个Map当前状态、事件和下一个状态的表。此表将定义应用程序在不同状态下如何响应用户输入。
1.实施FSM:编写代码读取用户输入并根据转换表更新当前状态。这可以使用switch-case语句或查找表来完成。
这里有一个例子,你可以如何实现这一点.

// Define states
enum State {
    MAIN_MENU,
    SUBMENU_1,
    // Add more states as needed
};

// Define events
enum Event {
    MENU_PRESSED,
    UP_PRESSED,
    DOWN_PRESSED,
    // Add more events as needed
};

// State transition table
const enum State transitionTable[NUM_STATES][NUM_EVENTS] = {
    // Define transitions based on the current state and event
    // For example: [MAIN_MENU][MENU_PRESSED] = SUBMENU_1
};

// Current state
enum State currentState = MAIN_MENU;

// Main application loop
while (1) {
    // Read user input (e.g., key presses)
    enum Event userEvent = readUserInput();

    // Update the current state based on the state transition table
    currentState = transitionTable[currentState][userEvent];

    // Update LCD display based on the current state
    updateLCD(currentState);
}

如果你需要更多关于fsm的内容,这里有一篇文章我觉得很有帮助。
https://flaviocopes.com/finite-state-machines/

相关问题