状态机代码解析:显示屏菜单界面控制
这段代码是一个状态机,用于控制一个显示屏上的菜单界面。它包含三个状态:
- 0 - 正常视图
- 1 - 详细视图
- 2 - 编辑视图
在正常视图中,用户可以使用上下按键选择菜单项,按下'查看详细信息'按钮可以进入详细视图。在详细视图中,用户可以查看当前选定菜单项的详细信息,并可以按下'编辑'按钮进入编辑视图。在编辑视图中,用户可以使用加减键修改当前选定菜单项的值,并可以按下'保存并退出'按钮保存修改并返回详细视图,或按下'退出'按钮放弃修改并返回详细视图。此外,代码还包含了一个定时器用于控制背光灯的开关。
以下是对代码的详细解释:
IF iState = -1 THEN // init
IF CaD.Operational AND pParams <> 0 THEN
iState := 0;
END_IF
RETURN;
END_IF
timerBacklight(IN := CaD.bySwitches > 0);
CaD.Backlight:=timerBacklight.Q;
CASE iState of
0: //normal view
IF CaD.bySwitches.7 AND iPos>0 THEN //up
iPos := iPos - 1;
xUpdate := TRUE;
END_IF
IF CaD.bySwitches.6 AND iPos<iNumParams-1 THEN //down
iPos := iPos + 1;
xUpdate := TRUE;
END_IF
IF xUpdate THEN
CaD.Clear();
CaD.SetText(pParams[iPos].sName, SEL(iPos+1 < iNumParams, '----', pParams[iPos+1].sName));
CaD.Cursor := FALSE;
CaD.Blink := FALSE;
xUpdate := FALSE;
END_IF
IF CaD.bySwitches.5 THEN // view detailed
xUpdate := TRUE;
iState := 1;
END_IF
1: //view detailed
IF xUpdate THEN
str := right(concat('00000', INT_TO_STRING(pParams[iPos].iValue)), 5);
str2 := LEFT(concat(pParams[iPos].sUnit, ' '), 4);
str := concat(str, ' [');
str := concat(str, str2);
str := concat(str, ' ]');
CaD.Clear();
CaD.SetText(pParams[iPos].sName, str);
CaD.Cursor := FALSE;
CaD.Blink := FALSE;
xUpdate := FALSE;
END_IF
IF CaD.bySwitches.4 THEN //exit
iState := 0;
xUpdate := TRUE;
END_IF
IF CaD.bySwitches.5 THEN //edit
xUpdate := TRUE;
iTempValue := pParams[iPos].iValue;
iState := 2;
END_IF
2: //edit
IF CAD.bySwitches.0 AND iTempValue > pParams[iPos].iMin THEN //-
iTempValue := iTempValue - 1;
xUpdate := TRUE;
ELSIF CAD.bySwitches.1 AND iTempValue < pParams[iPos].iMax THEN //+
iTempValue := iTempValue + 1;
xUpdate := TRUE;
END_IF
IF xUpdate THEN
CaD.SetCursor(0, 1);
CaD.Write(right(concat('00000', INT_TO_STRING(iTempValue)), 5));
CaD.SetCursor(4, 1);
CaD.Cursor := TRUE;
CaD.Blink := (iTempValue <> pParams[iPos].iValue);
xUpdate := FALSE;
END_IF
IF CAD.bySwitches.2 THEN // store&exit
pParams[iPos].iValue := iTempValue;
iState := 1;
xUpdate := TRUE;
END_IF
IF CaD.bySwitches.4 THEN //exit
iState := 1;
xUpdate := TRUE;
END_IF
END_CASE
代码中涉及的主要变量和含义如下:
- iState: 当前状态,取值范围为 0,1,2,分别对应正常视图,详细视图,编辑视图。
- iPos: 当前选定菜单项的索引。
- iNumParams: 菜单项的数量。
- pParams: 一个数组,存储每个菜单项的信息,包括名称、单位、最小值、最大值、当前值等。
- CaD: 控制显示屏的类或对象,包含用于清除屏幕、设置文本、设置光标等操作的函数。
- bySwitches: 一个字节变量,表示当前按下哪些按键。
- xUpdate: 布尔变量,表示是否需要更新显示屏。
- iTempValue: 临时变量,用于保存编辑视图中修改后的值。
- timerBacklight: 定时器,用于控制背光灯的开关。
这段代码利用状态机和按键事件处理机制,实现了对显示屏上菜单界面的控制,并可以进行简单的参数编辑和保存。
注意: 以上代码示例仅供参考,实际应用中可能需要根据具体需求进行调整。
原文地址: https://www.cveoy.top/t/topic/ihdv 著作权归作者所有。请勿转载和采集!