menutop.lis
来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 1,561 行 · 第 1/5 页
LIS
1,561 行
04C4 E20D add R30,R2
04C6 F31D adc R31,R3
04C8 0081 ldd R16,z+0
04CA 1181 ldd R17,z+1
04CC 79DE xcall _BarDisp
04CE ; if(Menu_j==(ItemNum-1))
04CE 80910000 lds R24,_ItemNum
04D2 8150 subi R24,1
04D4 A816 cp R10,R24
04D6 11F4 brne L56
04D8 ; {
04D8 ; Menu_j=0 ;
04D8 AA24 clr R10
04DA ; }
04DA 01C0 xjmp L57
04DC L56:
04DC ; else
04DC ; {
04DC ; Menu_j++;
04DC A394 inc R10
04DE ; }
04DE L57:
04DE L53:
04DE 6395 inc R22
04E0 L55:
04E0 6330 cpi R22,3
04E2 18F3 brlo L52
04E4 ; }
04E4 ; Where=0 ;
04E4 2224 clr R2
04E6 20920000 sts _Where,R2
04EA ; //当前位置依然在开头的0位置
04EA ; }
04EA 2BC0 xjmp L49
04EC L48:
04EC ; else
04EC ; {
04EC ; //单屏能显示完全部菜单项,"顶部 上移"应当跳转到底部(或者什么都不做)
04EC ; //当仅仅只有一项的时候,应当一直在Where=0的地方反显的!!!这里也能实现,因为最后是反显的函数
04EC ; Where=ItemNum-1 ;
04EC 80910000 lds R24,_ItemNum
04F0 8150 subi R24,1
04F2 80930000 sts _Where,R24
04F6 ; //取消顶部的原有的反显 项ItemBack 位置0
04F6 ; BarDisp(*(DispItem+ItemBack),BarXOffset,0*BarYSize+BarYOffset,0);
04F6 2224 clr R2
04F8 2A82 std y+2,R2
04FA 2882 std y+0,R2
04FC 2227 clr R18
04FE 82E0 ldi R24,2
0500 849F mul R24,R20
0502 F001 movw R30,R0
0504 20900000 lds R2,_DispItem
0508 30900100 lds R3,_DispItem+1
050C E20D add R30,R2
050E F31D adc R31,R3
0510 0081 ldd R16,z+0
0512 1181 ldd R17,z+1
0514 55DE xcall _BarDisp
0516 ; //反显根部 项Item 位置ItemNum-1
0516 ; BarDisp(*(DispItem+Item),BarXOffset,Where*BarYSize+BarYOffset,1);
0516 81E0 ldi R24,1
0518 8A83 std y+2,R24
051A 20900000 lds R2,_Where
051E 80E1 ldi R24,16
0520 829D mul R24,R2
0522 0882 std y+0,R0
0524 2227 clr R18
0526 20900000 lds R2,_Item
052A 82E0 ldi R24,2
052C 829D mul R24,R2
052E F001 movw R30,R0
0530 20900000 lds R2,_DispItem
0534 30900100 lds R3,_DispItem+1
0538 E20D add R30,R2
053A F31D adc R31,R3
053C 0081 ldd R16,z+0
053E 1181 ldd R17,z+1
0540 3FDE xcall _BarDisp
0542 ; //反显
0542 ; }
0542 L49:
0542 ; #ifdef RockBack
0542 ; }
0542 L45:
0542 ; #else
0542 ; }
0542 ; else
0542 ; {
0542 ; Item=ItemBack ;
0542 ; //Restore
0542 ; }
0542 ;
0542 ; #endif
0542 ;
0542 ; Bar(Item,ItemNum,125,120); //jjx //维护滚动条
0542 88E7 ldi R24,120
0544 8A83 std y+2,R24
0546 8DE7 ldi R24,125
0548 8883 std y+0,R24
054A 20910000 lds R18,_ItemNum
054E 00910000 lds R16,_Item
0552 7CD2 xcall _Bar
0554 ; Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
0554 2227 clr R18
0556 80E0 ldi R24,<_FatherIndex-1
0558 90E0 ldi R25,>_FatherIndex-1
055A E0910000 lds R30,_Layer
055E FF27 clr R31
0560 E80F add R30,R24
0562 F91F adc R31,R25
0564 0081 ldd R16,z+0
0566 0E940000 xcall _Jump2Menu
056A L41:
056A 2396 adiw R28,3
056C 0E940000 xcall pop_gset3
0570 .dbline 0 ; func end
0570 0895 ret
0572 ; ItemBack -> R20
0572 ; Menu_i -> R22
0572 ; Menu_j -> R10
.even
0572 _BarMenuRight::
0572 0E940000 xcall push_gset3
0576 2397 sbiw R28,3
0578 ; }
0578 ;
0578 ;
0578 ; //Bar项菜单向右按键的行为
0578 ; //维护Bar显示
0578 ; void BarMenuRight(void)
0578 ; {
0578 ; INT8U Menu_i ;//计数变量 在菜单函数中用到
0578 ; INT8U Menu_j ;//计数变量
0578 ; INT8U ItemBack ;
0578 ;
0578 ; ItemBack=Item ;//---维护Item
0578 40910000 lds R20,_Item
057C ; if(Item==(ItemNum-1))
057C 80910000 lds R24,_ItemNum
0580 8150 subi R24,1
0582 4817 cp R20,R24
0584 21F4 brne L60
0586 ; {
0586 ; Item=0 ;
0586 2224 clr R2
0588 20920000 sts _Item,R2
058C ; }
058C 05C0 xjmp L61
058E L60:
058E ; else
058E ; {
058E ; Item++;
058E 80910000 lds R24,_Item
0592 8F5F subi R24,255 ; addi 1
0594 80930000 sts _Item,R24
0598 ; }
0598 L61:
0598 ;
0598 ; //---维护显示
0598 ; if(Where!=(DispMin-1))
0598 80910000 lds R24,_DispMin
059C 8150 subi R24,1
059E 20900000 lds R2,_Where
05A2 2816 cp R2,R24
05A4 09F4 brne X3
05A6 55C0 xjmp L62
05A8 X3:
05A8 ; {
05A8 ; //当前位置不为最末,两次反显
05A8 ; if (LessCPUUseage==TRUE)
05A8 80910000 lds R24,_LessCPUUseage
05AC 8130 cpi R24,1
05AE F1F4 brne L64
05B0 ; {
05B0 ; GUI_SetEnFont(En_6x12);
05B0 0027 clr R16
05B2 0E940000 xcall _GUI_SetEnFont
05B6 ; GUI_DispCharAt(' ',BarXOffset,(Where++)*BarYSize+BarYOffset);
05B6 20900000 lds R2,_Where
05BA 3324 clr R3
05BC 822D mov R24,R2
05BE 8F5F subi R24,255 ; addi 1
05C0 80930000 sts _Where,R24
05C4 00E1 ldi R16,16
05C6 10E0 ldi R17,0
05C8 9101 movw R18,R2
05CA 0E940000 xcall empy16s
05CE 0883 std y+0,R16
05D0 2227 clr R18
05D2 00E2 ldi R16,32
05D4 0E940000 xcall _GUI_DispCharAt
05D8 ; GUI_DispCharAt('>',BarXOffset,Where*BarYSize+BarYOffset);
05D8 20900000 lds R2,_Where
05DC 80E1 ldi R24,16
05DE 829D mul R24,R2
05E0 0882 std y+0,R0
05E2 2227 clr R18
05E4 0EE3 ldi R16,62
05E6 0E940000 xcall _GUI_DispCharAt
05EA ; }
05EA ACC0 xjmp L63
05EC L64:
05EC ; else
05EC ; {
05EC ; //原来位置取消反显 项是ItemBack 位置Where
05EC ; BarDisp(*(DispItem+ItemBack),BarXOffset,(Where++)*BarYSize+BarYOffset,0);
05EC 2224 clr R2
05EE 2A82 std y+2,R2
05F0 20900000 lds R2,_Where
05F4 3324 clr R3
05F6 822D mov R24,R2
05F8 8F5F subi R24,255 ; addi 1
05FA 80930000 sts _Where,R24
05FE 00E1 ldi R16,16
0600 10E0 ldi R17,0
0602 9101 movw R18,R2
0604 0E940000 xcall empy16s
0608 0883 std y+0,R16
060A 2227 clr R18
060C 82E0 ldi R24,2
060E 849F mul R24,R20
0610 F001 movw R30,R0
0612 20900000 lds R2,_DispItem
0616 30900100 lds R3,_DispItem+1
061A E20D add R30,R2
061C F31D adc R31,R3
061E 0081 ldd R16,z+0
0620 1181 ldd R17,z+1
0622 CEDD xcall _BarDisp
0624 ; //下移后的位置反显 项是Item 位置Where+1(Where++实现)
0624 ; BarDisp(*(DispItem+Item),BarXOffset,Where*BarYSize+BarYOffset,1);
0624 81E0 ldi R24,1
0626 8A83 std y+2,R24
0628 20900000 lds R2,_Where
062C 80E1 ldi R24,16
062E 829D mul R24,R2
0630 0882 std y+0,R0
0632 2227 clr R18
0634 20900000 lds R2,_Item
0638 82E0 ldi R24,2
063A 829D mul R24,R2
063C F001 movw R30,R0
063E 20900000 lds R2,_DispItem
0642 30900100 lds R3,_DispItem+1
0646 E20D add R30,R2
0648 F31D adc R31,R3
064A 0081 ldd R16,z+0
064C 1181 ldd R17,z+1
064E B8DD xcall _BarDisp
0650 ; //反显
0650 ; }
0650 ;
0650 ; #ifdef RockBack
0650 ; }
0650 79C0 xjmp L63
0652 L62:
0652 ; else
0652 ; {
0652 ; //当前位置为DispMax 底部 下移
0652 ; #ifdef DynamicBar
0652 ; if((ItemNum>DispMax)||(BarDataMode==DynamicData))
0652 ; {
0652 ; //需要显示的Bar多于单屏可以显示的Bar,那么重新显示//08/29
0652 ; #else
0652 ; if(ItemNum>DispMax)
0652 83E0 ldi R24,3
0654 20900000 lds R2,_ItemNum
0658 8215 cp R24,R2
065A 08F0 brlo X4
065C 45C0 xjmp L66
065E X4:
065E ; {
065E ; //需要显示的Bar多于单屏可以显示的Bar,那么重新显示
065E ; #endif
065E ; #else
065E ; }
065E ; else if(ItemBack!=(ItemNum-1))
065E ; {
065E ; //当前位置为DispMax 如果原来显示位置不是最后一项,则 底部 下移
065E ; if(ItemNum>DispMax)
065E ; {
065E ; //需要显示的Bar多于单屏可以显示的Bar,那么重新显示
065E ; #endif
065E ; Menu_j=Item ;
065E A0900000 lds R10,_Item
0662 ; Menu_i=DispMax ;
0662 63E0 ldi R22,3
0664 ; //项是 Item 位置是 DispMax
0664 ; BarDisp(*(DispItem+Menu_j),BarXOffset,(Menu_i-1)*BarYSize+BarYOffset,1);
0664 81E0 ldi R24,1
0666 8A83 std y+2,R24
0668 80E1 ldi R24,16
066A 869F mul R24,R22
066C 802D mov R24,R0
066E 8051 subi R24,16
0670 8883 std y+0,R24
0672 2227 clr R18
0674 82E0 ldi R24,2
0676 8A9D mul R24,R10
0678 F001 movw R30,R0
067A 20900000 lds R2,_DispItem
067E 30900100 lds R3,_DispItem+1
0682 E20D add R30,R2
0684 F31D adc R31,R3
0686 0081 ldd R16,z+0
0688 1181 ldd R17,z+1
068A 9ADD xcall _BarDisp
068C ; if(Menu_j==0)
068C AA20 tst R10
068E 29F4 brne L68
0690 ; {
0690 ; Menu_j=ItemNum-1 ;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?