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