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