menutop.lis

来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 1,561 行 · 第 1/5 页

LIS
1,561
字号
                        .module MenuTop.C
                        .area text(rom, con, rel)
                        .even
 0000           _InitMenuVal::
 0000           ; /******************************************************************************
 0000           ;  * MenuTop.C - 顶层菜单 条项菜单核心函数 图标层函数等
 0000           ;  ******************************************************************************/
 0000           ; 
 0000           ; #include "SYS_Config.h" 
 0000           ; #include "GUI_Config.h" 
 0000           ; #include "GUI.H" 
 0000           ; #include "LcdDrive.h" 
 0000           ; #include "Menu.H" 
 0000           ; 
 0000           ; #define BarRemainDot  3
 0000           ; //数字显示位置
 0000           ; #define BarNumPosY    56
 0000           ; //Bar的显示开始/结束位置
 0000           ; #define BarBeginPosY  0
 0000           ; 
 0000           ; #define BarEndPosX    LCD_XSIZE
 0000           ; #define BarEndPosY    6*8
 0000           ; 
 0000           ; extern INT8U ItemBackup_i;
 0000           ; extern INT8U ItemBackup[];
 0000           ; 
 0000           ; void Bar(INT8U Item_,INT8U ItemNum_,INT8U BarPosX,INT8U BarNumPosX);
 0000           ; 
 0000           ; void DispBuildTime(void);
 0000           ; //编译时间
 0000           ; /*
 0000           ; *****************************************************************************
 0000           ; * InitMenuVal - 初始化菜单系统
 0000           ; * DESCRIPTION: -
 0000           ; * 该函数必须在进入菜单前被调用   初始化全局变量
 0000           ; *****************************************************************************
 0000           ; */
 0000           ; void InitMenuVal(void)
 0000           ; {
 0000           ;     WhereBackup_i=0 ;
 0000 2224              clr R2
 0002 20920000          sts _WhereBackup_i,R2
 0006           ;     ItemBackup_i=0 ;
 0006 20920000          sts _ItemBackup_i,R2
 000A           ;     Layer=0 ;
 000A 20920000          sts _Layer,R2
 000E           ;     FatherIndex[Layer++]=MenuTopIndex ;
 000E 3324              clr R3
 0010 822D              mov R24,R2
 0012 8F5F              subi R24,255    ; addi 1
 0014 80930000          sts _Layer,R24
 0018 80E0              ldi R24,<_FatherIndex
 001A 90E0              ldi R25,>_FatherIndex
 001C E22D              mov R30,R2
 001E FF27              clr R31
 0020 E80F              add R30,R24
 0022 F91F              adc R31,R25
 0024 2082              std z+0,R2
 0026           L1:
 0026                   .dbline 0 ; func end
 0026 0895              ret
                        .even
 0028           _DispMenuTop::
 0028 2597              sbiw R28,5
 002A           ;     //push index  待机界面作为起点
 002A           ; }
 002A           ; /*
 002A           ; *****************************************************************************
 002A           ; * DispMenuTop - 待机界面层5个函数
 002A           ; * DESCRIPTION: -
 002A           ; * DispMenuTop   DispMenuTopUp  DispMenuTopDown  DispMenuTopLeft DispMenuTopRight
 002A           ; *****************************************************************************
 002A           ; */
 002A           ; 
 002A           ; //待机界面
 002A           ; void DispMenuTop(void)
 002A           ; {
 002A           ;     GUI_Clear();
 002A 0E940000          xcall _GUI_Clear
 002E           ;     GUI_DispStringAtBar("菜单",0,1,LCD_XSIZE,GUI_TA_HCENTER);
 002E 80E1              ldi R24,16
 0030 8C83              std y+4,R24
 0032 81E6              ldi R24,97
 0034 8A83              std y+2,R24
 0036 81E0              ldi R24,1
 0038 8883              std y+0,R24
 003A 2227              clr R18
 003C 00E0              ldi R16,<L3
 003E 10E0              ldi R17,>L3
 0040 0E940000          xcall _GUI_DispStringAtBar
 0044           ;     //显示按键对应的文字提示,0-->"功能表"
 0044           ;     GUI_DispStringAt(*(Tip[language].Text),1,LCD_YSIZE-14);
 0044 86E3              ldi R24,54
 0046 8883              std y+0,R24
 0048 21E0              ldi R18,1
 004A 20900000          lds R2,_language
 004E 85E0              ldi R24,5
 0050 829D              mul R24,R2
 0052 F001              movw R30,R0
 0054 80E0              ldi R24,<_Tip
 0056 90E0              ldi R25,>_Tip
 0058 E80F              add R30,R24
 005A F91F              adc R31,R25
 005C 0590              lpm R0,Z+
 005E 1490              lpm R1,Z
 0060 F001              movw R30,R0
 0062 0081              ldd R16,z+0
 0064 1181              ldd R17,z+1
 0066 0E940000          xcall _GUI_DispStringAt
 006A           ;       //显示按键对应的文字提示,0-->"捷径"
 006A           ;       GUI_DispStringAt(*(Tip[language].Text+5),LCD_XSIZE-24,LCD_YSIZE-14);
 006A 86E3              ldi R24,54
 006C 8883              std y+0,R24
 006E 29E4              ldi R18,73
 0070 20900000          lds R2,_language
 0074 85E0              ldi R24,5
 0076 829D              mul R24,R2
 0078 F001              movw R30,R0
 007A 80E0              ldi R24,<_Tip
 007C 90E0              ldi R25,>_Tip
 007E E80F              add R30,R24
 0080 F91F              adc R31,R25
 0082 0590              lpm R0,Z+
 0084 1490              lpm R1,Z
 0086 F001              movw R30,R0
 0088 0285              ldd R16,z+10
 008A 1385              ldd R17,z+11
 008C 0E940000          xcall _GUI_DispStringAt
 0090           L2:
 0090 2596              adiw R28,5
 0092                   .dbline 0 ; func end
 0092 0895              ret
                        .even
 0094           _DispMenuTopUp::
 0094           ; }
 0094           ; //待机界面下Up键的处理
 0094           ; void DispMenuTopUp(void)
 0094           ; {
 0094           ;     //-------------------
 0094           ;     KeyPressCount=0 ;
 0094 2224              clr R2
 0096 20920000          sts _KeyPressCount,R2
 009A           ;     //-------------------
 009A           ;     GUI_Clear();
 009A 0E940000          xcall _GUI_Clear
 009E           ;     //-------------------
 009E           ;     //这里是顶层菜单,因此在进入子菜单前需要初始化变量
 009E           ;     InitMenuVal();
 009E B0DF              xcall _InitMenuVal
 00A0           ;     //--------------------------
 00A0           ;     //状态跳转,进入子菜单
 00A0           ;     //jump to Menu index
 00A0           ;     Jump2Menu(MenuIndex,FlashMode_AutoInit);
 00A0 21E0              ldi R18,1
 00A2 05E0              ldi R16,5
 00A4 0E940000          xcall _Jump2Menu
 00A8           ;     return ;
 00A8           L4:
 00A8                   .dbline 0 ; func end
 00A8 0895              ret
                        .even
 00AA           _DispMenuTopDown::
 00AA           ; }
 00AA           ; //待机界面下Down键的处理
 00AA           ; void DispMenuTopDown(void)
 00AA           ; {
 00AA           ; 	if((KeyPressCount++)==0x01)
 00AA 20900000          lds R2,_KeyPressCount
 00AE 3324              clr R3
 00B0 822D              mov R24,R2
 00B2 8F5F              subi R24,255    ; addi 1
 00B4 80930000          sts _KeyPressCount,R24
 00B8 822D              mov R24,R2
 00BA 8130              cpi R24,1
 00BC 51F4              brne L6
 00BE           ;       {
 00BE           ;           KeyPressCount=0 ;
 00BE 2224              clr R2
 00C0 20920000          sts _KeyPressCount,R2
 00C4           ;           GUI_Clear();
 00C4 0E940000          xcall _GUI_Clear
 00C8           ;               Jump2Menu(MenuSetupIndex,FlashMode_AutoInit);
 00C8 21E0              ldi R18,1
 00CA 0EE1              ldi R16,30
 00CC 0E940000          xcall _Jump2Menu
 00D0           ;         return ;
 00D0 04C0              xjmp L5
 00D2           L6:
 00D2           ; 	}
 00D2           ;     //return to MenuTop index
 00D2           ;     Jump2Menu(MenuTopIndex,FlashMode_NoAction);
 00D2 2227              clr R18
 00D4 0027              clr R16
 00D6 0E940000          xcall _Jump2Menu
 00DA           ;     return ;
 00DA           L5:
 00DA                   .dbline 0 ; func end
 00DA 0895              ret
                        .even
 00DC           _DispMenuTopLeft::
 00DC           ; }
 00DC           ; //待机界面下Left键的处理
 00DC           ; void DispMenuTopLeft(void)
 00DC           ; {
 00DC           ;     KeyPressCount=0 ;
 00DC 2224              clr R2
 00DE 20920000          sts _KeyPressCount,R2
 00E2           ;     /**  这里可以做这个按键的功能定义,因为这是在待机界面下
 00E2           ;          比如,做某个子菜单的快捷链接--按下该按键就直接跳转到某个子菜单
 00E2           ;     */
 00E2           ;     //-------------------
 00E2           ;     //这里是顶层菜单,因此在进入子菜单前需要初始化变量
 00E2           ;     //    InitMenuVal();
 00E2           ;     //--------------------------
 00E2           ;     //状态跳转,进入子菜单
 00E2           ;     Jump2Menu(MenuTopIndex,FlashMode_NoAction);
 00E2 2227              clr R18
 00E4 0027              clr R16
 00E6 0E940000          xcall _Jump2Menu
 00EA           ;     return ;
 00EA           L8:
 00EA                   .dbline 0 ; func end
 00EA 0895              ret
                        .even
 00EC           _DispMenuTopRight::
 00EC           ; }
 00EC           ; //待机界面下Right键的处理
 00EC           ; void DispMenuTopRight(void)
 00EC           ; {
 00EC           ;     KeyPressCount=0 ;
 00EC 2224              clr R2
 00EE 20920000          sts _KeyPressCount,R2
 00F2           ; 
 00F2           ;     //功能函数执行完毕后重新回到待机界面
 00F2           ;     Jump2Menu(MenuTopIndex,FlashMode_NoAction);
 00F2 2227              clr R18
 00F4 0027              clr R16
 00F6 0E940000          xcall _Jump2Menu
 00FA           ;     return ;
 00FA           L9:
 00FA                   .dbline 0 ; func end
 00FA 0895              ret
                        .even
 00FC           _PUSH::
 00FC           ; }
 00FC           ; 
 00FC           ; 
 00FC           ; //菜单备份函数,备份当前菜单的各个参数
 00FC           ; void PUSH(void)
 00FC           ; {
 00FC           ;     WhereBackup[WhereBackup_i++]=Where ;//备份Where--->高亮显示的位置
 00FC 20900000          lds R2,_WhereBackup_i
 0100 3324              clr R3
 0102 822D              mov R24,R2
 0104 8F5F              subi R24,255    ; addi 1
 0106 80930000          sts _WhereBackup_i,R24
 010A 80E0              ldi R24,<_WhereBackup
 010C 90E0              ldi R25,>_WhereBackup
 010E E22D              mov R30,R2
 0110 FF27              clr R31
 0112 E80F              add R30,R24
 0114 F91F              adc R31,R25
 0116 20900000          lds R2,_Where
 011A 2082              std z+0,R2
 011C           ;     ItemBackup[ItemBackup_i++]=Item ;   //备份Item--->当前项的位置
 011C 20900000          lds R2,_ItemBackup_i
 0120 3324              clr R3
 0122 822D              mov R24,R2
 0124 8F5F              subi R24,255    ; addi 1
 0126 80930000          sts _ItemBackup_i,R24
 012A 80E0              ldi R24,<_ItemBackup
 012C 90E0              ldi R25,>_ItemBackup
 012E E22D              mov R30,R2
 0130 FF27              clr R31
 0132 E80F              add R30,R24
 0134 F91F              adc R31,R25
 0136 20900000          lds R2,_Item
 013A 2082              std z+0,R2
 013C           ;     FatherIndex[Layer++]=KeyFuncIndex ; //备份KeyFuncIndex--->状态机的状态
 013C 20900000          lds R2,_Layer
 0140 3324              clr R3
 0142 822D              mov R24,R2
 0144 8F5F              subi R24,255    ; addi 1
 0146 80930000          sts _Layer,R24
 014A 80E0              ldi R24,<_FatherIndex
 014C 90E0              ldi R25,>_FatherIndex
 014E E22D              mov R30,R2
 0150 FF27              clr R31
 0152 E80F              add R30,R24
 0154 F91F              adc R31,R25
 0156 20900000          lds R2,_KeyFuncIndex
 015A 2082              std z+0,R2
 015C           L10:
 015C                   .dbline 0 ; func end
 015C 0895              ret
                        .even
 015E           _POP::
 015E           ; }
 015E           ; 
 015E           ; //菜单还原函数
 015E           ; void POP(void)
 015E           ; {
 015E           ;     Layer--;//先弹出一层,因为使用的是++,因此当前Layer指向下一个数组位置
 015E 80910000          lds R24,_Layer
 0162 8150              subi R24,1
 0164 80930000          sts _Layer,R24
 0168           ;     KeyFuncIndex=FatherIndex[Layer-1]; //恢复KeyFuncIndex
 0168 80E0              ldi R24,<_FatherIndex-1
 016A 90E0              ldi R25,>_FatherIndex-1
 016C E0910000          lds R30,_Layer
 0170 FF27              clr R31
 0172 E80F              add R30,R24
 0174 F91F              adc R31,R25

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?