menufsm.lis

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

LIS
666
字号
 0004           ; */
 0004           ; const KbdTabStruct KeyTab[]=
 0004           ; {
 0004           ;     //       |-----------> Index
 0004           ;     //       |  Up
 0004           ;     //       |  |  Down
 0004           ;     //       |  |  |  Left
 0004           ;     //       |  |  |  |  Right   --->功能函数
 0004           ;     //       |  |  |  |  |       |
 0004           ;        { 0, 1, 2, 3, 4,(*DispMenuTop)},     // 待机画面
 0004           ;        { 1, 0, 0, 0, 0,(*DispMenuTopUp)},
 0004           ;        { 2, 0, 0, 0, 0,(*DispMenuTopDown)},
 0004           ;        { 3, 0, 0, 0, 0,(*DispMenuTopLeft)},
 0004           ;        { 4, 0, 0, 0, 0,(*DispMenuTopRight)},
 0004           ; 
 0004           ;        { 5, 6, 7, 8, 9,(*DispIcoMenuInit)}, //图标层菜单
 0004           ;        { 6, 0, 0, 0, 0,(*DispIcoMenuUp)},   //
 0004           ;        { 7, 0, 0, 0, 0,(*DispIcoMenuDown)}, //
 0004           ;        { 8, 0, 0, 0, 0,(*DispIcoMenuLeft)}, //
 0004           ;        { 9, 0, 0, 0, 0,(*DispIcoMenuRight)},//
 0004           ; 
 0004           ;        {10,11,12,13,14,(*DispMenuFuncInit)}, //"功能"
 0004           ;        {11, 0, 0, 0, 0,(*DispMenuFuncUp)},   //
 0004           ;        {12, 0, 0, 0, 0,(*DispMenuFuncDown)}, //
 0004           ;        {13, 0, 0, 0, 0,(*DispMenuFuncLeft)}, //
 0004           ;        {14, 0, 0, 0, 0,(*DispMenuFuncRight)},//
 0004           ; 
 0004           ;        {15,16,17,18,19,(*DispMenuParaInit)}, //"参数"
 0004           ;        {16, 0, 0, 0, 0,(*DispMenuParaUp)},   //
 0004           ;        {17, 0, 0, 0, 0,(*DispMenuParaDown)}, //
 0004           ;        {18, 0, 0, 0, 0,(*DispMenuParaLeft)}, //
 0004           ;        {19, 0, 0, 0, 0,(*DispMenuParaRight)},//
 0004           ; 
 0004           ;        {20,21,22,23,24,(*DispMenuLanguageInit)}, //"语言"
 0004           ;        {21, 0, 0, 0, 0,(*DispMenuLanguageUp)},   //
 0004           ;        {22, 0, 0, 0, 0,(*DispMenuLanguageDown)}, //
 0004           ;        {23, 0, 0, 0, 0,(*DispMenuLanguageLeft)}, //
 0004           ;        {24, 0, 0, 0, 0,(*DispMenuLanguageRight)},//
 0004           ; 
 0004           ;        {25,26,27,28,29,(*DispMenuMeasureInit)}, //"测量"
 0004           ;        {26, 0, 0, 0, 0,(*DispMenuMeasureUp)},   //
 0004           ;        {27, 0, 0, 0, 0,(*DispMenuMeasureDown)}, //
 0004           ;        {28, 0, 0, 0, 0,(*DispMenuMeasureLeft)}, //
 0004           ;        {29, 0, 0, 0, 0,(*DispMenuMeasureRight)},//
 0004           ;          
 0004           ;          {30,31,32,33,34,(*DispMenuSetupInit)}, //"设置"
 0004           ;        {31, 0, 0, 0, 0,(*DispMenuSetupUp)},   //
 0004           ;        {32, 0, 0, 0, 0,(*DispMenuSetupDown)}, //
 0004           ;        {33, 0, 0, 0, 0,(*DispMenuSetupLeft)}, //
 0004           ;        {34, 0, 0, 0, 0,(*DispMenuSetupRight)},//
 0004           ;          
 0004           ; #ifdef DynamicBar
 0004           ;        {35,36,37,38,39,(*DispMenuDataInit)}, //"Data"
 0004           ;        {36, 0, 0, 0, 0,(*DispMenuDataUp)},   //
 0004           ;        {37, 0, 0, 0, 0,(*DispMenuDataDown)}, //
 0004           ;        {38, 0, 0, 0, 0,(*DispMenuDataLeft)}, //
 0004           ;        {39, 0, 0, 0, 0,(*DispMenuDataRight)},//
 0004           ; #endif
 0004           ; }
 0004           ; ;
 0004           ; 
 0004           ; /****************************************************************************
 0004           ; * CheckKey - 菜单键盘扫描函数
 0004           ; * 有有效按键则执行对应的功能函数
 0004           ; * 同时,若刷新标志有效,也执行相应的功能函数
 0004           ;   返回0表示有效按键输入,否则当作无效按键
 0004           ; ****************************************************************************/
 0004           ; 
 0004           ; extern INT8U Keyvalue;
 0004           ; extern INT8U Key_Deal_Flag;
 0004           ; 
 0004           ; INT8U CheckKey(void)
 0004           ; {
 0004           ;     INT8U IsKey ;
 0004           ;       
 0004           ;     IsKey=1 ;
 0004 41E0              ldi R20,1
 0006           ;       if(Key_Deal_Flag==1)
 0006 80910000          lds R24,_Key_Deal_Flag
 000A 8130              cpi R24,1
 000C 09F0              breq X1
 000E 94C0              xjmp L3
 0010           X1:
 0010           ; 	{
 0010           ; 		IsKey=0 ;
 0010 4427              clr R20
 0012           ;         switch(Keyvalue)
 0012 60910000          lds R22,_Keyvalue
 0016 7727              clr R23
 0018 6131              cpi R22,17
 001A E0E0              ldi R30,0
 001C 7E07              cpc R23,R30
 001E 09F4              brne X2
 0020 2DC0              xjmp L11
 0022           X2:
 0022 6231              cpi R22,18
 0024 E0E0              ldi R30,0
 0026 7E07              cpc R23,R30
 0028 59F0              breq L8
 002A 6331              cpi R22,19
 002C E0E0              ldi R30,0
 002E 7E07              cpc R23,R30
 0030 09F4              brne X3
 0032 42C0              xjmp L14
 0034           X3:
 0034 6431              cpi R22,20
 0036 E0E0              ldi R30,0
 0038 7E07              cpc R23,R30
 003A 09F4              brne X4
 003C 5BC0              xjmp L17
 003E           X4:
 003E 78C0              xjmp L5
 0040           X0:
 0040           ;         {
 0040           L8:
 0040           ;             case Key_Up :
 0040           ;             {
 0040           ;            	 //向上键,找出新的菜单状态编号
 0040           ;                 KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState ;
 0040 20900000          lds R2,_KeyFuncIndex
 0044 87E0              ldi R24,7
 0046 829D              mul R24,R2
 0048 F001              movw R30,R0
 004A 80E0              ldi R24,<_KeyTab+1
 004C 90E0              ldi R25,>_KeyTab+1
 004E E80F              add R30,R24
 0050 F91F              adc R31,R25
 0052 E491              lpm R30,Z
 0054 E0930000          sts _KeyFuncIndex,R30
 0058           ;                 KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate ;
 0058 2E2E              mov R2,R30
 005A 87E0              ldi R24,7
 005C 829D              mul R24,R2
 005E F001              movw R30,R0
 0060 80E0              ldi R24,<_KeyTab+5
 0062 90E0              ldi R25,>_KeyTab+5
 0064 E80F              add R30,R24
 0066 F91F              adc R31,R25
 0068 0590              lpm R0,Z+
 006A 1490              lpm R1,Z
 006C F001              movw R30,R0
 006E F0930100          sts _KeyFuncPtr+1,R31
 0072 E0930000          sts _KeyFuncPtr,R30
 0076           ;                 (*KeyFuncPtr)();//执行当前按键的操作
 0076 0E940000          xcall xicall
 007A           ;                               break ;
 007A 5BC0              xjmp L6
 007C           L11:
 007C           ;             }
 007C           ;             case Key_Down :
 007C           ;             {
 007C           ;              //向下键,找出新的菜单状态编号
 007C           ;                 KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDnState ;
 007C 20900000          lds R2,_KeyFuncIndex
 0080 87E0              ldi R24,7
 0082 829D              mul R24,R2
 0084 F001              movw R30,R0
 0086 80E0              ldi R24,<_KeyTab+2
 0088 90E0              ldi R25,>_KeyTab+2
 008A E80F              add R30,R24
 008C F91F              adc R31,R25
 008E E491              lpm R30,Z
 0090 E0930000          sts _KeyFuncIndex,R30
 0094           ;                 KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate ;
 0094 2E2E              mov R2,R30
 0096 87E0              ldi R24,7
 0098 829D              mul R24,R2
 009A F001              movw R30,R0
 009C 80E0              ldi R24,<_KeyTab+5
 009E 90E0              ldi R25,>_KeyTab+5
 00A0 E80F              add R30,R24
 00A2 F91F              adc R31,R25
 00A4 0590              lpm R0,Z+
 00A6 1490              lpm R1,Z
 00A8 F001              movw R30,R0
 00AA F0930100          sts _KeyFuncPtr+1,R31
 00AE E0930000          sts _KeyFuncPtr,R30
 00B2           ;                 (*KeyFuncPtr)();//执行当前按键的操作
 00B2 0E940000          xcall xicall
 00B6           ;                 break ;
 00B6 3DC0              xjmp L6
 00B8           L14:
 00B8           ;             }
 00B8           ;             case Key_Left :
 00B8           ;             {
 00B8           ;              //向左键,找出新的菜单状态编号
 00B8           ;                 KeyFuncIndex=KeyTab[KeyFuncIndex].KeyLState ;
 00B8 20900000          lds R2,_KeyFuncIndex
 00BC 87E0              ldi R24,7
 00BE 829D              mul R24,R2
 00C0 F001              movw R30,R0
 00C2 80E0              ldi R24,<_KeyTab+3
 00C4 90E0              ldi R25,>_KeyTab+3
 00C6 E80F              add R30,R24
 00C8 F91F              adc R31,R25
 00CA E491              lpm R30,Z
 00CC E0930000          sts _KeyFuncIndex,R30
 00D0           ;                 KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate ;
 00D0 2E2E              mov R2,R30
 00D2 87E0              ldi R24,7
 00D4 829D              mul R24,R2
 00D6 F001              movw R30,R0
 00D8 80E0              ldi R24,<_KeyTab+5
 00DA 90E0              ldi R25,>_KeyTab+5
 00DC E80F              add R30,R24
 00DE F91F              adc R31,R25
 00E0 0590              lpm R0,Z+
 00E2 1490              lpm R1,Z
 00E4 F001              movw R30,R0
 00E6 F0930100          sts _KeyFuncPtr+1,R31
 00EA E0930000          sts _KeyFuncPtr,R30
 00EE           ;                 (*KeyFuncPtr)();//执行当前按键的操作
 00EE 0E940000          xcall xicall
 00F2           ;                 break ;
 00F2 1FC0              xjmp L6
 00F4           L17:
 00F4           ;             }
 00F4           ;             case Key_Right :
 00F4           ;             {
 00F4           ;              //向右键,找出新的菜单状态编号
 00F4           ;                 KeyFuncIndex=KeyTab[KeyFuncIndex].KeyRState ;
 00F4 20900000          lds R2,_KeyFuncIndex
 00F8 87E0              ldi R24,7
 00FA 829D              mul R24,R2
 00FC F001              movw R30,R0
 00FE 80E0              ldi R24,<_KeyTab+4
 0100 90E0              ldi R25,>_KeyTab+4
 0102 E80F              add R30,R24
 0104 F91F              adc R31,R25
 0106 E491              lpm R30,Z
 0108 E0930000          sts _KeyFuncIndex,R30
 010C           ;                 KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate ;
 010C 2E2E              mov R2,R30
 010E 87E0              ldi R24,7
 0110 829D              mul R24,R2
 0112 F001              movw R30,R0
 0114 80E0              ldi R24,<_KeyTab+5
 0116 90E0              ldi R25,>_KeyTab+5
 0118 E80F              add R30,R24
 011A F91F              adc R31,R25
 011C 0590              lpm R0,Z+
 011E 1490              lpm R1,Z
 0120 F001              movw R30,R0
 0122 F0930100          sts _KeyFuncPtr+1,R31
 0126 E0930000          sts _KeyFuncPtr,R30
 012A           ;                 (*KeyFuncPtr)();//执行当前按键的操作
 012A 0E940000          xcall xicall
 012E           ;                 break ;
 012E 01C0              xjmp L6
 0130           L5:
 0130           ;             }
 0130           ;             default :IsKey=1 ;break ;//按键错误的处理
 0130 41E0              ldi R20,1
 0132           L6:
 0132           ;         }
 0132           ; 		Key_Deal_Flag=0;
 0132 2224              clr R2
 0134 20920000          sts _Key_Deal_Flag,R2
 0138           ;     }
 0138           L3:
 0138           ;     if(Flash)
 0138 20900000          lds R2,_Flash
 013C 2220              tst R2
 013E A9F0              breq L20
 0140           ;     {
 0140           ;         //两个当中有任意一个不为零,那么执行一次,我们应该不会出现Flash和ReFlash都是1的情况
 0140           ;         KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate ;
 0140 20900000          lds R2,_KeyFuncIndex
 0144 87E0              ldi R24,7
 0146 829D              mul R24,R2
 0148 F001              movw R30,R0
 014A 80E0              ldi R24,<_KeyTab+5
 014C 90E0              ldi R25,>_KeyTab+5
 014E E80F              add R30,R24
 0150 F91F              adc R31,R25
 0152 0590              lpm R0,Z+
 0154 1490              lpm R1,Z
 0156 F001              movw R30,R0
 0158 F0930100          sts _KeyFuncPtr+1,R31
 015C E0930000          sts _KeyFuncPtr,R30
 0160           ;         (*KeyFuncPtr)();//执行当前按键的操作
 0160 0E940000          xcall xicall
 0164           ;         Flash=0 ;       // ReFlash = 0;
 0164 2224              clr R2
 0166 20920000          sts _Flash,R2
 016A           ;     }
 016A           L20:
 016A           ;     return IsKey ;
 016A 042F              mov R16,R20
 016C           L2:
 016C 0E940000          xcall pop_gset2
 0170                   .dbline 0 ; func end
 0170 0895              ret
                        .area bss(ram, con, rel)
 0000           _KeyFuncPtr::
 0000                   .blkb 2
                        .area func_lit
 0000 0000      PL_DispMenuSetupRight:  .word `_DispMenuSetupRight
 0002 0000      PL_DispMenuSetupLeft:   .word `_DispMenuSetupLeft
 0004 0000      PL_DispMenuSetupDown:   .word `_DispMenuSetupDown
 0006 0000      PL_DispMenuSetupUp:     .word `_DispMenuSetupUp
 0008 0000      PL_DispMenuSetupInit:   .word `_DispMenuSetupInit
 000A 0000      PL_DispMenuMeasureRight:        .word `_DispMenuMeasureRight
 000C 0000      PL_DispMenuMeasureLeft: .word `_DispMenuMeasureLeft
 000E 0000      PL_DispMenuMeasureDown: .word `_DispMenuMeasureDown
 0010 0000      PL_DispMenuMeasureUp:   .word `_DispMenuMeasureUp
 0012 0000      PL_DispMenuMeasureInit: .word `_DispMenuMeasureInit
 0014 0000      PL_DispMenuLanguageRight:       .word `_DispMenuLanguageRight
 0016 0000      PL_DispMenuLanguageLeft:        .word `_DispMenuLanguageLeft
 0018 0000      PL_DispMenuLanguageDown:        .word `_DispMenuLanguageDown
 001A 0000      PL_DispMenuLanguageUp:  .word `_DispMenuLanguageUp
 001C 0000      PL_DispMenuLanguageInit:        .word `_DispMenuLanguageInit
 001E 0000      PL_DispMenuParaRight:   .word `_DispMenuParaRight
 0020 0000      PL_DispMenuParaLeft:    .word `_DispMenuParaLeft
 0022 0000      PL_DispMenuParaDown:    .word `_DispMenuParaDown
 0024 0000      PL_DispMenuParaUp:      .word `_DispMenuParaUp
 0026 0000      PL_DispMenuParaInit:    .word `_DispMenuParaInit
 0028 0000      PL_DispMenuFuncRight:   .word `_DispMenuFuncRight
 002A 0000      PL_DispMenuFuncLeft:    .word `_DispMenuFuncLeft
 002C 0000      PL_DispMenuFuncDown:    .word `_DispMenuFuncDown
 002E 0000      PL_DispMenuFuncUp:      .word `_DispMenuFuncUp
 0030 0000      PL_DispMenuFuncInit:    .word `_DispMenuFuncInit
 0032 0000      PL_DispIcoMenuRight:    .word `_DispIcoMenuRight
 0034 0000      PL_DispIcoMenuLeft:     .word `_DispIcoMenuLeft
 0036 0000      PL_DispIcoMenuDown:     .word `_DispIcoMenuDown
 0038 0000      PL_DispIcoMenuUp:       .word `_DispIcoMenuUp
 003A 0000      PL_DispIcoMenuInit:     .word `_DispIcoMenuInit
 003C 0000      PL_DispMenuTopRight:    .word `_DispMenuTopRight
 003E 0000      PL_DispMenuTopLeft:     .word `_DispMenuTopLeft
 0040 0000      PL_DispMenuTopDown:     .word `_DispMenuTopDown
 0042 0000      PL_DispMenuTopUp:       .word `_DispMenuTopUp
 0044 0000      PL_DispMenuTop: .word `_DispMenuTop

⌨️ 快捷键说明

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