menufsm.lis
来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 666 行 · 第 1/2 页
LIS
666 行
.module MenuFSM.C
.area lit(rom, con, rel)
0000 _KeyTab::
0000 00 .byte 0
0001 01 .byte 1
0002 02 .byte 2
0003 03 .byte 3
0004 04 .byte 4
0005 4400 .word PL_DispMenuTop
0007 01 .byte 1
0008 00 .byte 0
0009 00 .byte 0
000A 00 .byte 0
000B 00 .byte 0
000C 4200 .word PL_DispMenuTopUp
000E 02 .byte 2
000F 00 .byte 0
0010 00 .byte 0
0011 00 .byte 0
0012 00 .byte 0
0013 4000 .word PL_DispMenuTopDown
0015 03 .byte 3
0016 00 .byte 0
0017 00 .byte 0
0018 00 .byte 0
0019 00 .byte 0
001A 3E00 .word PL_DispMenuTopLeft
001C 04 .byte 4
001D 00 .byte 0
001E 00 .byte 0
001F 00 .byte 0
0020 00 .byte 0
0021 3C00 .word PL_DispMenuTopRight
0023 05 .byte 5
0024 06 .byte 6
0025 07 .byte 7
0026 08 .byte 8
0027 09 .byte 9
0028 3A00 .word PL_DispIcoMenuInit
002A 06 .byte 6
002B 00 .byte 0
002C 00 .byte 0
002D 00 .byte 0
002E 00 .byte 0
002F 3800 .word PL_DispIcoMenuUp
0031 07 .byte 7
0032 00 .byte 0
0033 00 .byte 0
0034 00 .byte 0
0035 00 .byte 0
0036 3600 .word PL_DispIcoMenuDown
0038 08 .byte 8
0039 00 .byte 0
003A 00 .byte 0
003B 00 .byte 0
003C 00 .byte 0
003D 3400 .word PL_DispIcoMenuLeft
003F 09 .byte 9
0040 00 .byte 0
0041 00 .byte 0
0042 00 .byte 0
0043 00 .byte 0
0044 3200 .word PL_DispIcoMenuRight
0046 0A .byte 10
0047 0B .byte 11
0048 0C .byte 12
0049 0D .byte 13
004A 0E .byte 14
004B 3000 .word PL_DispMenuFuncInit
004D 0B .byte 11
004E 00 .byte 0
004F 00 .byte 0
0050 00 .byte 0
0051 00 .byte 0
0052 2E00 .word PL_DispMenuFuncUp
0054 0C .byte 12
0055 00 .byte 0
0056 00 .byte 0
0057 00 .byte 0
0058 00 .byte 0
0059 2C00 .word PL_DispMenuFuncDown
005B 0D .byte 13
005C 00 .byte 0
005D 00 .byte 0
005E 00 .byte 0
005F 00 .byte 0
0060 2A00 .word PL_DispMenuFuncLeft
0062 0E .byte 14
0063 00 .byte 0
0064 00 .byte 0
0065 00 .byte 0
0066 00 .byte 0
0067 2800 .word PL_DispMenuFuncRight
0069 0F .byte 15
006A 10 .byte 16
006B 11 .byte 17
006C 12 .byte 18
006D 13 .byte 19
006E 2600 .word PL_DispMenuParaInit
0070 10 .byte 16
0071 00 .byte 0
0072 00 .byte 0
0073 00 .byte 0
0074 00 .byte 0
0075 2400 .word PL_DispMenuParaUp
0077 11 .byte 17
0078 00 .byte 0
0079 00 .byte 0
007A 00 .byte 0
007B 00 .byte 0
007C 2200 .word PL_DispMenuParaDown
007E 12 .byte 18
007F 00 .byte 0
0080 00 .byte 0
0081 00 .byte 0
0082 00 .byte 0
0083 2000 .word PL_DispMenuParaLeft
0085 13 .byte 19
0086 00 .byte 0
0087 00 .byte 0
0088 00 .byte 0
0089 00 .byte 0
008A 1E00 .word PL_DispMenuParaRight
008C 14 .byte 20
008D 15 .byte 21
008E 16 .byte 22
008F 17 .byte 23
0090 18 .byte 24
0091 1C00 .word PL_DispMenuLanguageInit
0093 15 .byte 21
0094 00 .byte 0
0095 00 .byte 0
0096 00 .byte 0
0097 00 .byte 0
0098 1A00 .word PL_DispMenuLanguageUp
009A 16 .byte 22
009B 00 .byte 0
009C 00 .byte 0
009D 00 .byte 0
009E 00 .byte 0
009F 1800 .word PL_DispMenuLanguageDown
00A1 17 .byte 23
00A2 00 .byte 0
00A3 00 .byte 0
00A4 00 .byte 0
00A5 00 .byte 0
00A6 1600 .word PL_DispMenuLanguageLeft
00A8 18 .byte 24
00A9 00 .byte 0
00AA 00 .byte 0
00AB 00 .byte 0
00AC 00 .byte 0
00AD 1400 .word PL_DispMenuLanguageRight
00AF 19 .byte 25
00B0 1A .byte 26
00B1 1B .byte 27
00B2 1C .byte 28
00B3 1D .byte 29
00B4 1200 .word PL_DispMenuMeasureInit
00B6 1A .byte 26
00B7 00 .byte 0
00B8 00 .byte 0
00B9 00 .byte 0
00BA 00 .byte 0
00BB 1000 .word PL_DispMenuMeasureUp
00BD 1B .byte 27
00BE 00 .byte 0
00BF 00 .byte 0
00C0 00 .byte 0
00C1 00 .byte 0
00C2 0E00 .word PL_DispMenuMeasureDown
00C4 1C .byte 28
00C5 00 .byte 0
00C6 00 .byte 0
00C7 00 .byte 0
00C8 00 .byte 0
00C9 0C00 .word PL_DispMenuMeasureLeft
00CB 1D .byte 29
00CC 00 .byte 0
00CD 00 .byte 0
00CE 00 .byte 0
00CF 00 .byte 0
00D0 0A00 .word PL_DispMenuMeasureRight
00D2 1E .byte 30
00D3 1F .byte 31
00D4 20 .byte 32
00D5 21 .byte 33
00D6 22 .byte 34
00D7 0800 .word PL_DispMenuSetupInit
00D9 1F .byte 31
00DA 00 .byte 0
00DB 00 .byte 0
00DC 00 .byte 0
00DD 00 .byte 0
00DE 0600 .word PL_DispMenuSetupUp
00E0 20 .byte 32
00E1 00 .byte 0
00E2 00 .byte 0
00E3 00 .byte 0
00E4 00 .byte 0
00E5 0400 .word PL_DispMenuSetupDown
00E7 21 .byte 33
00E8 00 .byte 0
00E9 00 .byte 0
00EA 00 .byte 0
00EB 00 .byte 0
00EC 0200 .word PL_DispMenuSetupLeft
00EE 22 .byte 34
00EF 00 .byte 0
00F0 00 .byte 0
00F1 00 .byte 0
00F2 00 .byte 0
00F3 0000 .word PL_DispMenuSetupRight
.area text(rom, con, rel)
; IsKey -> R20
.even
0000 _CheckKey::
0000 0E940000 xcall push_gset2
0004 ; /*这份代码经源码格式软件格式化过
0004 ; yang_hx@neusoft.com */
0004 ; /******************************************************************************
0004 ; * MenuFSM.C - 菜单框架和FSM代码
0004 ; ******************************************************************************/
0004 ;
0004 ; #include "SYS_Config.h"
0004 ; #include "KeyScan.H"
0004 ; #include "LcdDrive.H"
0004 ; #include "Menu.H"
0004 ;
0004 ; //FIXME!
0004 ; //改进想法:如何在菜单中可以接管其它有效按键,这里程序仅仅接管了方向按键,若能根据1--9这些数字按键跳转也是不错
0004 ; //额外的问题是如何在应用程序中得到按键而却不需要在应用程序中做键盘检查循环(抢占CPU时间了,会使得原有可以在背景运行的程序无法执行)
0004 ; /*
0004 ; * A>改进FSM编号的机制,使得维护更简单,能否自动编号?这样会使得添加FSM表容易
0004 ; * B>
0004 ; */
0004 ; //-----------------------------------
0004 ; //MenuTop.C
0004 ; void DispMenuTop(void);
0004 ; void DispMenuTopUp(void);
0004 ; void DispMenuTopDown(void);
0004 ; void DispMenuTopLeft(void);
0004 ; void DispMenuTopRight(void);
0004 ;
0004 ; void DispIcoMenuInit(void);
0004 ; void DispIcoMenuUp(void);
0004 ; void DispIcoMenuDown(void);
0004 ; void DispIcoMenuLeft(void);
0004 ; void DispIcoMenuRight(void);
0004 ;
0004 ; //MenuFunc.C
0004 ; void DispMenuFuncInit(void);
0004 ; void DispMenuFuncUp(void);
0004 ; void DispMenuFuncDown(void);
0004 ; void DispMenuFuncLeft(void);
0004 ; void DispMenuFuncRight(void);
0004 ;
0004 ; //MenuPara.C
0004 ; void DispMenuParaInit(void);
0004 ; void DispMenuParaUp(void);
0004 ; void DispMenuParaDown(void);
0004 ; void DispMenuParaLeft(void);
0004 ; void DispMenuParaRight(void);
0004 ;
0004 ; //MenuLanguage.C
0004 ; void DispMenuLanguageInit(void);
0004 ; void DispMenuLanguageUp(void);
0004 ; void DispMenuLanguageDown(void);
0004 ; void DispMenuLanguageLeft(void);
0004 ; void DispMenuLanguageRight(void);
0004 ;
0004 ; //MenuMeasure.C
0004 ; void DispMenuMeasureInit(void);
0004 ; void DispMenuMeasureUp(void);
0004 ; void DispMenuMeasureDown(void);
0004 ; void DispMenuMeasureLeft(void);
0004 ; void DispMenuMeasureRight(void);
0004 ;
0004 ; //MenuSetup.C
0004 ; void DispMenuSetupInit(void);
0004 ; void DispMenuSetupUp(void);
0004 ; void DispMenuSetupDown(void);
0004 ; void DispMenuSetupLeft(void);
0004 ; void DispMenuSetupRight(void);
0004 ;
0004 ; #ifdef DynamicBar
0004 ; //MenuFunc.C
0004 ; void DispMenuDataInit(void);
0004 ; void DispMenuDataUp(void);
0004 ; void DispMenuDataDown(void);
0004 ; void DispMenuDataLeft(void);
0004 ; void DispMenuDataRight(void);
0004 ; #endif
0004 ;
0004 ; void(*KeyFuncPtr)(void);//按键功能指针
0004 ;
0004 ; typedef struct
0004 ; {
0004 ; INT8U KeyStateIndex ; //当前状态索引号
0004 ; INT8U KeyUpState ; //按下"向上"键时转向的状态索引号
0004 ; INT8U KeyDnState ; //按下"向下"键时转向的状态索引号
0004 ; INT8U KeyLState ; //按下"向左"键时转向的状态索引号
0004 ; INT8U KeyRState ; //按下"向右"键时转向的状态索引号
0004 ; void(*CurrentOperate)(void);//当前状态应该执行的功能操作
0004 ; }KbdTabStruct ;
0004 ;
0004 ; //如下是菜单的关键代码
0004 ; //不清楚具体含义 不能改动
0004 ; //因为跟编译器相关
0004 ; //如下的函数的名称也不可以轻易修改
0004 ; /********************************************************************************
0004 ;
0004 ; FSM菜单实现机制说明:
0004 ; A.一些约定:只有4个按键来做菜单周转,这四个按键Up/Down/Left/Down 对应功能是:确认/回退/向上/向下
0004 ; B.每一层的bar型菜单需要大概5个状态(也就是5个函数)来实现,分别是MenuInit/MenuUp/MenuDown/MenuLeft/MenuRight
0004 ; 对应的功能解释:
0004 ; MenuInit : 初始化菜单/重新初始化菜单,在进入一个子Bar菜单时,该函数把Bar显示指针根据语言指向子Bar的资源数组,
0004 ; 获得需要的参数:该子菜单多少个Bar项(ItemNum)/每个Bar项的字符长度(Size)/指向Bar显示内容的指针(DispItem).
0004 ; 而后,调用函数BarMenuInit,该函数初始化全部Bar显示--这就是初始化菜单.
0004 ; 若是是从子菜单返回时,那么在返回前,Pop函数被调用,各种菜单参数被还原,在进入本函数后,本函数根据得到参数显示Bar项
0004 ; 初始化菜单/重新初始化菜单的不同点在于:
0004 ; 初始化时 高亮显示的位置是在顶部,对应选中的Item也是在顶部
0004 ; 重新初始化时 由于用户通过按键向上/向下来选择Bar项,而后通过按键确认来进入子菜单,为了在退出子菜单时能得到跟进入
0004 ; 前一致的显示内容,因此需要备份一些相关数据:高亮的位置/选中的Item/当前FSM的Index号 在退出子菜单时Pop还原这些数据
0004 ; 本函数根据这些还原数据恢复显示.
0004 ;
0004 ; MenuUp : 根据Bar显示内容执行对应动作函数/或者周转到某层子菜单
0004 ; MenuDown : 返回上层菜单 通常是简单调用Pop函数
0004 ; MenuLeft : 移至上一个Bar项 通常是调用BarMenuLeft函数--该函数维护Bar的显示后FSM状态返回MenunInit,但由于没有打开Flash/Reflash项,因此没有执行MenuInit函数
0004 ; MenuRight: 移至下一个Bar项 通常是调用BarMenuright函数--该函数维护Bar的显示后FSM状态返回MenunInit,但由于没有打开Flash/Reflash项,因此没有执行MenuInit函数
0004 ;
0004 ;
0004 ; ********************************************************************************
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?