menutop.lis

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

LIS
1,561
字号
 0176 2080              ldd R2,z+0
 0178 20920000          sts _KeyFuncIndex,R2
 017C           ;     Where=WhereBackup[--WhereBackup_i];//恢复高亮显示位置Where
 017C 80910000          lds R24,_WhereBackup_i
 0180 8150              subi R24,1
 0182 282E              mov R2,R24
 0184 20920000          sts _WhereBackup_i,R2
 0188 80E0              ldi R24,<_WhereBackup
 018A 90E0              ldi R25,>_WhereBackup
 018C E22D              mov R30,R2
 018E FF27              clr R31
 0190 E80F              add R30,R24
 0192 F91F              adc R31,R25
 0194 2080              ldd R2,z+0
 0196 20920000          sts _Where,R2
 019A           ;     Item=ItemBackup[--ItemBackup_i];   //恢复项位置Item
 019A 80910000          lds R24,_ItemBackup_i
 019E 8150              subi R24,1
 01A0 282E              mov R2,R24
 01A2 20920000          sts _ItemBackup_i,R2
 01A6 80E0              ldi R24,<_ItemBackup
 01A8 90E0              ldi R25,>_ItemBackup
 01AA E22D              mov R30,R2
 01AC FF27              clr R31
 01AE E80F              add R30,R24
 01B0 F91F              adc R31,R25
 01B2 2080              ldd R2,z+0
 01B4 20920000          sts _Item,R2
 01B8           ;     Flash=FlashMode_ReFlash ;          //子项返回,请求刷新
 01B8 83E0              ldi R24,3
 01BA 80930000          sts _Flash,R24
 01BE           L11:
 01BE                   .dbline 0 ; func end
 01BE 0895              ret
 01C0           ;      HighLight -> y+13
 01C0           ;              Y -> R10
 01C0           ;              X -> R22
 01C0           ;              s -> R20,R21
                        .even
 01C0           _BarDisp::
 01C0 0E940000          xcall push_gset3
 01C4 622F              mov R22,R18
 01C6 A801              movw R20,R16
 01C8 2597              sbiw R28,5
 01CA AB84              ldd R10,y+11
 01CC           ; }
 01CC           ; 
 01CC           ; /*
 01CC           ; *****************************************************************************
 01CC           ; * BarDisp - Bar型菜单显示
 01CC           ; * @Para s:BAR显示的文字内容
 01CC           ; * @Para X:X轴坐标
 01CC           ; * @Para Y:Y轴坐标
 01CC           ; * @Para HighLight:1--->高亮显示当前项  0--->普通显示当前项
 01CC           ; //HightLight = 1--->HightLight Disp
 01CC           ; //HightLight = 0--->Normal Disp
 01CC           ; *****************************************************************************
 01CC           ; */
 01CC           ; //void BarDisp(INT8U _CONST_ *s,INT8U X,INT8U Y,INT8U HighLight)
 01CC           ; void BarDisp(INT8U *s,INT8U X,INT8U Y,INT8U HighLight)
 01CC           ; {
 01CC           ;     Y++;//主要是在第一行不显示,美观些
 01CC A394              inc R10
 01CE           ;     if(LessCPUUseage==TRUE)
 01CE 80910000          lds R24,_LessCPUUseage
 01D2 8130              cpi R24,1
 01D4 49F5              brne L14
 01D6           ;       { 
 01D6           ;         if(HighLight==1)
 01D6 8D85              ldd R24,y+13
 01D8 8130              cpi R24,1
 01DA 99F4              brne L16
 01DC           ;         {
 01DC           ;             //高亮显示
 01DC           ;             GUI_DispStringAtBar(s,X+8,Y,LCD_XSIZE,GUI_TA_LEFT);
 01DC 2224              clr R2
 01DE 2C82              std y+4,R2
 01E0 81E6              ldi R24,97
 01E2 8A83              std y+2,R24
 01E4 A882              std y+0,R10
 01E6 262F              mov R18,R22
 01E8 285F              subi R18,248    ; addi 8
 01EA 8A01              movw R16,R20
 01EC 0E940000          xcall _GUI_DispStringAtBar
 01F0           ;             GUI_SetEnFont(En_6x12);
 01F0 0027              clr R16
 01F2 0E940000          xcall _GUI_SetEnFont
 01F6           ;             GUI_DispCharAt('>',X,Y);
 01F6 A882              std y+0,R10
 01F8 262F              mov R18,R22
 01FA 0EE3              ldi R16,62
 01FC 0E940000          xcall _GUI_DispCharAt
 0200           ;         }
 0200 32C0              xjmp L15
 0202           L16:
 0202           ;         else 
 0202           ;         {
 0202           ;             //通常显示
 0202           ;             //显示Bar的Text
 0202           ;             GUI_DispStringAtBar(s,X+8,Y,LCD_XSIZE,GUI_TA_LEFT);
 0202 2224              clr R2
 0204 2C82              std y+4,R2
 0206 81E6              ldi R24,97
 0208 8A83              std y+2,R24
 020A A882              std y+0,R10
 020C 262F              mov R18,R22
 020E 285F              subi R18,248    ; addi 8
 0210 8A01              movw R16,R20
 0212 0E940000          xcall _GUI_DispStringAtBar
 0216           ;             GUI_SetEnFont(En_6x12);
 0216 0027              clr R16
 0218 0E940000          xcall _GUI_SetEnFont
 021C           ;             GUI_DispCharAt(' ',X,Y);
 021C A882              std y+0,R10
 021E 262F              mov R18,R22
 0220 00E2              ldi R16,32
 0222 0E940000          xcall _GUI_DispCharAt
 0226           ;         }
 0226           ;       }
 0226 1FC0              xjmp L15
 0228           L14:
 0228           ;     else 
 0228           ;     {
 0228           ; 	    if(HighLight==1)
 0228 8D85              ldd R24,y+13
 022A 8130              cpi R24,1
 022C 81F4              brne L18
 022E           ;         {
 022E           ;             //高亮显示
 022E           ;             GUI_SetTextMode(GUI_TEXTMODE_REVERSE);//更改字体颜色来突出显示
 022E 01E0              ldi R16,1
 0230 0E940000          xcall _GUI_SetTextMode
 0234           ;                       GUI_DispStringAtBar(s,X,Y,LCD_XSIZE,GUI_TA_LEFT);
 0234 2224              clr R2
 0236 2C82              std y+4,R2
 0238 81E6              ldi R24,97
 023A 8A83              std y+2,R24
 023C A882              std y+0,R10
 023E 262F              mov R18,R22
 0240 8A01              movw R16,R20
 0242 0E940000          xcall _GUI_DispStringAtBar
 0246           ;               GUI_SetTextMode(GUI_TEXTMODE_NORMAL);
 0246 0027              clr R16
 0248 0E940000          xcall _GUI_SetTextMode
 024C           ;               //恢复原有字体颜色和背景颜色
 024C           ;       }
 024C 0CC0              xjmp L19
 024E           L18:
 024E           ;     	else 
 024E           ;     	{
 024E           ;          	//通常显示
 024E           ;         	//显示Bar的Text
 024E           ; 			GUI_SetTextMode(GUI_TEXTMODE_NORMAL);
 024E 0027              clr R16
 0250 0E940000          xcall _GUI_SetTextMode
 0254           ;               GUI_DispStringAtBar(s,X,Y,LCD_XSIZE,GUI_TA_LEFT);
 0254 2224              clr R2
 0256 2C82              std y+4,R2
 0258 81E6              ldi R24,97
 025A 8A83              std y+2,R24
 025C A882              std y+0,R10
 025E 262F              mov R18,R22
 0260 8A01              movw R16,R20
 0262 0E940000          xcall _GUI_DispStringAtBar
 0266           ;       }
 0266           L19:
 0266           ; 	}
 0266           L15:
 0266           L13:
 0266 2596              adiw R28,5
 0268 0E940000          xcall pop_gset3
 026C                   .dbline 0 ; func end
 026C 0895              ret
 026E           ;         Menu_i -> R20
 026E           ;         Menu_j -> R22
                        .even
 026E           _BarMenuInit::
 026E 0E940000          xcall push_gset2
 0272 2397              sbiw R28,3
 0274           ; }
 0274           ; 
 0274           ; 
 0274           ; /*FIXME!!!
 0274           ; 如何修改BarMenuInit和如何处理Item Where的初始化来达到如此一个目的?
 0274           ; 当前系统语言设定是英语,而英语这个项在第2项位置,因此如何能做到当菜单进入语言选择时,反显位置就在英语那里?
 0274           ; 1。修改BarMenuInit代码,处理第一次进入时的处理方式,也许就可以仅仅使用从子菜单退出时的处理方法*/
 0274           ; //Bar型菜单初始化  公共部分
 0274           ; void BarMenuInit(void)
 0274           ; {
 0274           ;     INT8U Menu_i ;//计数变量 在菜单函数中用到
 0274           ;     INT8U Menu_j ;//计数变量
 0274           ;     
 0274           ;     //比较"显示屏可以显示的项的数目(DispMax)"跟"需要显示的数目(ItemNum)"
 0274           ;     //找出小者,以小者为显示上限
 0274           ;     //例如显示屏可以显示3项,需要显示的项有2项,那么显示2项,有3项,显示3项,有4项的话,显示3项
 0274           ;     if(ItemNum>DispMax)
 0274 83E0              ldi R24,3
 0276 20900000          lds R2,_ItemNum
 027A 8215              cp R24,R2
 027C 18F4              brsh L21
 027E           ;     {
 027E           ;         DispMin=DispMax ;
 027E 80930000          sts _DispMin,R24
 0282           ;     }
 0282 04C0              xjmp L22
 0284           L21:
 0284           ;     else 
 0284           ;     {
 0284           ;         DispMin=ItemNum ;
 0284 20900000          lds R2,_ItemNum
 0288 20920000          sts _DispMin,R2
 028C           ;     }
 028C           L22:
 028C           ;     //--------------------
 028C           ;     //    if (Flash) {//从父菜单进入 初始化
 028C           ;     if(Flash==FlashMode_AutoInit)
 028C 80910000          lds R24,_Flash
 0290 8130              cpi R24,1
 0292 39F4              brne L23
 0294           ;     {
 0294           ;         //常规进入 做备份
 0294           ;         PUSH();
 0294 33DF              xcall _PUSH
 0296           ;         //在修改Item Where之前备份这些参数数据!!
 0296           ;         Item=0 ;
 0296 2224              clr R2
 0298 20920000          sts _Item,R2
 029C           ;         Where=0 ;
 029C 20920000          sts _Where,R2
 02A0           ;     }
 02A0 18C0              xjmp L24
 02A2           L23:
 02A2           ;     else if(Flash==FlashMode_ManualInit)
 02A2 80910000          lds R24,_Flash
 02A6 8230              cpi R24,2
 02A8 A1F4              brne L25
 02AA           ;     {
 02AA           ;         //非常规进入  在之前已经备份了,这里做边界检查
 02AA           ;         if(Where>DispMin-1)
 02AA 80910000          lds R24,_DispMin
 02AE 8150              subi R24,1
 02B0 20900000          lds R2,_Where
 02B4 8215              cp R24,R2
 02B6 18F4              brsh L27
 02B8           ;         {
 02B8           ;             //检查是否出界
 02B8           ;             //Where = DispMin-1;//A.最底部的显示位置
 02B8           ;             Where=0 ;
 02B8 2224              clr R2
 02BA 20920000          sts _Where,R2
 02BE           ;             //B.最顶部的显示位置
 02BE           ;         }
 02BE           L27:
 02BE           ;         if(Item>ItemNum-1)
 02BE 80910000          lds R24,_ItemNum
 02C2 8150              subi R24,1
 02C4 20900000          lds R2,_Item
 02C8 8215              cp R24,R2
 02CA 18F4              brsh L29
 02CC           ;         {
 02CC           ;             //检查是否出界
 02CC           ;             //Item = ItemNum-1;//A.最后的一个项
 02CC           ;             Item=0 ;
 02CC 2224              clr R2
 02CE 20920000          sts _Item,R2
 02D2           ;             //B.最开始的一个项
 02D2           ;         }
 02D2           L29:
 02D2           ;     }
 02D2           L25:
 02D2           L24:
 02D2           ;     //既然Item Where均是未定的,那么我们使用从子菜单退出的方法来找到应该再Where=0位置显示的Item项
 02D2           ; 
 02D2           ;     //方法2
 02D2           ;     if(Item>=Where)
 02D2 20900000          lds R2,_Where
 02D6 30900000          lds R3,_Item
 02DA 3214              cp R3,R2
 02DC 18F0              brlo L31
 02DE           ;     {
 02DE           ;         //未跨越零点
 02DE           ;         Menu_j=Item-Where ;
 02DE 632D              mov R22,R3
 02E0 6219              sub R22,R2
 02E2           ;     }
 02E2 08C0              xjmp L32
 02E4           L31:
 02E4           ;     else 
 02E4           ;     {
 02E4           ;         //跨越零点
 02E4           ;         Menu_j=ItemNum-(Where-Item);
 02E4 20900000          lds R2,_Item
 02E8 30900000          lds R3,_Where
 02EC 3218              sub R3,R2
 02EE 60910000          lds R22,_ItemNum
 02F2 6319              sub R22,R3
 02F4           ;     }
 02F4           L32:
 02F4           ;     //此时Menu_J的值就是顶部(Where=0)显示的Item值
 02F4           ;     //显示全部的子菜单项
 02F4           ;     for(Menu_i=0;Menu_i<DispMin;Menu_i++)
 02F4 4427              clr R20
 02F6 36C0              xjmp L36
 02F8           L33:
 02F8           ;     {
 02F8           ;         if(Menu_j==Item)
 02F8 20900000          lds R2,_Item
 02FC 6215              cp R22,R2
 02FE B9F4              brne L37
 0300           ;         {
 0300           ;             //反显第Item项,位置是Where
 0300           ;             BarDisp(*(DispItem+Item),BarXOffset,Where*BarYSize+BarYOffset,1);
 0300 81E0              ldi R24,1

⌨️ 快捷键说明

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