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