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 + -
显示快捷键?