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