menutop.lis

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

LIS
1,561
字号
 0302 8A83              std y+2,R24
 0304 20900000          lds R2,_Where
 0308 80E1              ldi R24,16
 030A 829D              mul R24,R2
 030C 0882              std y+0,R0
 030E 2227              clr R18
 0310 20900000          lds R2,_Item
 0314 82E0              ldi R24,2
 0316 829D              mul R24,R2
 0318 F001              movw R30,R0
 031A 20900000          lds R2,_DispItem
 031E 30900100          lds R3,_DispItem+1
 0322 E20D              add R30,R2
 0324 F31D              adc R31,R3
 0326 0081              ldd R16,z+0
 0328 1181              ldd R17,z+1
 032A 4ADF              xcall _BarDisp
 032C           ;         }
 032C 12C0              xjmp L38
 032E           L37:
 032E           ;         else 
 032E           ;         {
 032E           ;             //其它项 正常显示
 032E           ;             BarDisp(*(DispItem+Menu_j),BarXOffset,Menu_i*BarYSize+BarYOffset,0);
 032E 2224              clr R2
 0330 2A82              std y+2,R2
 0332 80E1              ldi R24,16
 0334 849F              mul R24,R20
 0336 0882              std y+0,R0
 0338 2227              clr R18
 033A 82E0              ldi R24,2
 033C 869F              mul R24,R22
 033E F001              movw R30,R0
 0340 20900000          lds R2,_DispItem
 0344 30900100          lds R3,_DispItem+1
 0348 E20D              add R30,R2
 034A F31D              adc R31,R3
 034C 0081              ldd R16,z+0
 034E 1181              ldd R17,z+1
 0350 37DF              xcall _BarDisp
 0352           ;         }
 0352           L38:
 0352           ;         if(Menu_j==(ItemNum-1))
 0352 80910000          lds R24,_ItemNum
 0356 8150              subi R24,1
 0358 6817              cp R22,R24
 035A 11F4              brne L39
 035C           ;         {
 035C           ;             //到了最后一项,回环到最开始的一项
 035C           ;             Menu_j=0 ;
 035C 6627              clr R22
 035E           ;         }
 035E 01C0              xjmp L40
 0360           L39:
 0360           ;         else 
 0360           ;         {
 0360           ;             //下一项
 0360           ;             Menu_j++;
 0360 6395              inc R22
 0362           ;         }
 0362           L40:
 0362           L34:
 0362 4395              inc R20
 0364           L36:
 0364 20900000          lds R2,_DispMin
 0368 4215              cp R20,R2
 036A 08F4              brsh X0
 036C C5CF              xjmp L33
 036E           X0:
 036E           ;     }
 036E           ;     Bar(Item,ItemNum,MenuBarPosX,MenuBarNumPosX);       // jjx          //维护滚动条
 036E 88E5              ldi R24,88
 0370 8A83              std y+2,R24
 0372 8EE5              ldi R24,94
 0374 8883              std y+0,R24
 0376 20910000          lds R18,_ItemNum
 037A 00910000          lds R16,_Item
 037E 66D3              xcall _Bar
 0380           L20:
 0380 2396              adiw R28,3
 0382 0E940000          xcall pop_gset2
 0386                   .dbline 0 ; func end
 0386 0895              ret
 0388           ;       ItemBack -> R20
 0388           ;         Menu_i -> R22
 0388           ;         Menu_j -> R10
                        .even
 0388           _BarMenuLeft::
 0388 0E940000          xcall push_gset3
 038C 2397              sbiw R28,3
 038E           ; }
 038E           ; 
 038E           ; 
 038E           ; //Bar项菜单向左按键的行为
 038E           ; /*
 038E           ; 可能的几种情况:
 038E           ; A.原有Bar的顶部,按键是向上,那么就需要刷新全部的显示
 038E           ; A1.若是需要显示的Bar多于单屏可以显示的Bar,那么重新显示全部
 038E           ; A2.若是需要显示的Bar不多于单屏可以显示的Bar,取消顶部高亮显示,高亮显示最后一项Bar
 038E           ; B.原有Bar不是在顶部,按键向上,那么取消原有Bar的高亮,高亮显示上一个Bar项
 038E           ; 当然还需要维护:高亮显示的位置where/高亮显示Bar项的Item
 038E           ; */
 038E           ; 
 038E           ; //维护Bar显示
 038E           ; void BarMenuLeft(void)
 038E           ; {
 038E           ;     INT8U Menu_i ; //计数变量 在菜单函数中用到
 038E           ;     INT8U Menu_j ;//计数变量
 038E           ;     INT8U ItemBack ;
 038E           ;       
 038E           ;     ItemBack=Item ;//备份原有的Item,取消原有反显时需要使用
 038E 40910000          lds R20,_Item
 0392           ;     
 0392           ;     if(Item==0)    //维护Item,得到需要反显的Item
 0392 4423              tst R20
 0394 31F4              brne L42
 0396           ;     {
 0396           ;         Item=ItemNum-1 ;
 0396 80910000          lds R24,_ItemNum
 039A 8150              subi R24,1
 039C 80930000          sts _Item,R24
 03A0           ;     }
 03A0 05C0              xjmp L43
 03A2           L42:
 03A2           ;     else 
 03A2           ;     {
 03A2           ;         Item--;
 03A2 80910000          lds R24,_Item
 03A6 8150              subi R24,1
 03A8 80930000          sts _Item,R24
 03AC           ;     }
 03AC           L43:
 03AC           ;     //维护显示
 03AC           ;     if(Where)
 03AC 20900000          lds R2,_Where
 03B0 2220              tst R2
 03B2 09F4              brne X1
 03B4 55C0              xjmp L44
 03B6           X1:
 03B6           ;     {
 03B6           ;         //当前位置不为0,就是说不是在顶部,两次反显
 03B6           ;         if (LessCPUUseage==TRUE)
 03B6 80910000          lds R24,_LessCPUUseage
 03BA 8130              cpi R24,1
 03BC F1F4              brne L46
 03BE           ;               { 
 03BE           ;             GUI_SetEnFont(En_6x12);
 03BE 0027              clr R16
 03C0 0E940000          xcall _GUI_SetEnFont
 03C4           ;             GUI_DispCharAt(' ',BarXOffset,(Where--)*BarYSize+BarYOffset);
 03C4 20900000          lds R2,_Where
 03C8 3324              clr R3
 03CA 822D              mov R24,R2
 03CC 8150              subi R24,1
 03CE 80930000          sts _Where,R24
 03D2 00E1              ldi R16,16
 03D4 10E0              ldi R17,0
 03D6 9101              movw R18,R2
 03D8 0E940000          xcall empy16s
 03DC 0883              std y+0,R16
 03DE 2227              clr R18
 03E0 00E2              ldi R16,32
 03E2 0E940000          xcall _GUI_DispCharAt
 03E6           ;             GUI_DispCharAt('>',BarXOffset,Where*BarYSize+BarYOffset);
 03E6 20900000          lds R2,_Where
 03EA 80E1              ldi R24,16
 03EC 829D              mul R24,R2
 03EE 0882              std y+0,R0
 03F0 2227              clr R18
 03F2 0EE3              ldi R16,62
 03F4 0E940000          xcall _GUI_DispCharAt
 03F8           ;         }
 03F8 A4C0              xjmp L45
 03FA           L46:
 03FA           ; 		else 
 03FA           ; 		{
 03FA           ;                         //原来位置取消反显   项是ItemBack  位置Where
 03FA           ;             BarDisp(*(DispItem+ItemBack),BarXOffset,(Where--)*BarYSize+BarYOffset,0);
 03FA 2224              clr R2
 03FC 2A82              std y+2,R2
 03FE 20900000          lds R2,_Where
 0402 3324              clr R3
 0404 822D              mov R24,R2
 0406 8150              subi R24,1
 0408 80930000          sts _Where,R24
 040C 00E1              ldi R16,16
 040E 10E0              ldi R17,0
 0410 9101              movw R18,R2
 0412 0E940000          xcall empy16s
 0416 0883              std y+0,R16
 0418 2227              clr R18
 041A 82E0              ldi R24,2
 041C 849F              mul R24,R20
 041E F001              movw R30,R0
 0420 20900000          lds R2,_DispItem
 0424 30900100          lds R3,_DispItem+1
 0428 E20D              add R30,R2
 042A F31D              adc R31,R3
 042C 0081              ldd R16,z+0
 042E 1181              ldd R17,z+1
 0430 C7DE              xcall _BarDisp
 0432           ;                         //上移后的位置反显   项是Item      位置Where-1 (Where--实现)
 0432           ;             BarDisp(*(DispItem+Item),BarXOffset,Where*BarYSize+BarYOffset,1);
 0432 81E0              ldi R24,1
 0434 8A83              std y+2,R24
 0436 20900000          lds R2,_Where
 043A 80E1              ldi R24,16
 043C 829D              mul R24,R2
 043E 0882              std y+0,R0
 0440 2227              clr R18
 0442 20900000          lds R2,_Item
 0446 82E0              ldi R24,2
 0448 829D              mul R24,R2
 044A F001              movw R30,R0
 044C 20900000          lds R2,_DispItem
 0450 30900100          lds R3,_DispItem+1
 0454 E20D              add R30,R2
 0456 F31D              adc R31,R3
 0458 0081              ldd R16,z+0
 045A 1181              ldd R17,z+1
 045C B1DE              xcall _BarDisp
 045E           ;                         //高亮显示
 045E           ;               }
 045E           ;         
 045E           ;         #ifdef RockBack 
 045E           ;     }
 045E 71C0              xjmp L45
 0460           L44:
 0460           ;     else 
 0460           ;     {
 0460           ;         //当前位置为0,     顶部  上移  需要刷新全部子菜单项显示   //1.回滚方式,到了顶部后回滚到底部
 0460           ;         #ifdef DynamicBar 
 0460           ;         if((ItemNum>DispMax)||(BarDataMode==DynamicData))
 0460           ;         {
 0460           ;             //需要显示的Bar多于单屏可以显示的Bar,那么重新显示//08/29
 0460           ;             #else 
 0460           ;             if(ItemNum>DispMax)
 0460 83E0              ldi R24,3
 0462 20900000          lds R2,_ItemNum
 0466 8215              cp R24,R2
 0468 08F0              brlo X2
 046A 40C0              xjmp L48
 046C           X2:
 046C           ;             {
 046C           ;                 //需要显示的Bar多于单屏可以显示的Bar,那么重新显示
 046C           ;                 #endif 
 046C           ;                 #else 
 046C           ;             }
 046C           ;             else if(ItemBack!=0)
 046C           ;             {
 046C           ;                 if(ItemNum>DispMax)
 046C           ;                 {
 046C           ;                     //需要显示的Bar多于单屏可以显示的Bar,那么重新显示全部
 046C           ;                     #endif 
 046C           ;                     
 046C           ;                     Menu_j=Item ;
 046C A0900000          lds R10,_Item
 0470           ;                     Menu_i=0 ;
 0470 6627              clr R22
 0472           ;                     //项是 Item 位置 0
 0472           ;                     BarDisp(*(DispItem+Menu_j),BarXOffset,Menu_i*BarYSize+BarYOffset,1);
 0472 81E0              ldi R24,1
 0474 8A83              std y+2,R24
 0476 80E1              ldi R24,16
 0478 869F              mul R24,R22
 047A 0882              std y+0,R0
 047C 2227              clr R18
 047E 82E0              ldi R24,2
 0480 8A9D              mul R24,R10
 0482 F001              movw R30,R0
 0484 20900000          lds R2,_DispItem
 0488 30900100          lds R3,_DispItem+1
 048C E20D              add R30,R2
 048E F31D              adc R31,R3
 0490 0081              ldd R16,z+0
 0492 1181              ldd R17,z+1
 0494 95DE              xcall _BarDisp
 0496           ;                     if(Menu_j==(ItemNum-1))
 0496 80910000          lds R24,_ItemNum
 049A 8150              subi R24,1
 049C A816              cp R10,R24
 049E 11F4              brne L50
 04A0           ;                     {
 04A0           ;                         //维护Menu_j
 04A0           ;                         Menu_j=0 ;
 04A0 AA24              clr R10
 04A2           ;                     }
 04A2 01C0              xjmp L51
 04A4           L50:
 04A4           ;                     else 
 04A4           ;                     {
 04A4           ;                         Menu_j++;
 04A4 A394              inc R10
 04A6           ;                     }
 04A6           L51:
 04A6           ;                     //显示其他项
 04A6           ;                     for(Menu_i=1;Menu_i<DispMax;Menu_i++)
 04A6 61E0              ldi R22,1
 04A8 1BC0              xjmp L55
 04AA           L52:
 04AA           ;                     {
 04AA           ;                         BarDisp(*(DispItem+Menu_j),BarXOffset,Menu_i*BarYSize+BarYOffset,0);
 04AA 2224              clr R2
 04AC 2A82              std y+2,R2
 04AE 80E1              ldi R24,16
 04B0 869F              mul R24,R22
 04B2 0882              std y+0,R0
 04B4 2227              clr R18
 04B6 82E0              ldi R24,2
 04B8 8A9D              mul R24,R10
 04BA F001              movw R30,R0
 04BC 20900000          lds R2,_DispItem
 04C0 30900100          lds R3,_DispItem+1

⌨️ 快捷键说明

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