⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menutop.s

📁 Atmega64单片机程序(完整工程)
💻 S
📖 第 1 页 / 共 3 页
字号:
	clr R18
	ldi R24,2
	mul R24,R22
	movw R30,R0
	lds R2,_DispItem
	lds R3,_DispItem+1
	add R30,R2
	adc R31,R3
	ldd R16,z+0
	ldd R17,z+1
	xcall _BarDisp
;         }
L38:
;         if(Menu_j==(ItemNum-1))
	lds R24,_ItemNum
	subi R24,1
	cp R22,R24
	brne L39
;         {
;             //到了最后一项,回环到最开始的一项
;             Menu_j=0 ;
	clr R22
;         }
	xjmp L40
L39:
;         else 
;         {
;             //下一项
;             Menu_j++;
	inc R22
;         }
L40:
L34:
	inc R20
L36:
	lds R2,_DispMin
	cp R20,R2
	brsh X0
	xjmp L33
X0:
;     }
;     Bar(Item,ItemNum,MenuBarPosX,MenuBarNumPosX);       // jjx          //维护滚动条
	ldi R24,88
	std y+2,R24
	ldi R24,94
	std y+0,R24
	lds R18,_ItemNum
	lds R16,_Item
	xcall _Bar
L20:
	adiw R28,3
	xcall pop_gset2
	.dbline 0 ; func end
	ret
;       ItemBack -> R20
;         Menu_i -> R22
;         Menu_j -> R10
	.even
_BarMenuLeft::
	xcall push_gset3
	sbiw R28,3
; }
; 
; 
; //Bar项菜单向左按键的行为
; /*
; 可能的几种情况:
; A.原有Bar的顶部,按键是向上,那么就需要刷新全部的显示
; A1.若是需要显示的Bar多于单屏可以显示的Bar,那么重新显示全部
; A2.若是需要显示的Bar不多于单屏可以显示的Bar,取消顶部高亮显示,高亮显示最后一项Bar
; B.原有Bar不是在顶部,按键向上,那么取消原有Bar的高亮,高亮显示上一个Bar项
; 当然还需要维护:高亮显示的位置where/高亮显示Bar项的Item
; */
; 
; //维护Bar显示
; void BarMenuLeft(void)
; {
;     INT8U Menu_i ; //计数变量 在菜单函数中用到
;     INT8U Menu_j ;//计数变量
;     INT8U ItemBack ;
; 	
;     ItemBack=Item ;//备份原有的Item,取消原有反显时需要使用
	lds R20,_Item
;     
;     if(Item==0)    //维护Item,得到需要反显的Item
	tst R20
	brne L42
;     {
;         Item=ItemNum-1 ;
	lds R24,_ItemNum
	subi R24,1
	sts _Item,R24
;     }
	xjmp L43
L42:
;     else 
;     {
;         Item--;
	lds R24,_Item
	subi R24,1
	sts _Item,R24
;     }
L43:
;     //维护显示
;     if(Where)
	lds R2,_Where
	tst R2
	brne X1
	xjmp L44
X1:
;     {
;         //当前位置不为0,就是说不是在顶部,两次反显
;         if (LessCPUUseage==TRUE)
	lds R24,_LessCPUUseage
	cpi R24,1
	brne L46
; 		{ 
;             GUI_SetEnFont(En_6x12);
	clr R16
	xcall _GUI_SetEnFont
;             GUI_DispCharAt(' ',BarXOffset,(Where--)*BarYSize+BarYOffset);
	lds R2,_Where
	clr R3
	mov R24,R2
	subi R24,1
	sts _Where,R24
	ldi R16,16
	ldi R17,0
	movw R18,R2
	xcall empy16s
	std y+0,R16
	clr R18
	ldi R16,32
	xcall _GUI_DispCharAt
;             GUI_DispCharAt('>',BarXOffset,Where*BarYSize+BarYOffset);
	lds R2,_Where
	ldi R24,16
	mul R24,R2
	std y+0,R0
	clr R18
	ldi R16,62
	xcall _GUI_DispCharAt
;         }
	xjmp L45
L46:
; 		else 
; 		{
;                         //原来位置取消反显   项是ItemBack  位置Where
;             BarDisp(*(DispItem+ItemBack),BarXOffset,(Where--)*BarYSize+BarYOffset,0);
	clr R2
	std y+2,R2
	lds R2,_Where
	clr R3
	mov R24,R2
	subi R24,1
	sts _Where,R24
	ldi R16,16
	ldi R17,0
	movw R18,R2
	xcall empy16s
	std y+0,R16
	clr R18
	ldi R24,2
	mul R24,R20
	movw R30,R0
	lds R2,_DispItem
	lds R3,_DispItem+1
	add R30,R2
	adc R31,R3
	ldd R16,z+0
	ldd R17,z+1
	xcall _BarDisp
;                         //上移后的位置反显   项是Item      位置Where-1 (Where--实现)
;             BarDisp(*(DispItem+Item),BarXOffset,Where*BarYSize+BarYOffset,1);
	ldi R24,1
	std y+2,R24
	lds R2,_Where
	ldi R24,16
	mul R24,R2
	std y+0,R0
	clr R18
	lds R2,_Item
	ldi R24,2
	mul R24,R2
	movw R30,R0
	lds R2,_DispItem
	lds R3,_DispItem+1
	add R30,R2
	adc R31,R3
	ldd R16,z+0
	ldd R17,z+1
	xcall _BarDisp
;                         //高亮显示
; 		}
;         
;         #ifdef RockBack 
;     }
	xjmp L45
L44:
;     else 
;     {
;         //当前位置为0,     顶部  上移  需要刷新全部子菜单项显示   //1.回滚方式,到了顶部后回滚到底部
;         #ifdef DynamicBar 
;         if((ItemNum>DispMax)||(BarDataMode==DynamicData))
;         {
;             //需要显示的Bar多于单屏可以显示的Bar,那么重新显示//08/29
;             #else 
;             if(ItemNum>DispMax)
	ldi R24,3
	lds R2,_ItemNum
	cp R24,R2
	brlo X2
	xjmp L48
X2:
;             {
;                 //需要显示的Bar多于单屏可以显示的Bar,那么重新显示
;                 #endif 
;                 #else 
;             }
;             else if(ItemBack!=0)
;             {
;                 if(ItemNum>DispMax)
;                 {
;                     //需要显示的Bar多于单屏可以显示的Bar,那么重新显示全部
;                     #endif 
;                     
;                     Menu_j=Item ;
	lds R10,_Item
;                     Menu_i=0 ;
	clr R22
;                     //项是 Item 位置 0
;                     BarDisp(*(DispItem+Menu_j),BarXOffset,Menu_i*BarYSize+BarYOffset,1);
	ldi R24,1
	std y+2,R24
	ldi R24,16
	mul R24,R22
	std y+0,R0
	clr R18
	ldi R24,2
	mul R24,R10
	movw R30,R0
	lds R2,_DispItem
	lds R3,_DispItem+1
	add R30,R2
	adc R31,R3
	ldd R16,z+0
	ldd R17,z+1
	xcall _BarDisp
;                     if(Menu_j==(ItemNum-1))
	lds R24,_ItemNum
	subi R24,1
	cp R10,R24
	brne L50
;                     {
;                         //维护Menu_j
;                         Menu_j=0 ;
	clr R10
;                     }
	xjmp L51
L50:
;                     else 
;                     {
;                         Menu_j++;
	inc R10
;                     }
L51:
;                     //显示其他项
;                     for(Menu_i=1;Menu_i<DispMax;Menu_i++)
	ldi R22,1
	xjmp L55
L52:
;                     {
;                         BarDisp(*(DispItem+Menu_j),BarXOffset,Menu_i*BarYSize+BarYOffset,0);
	clr R2
	std y+2,R2
	ldi R24,16
	mul R24,R22
	std y+0,R0
	clr R18
	ldi R24,2
	mul R24,R10
	movw R30,R0
	lds R2,_DispItem
	lds R3,_DispItem+1
	add R30,R2
	adc R31,R3
	ldd R16,z+0
	ldd R17,z+1
	xcall _BarDisp
;                         if(Menu_j==(ItemNum-1))
	lds R24,_ItemNum
	subi R24,1
	cp R10,R24
	brne L56
;                         {
;                             Menu_j=0 ;
	clr R10
;                         }
	xjmp L57
L56:
;                         else 
;                         {
;                             Menu_j++;
	inc R10
;                         }
L57:
L53:
	inc R22
L55:
	cpi R22,3
	brlo L52
;                     }
;                     Where=0 ;
	clr R2
	sts _Where,R2
;                     //当前位置依然在开头的0位置
;                 }
	xjmp L49
L48:
;                 else 
;                 {
;                     //单屏能显示完全部菜单项,"顶部 上移"应当跳转到底部(或者什么都不做)
;                     //当仅仅只有一项的时候,应当一直在Where=0的地方反显的!!!这里也能实现,因为最后是反显的函数
;                     Where=ItemNum-1 ;
	lds R24,_ItemNum
	subi R24,1
	sts _Where,R24
;                     //取消顶部的原有的反显  项ItemBack  位置0
;                     BarDisp(*(DispItem+ItemBack),BarXOffset,0*BarYSize+BarYOffset,0);
	clr R2
	std y+2,R2
	std y+0,R2
	clr R18
	ldi R24,2
	mul R24,R20
	movw R30,R0
	lds R2,_DispItem
	lds R3,_DispItem+1
	add R30,R2
	adc R31,R3
	ldd R16,z+0
	ldd R17,z+1
	xcall _BarDisp
;                     //反显根部  项Item  位置ItemNum-1
;                     BarDisp(*(DispItem+Item),BarXOffset,Where*BarYSize+BarYOffset,1);
	ldi R24,1
	std y+2,R24
	lds R2,_Where
	ldi R24,16
	mul R24,R2
	std y+0,R0
	clr R18
	lds R2,_Item
	ldi R24,2
	mul R24,R2
	movw R30,R0
	lds R2,_DispItem
	lds R3,_DispItem+1
	add R30,R2
	adc R31,R3
	ldd R16,z+0
	ldd R17,z+1
	xcall _BarDisp
;                     //反显
;                 }
L49:
;                 #ifdef RockBack 
;             }
L45:
;             #else 
;         }
;         else 
;         {
;             Item=ItemBack ;
;             //Restore
;         }
;         
;         #endif 
;         
;         Bar(Item,ItemNum,125,120);       //jjx              //维护滚动条
	ldi R24,120
	std y+2,R24
	ldi R24,125
	std y+0,R24
	lds R18,_ItemNum
	lds R16,_Item
	xcall _Bar
;         Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
	clr R18
	ldi R24,<_FatherIndex-1
	ldi R25,>_FatherIndex-1
	lds R30,_Layer
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _Jump2Menu
L41:
	adiw R28,3
	xcall pop_gset3
	.dbline 0 ; func end
	ret
;       ItemBack -> R20
;         Menu_i -> R22
;         Menu_j -> R10
	.even
_BarMenuRight::
	xcall push_gset3
	sbiw R28,3
; }
; 
; 
; //Bar项菜单向右按键的行为
; //维护Bar显示
; void BarMenuRight(void)
; {
;     INT8U Menu_i ;//计数变量 在菜单函数中用到
;     INT8U Menu_j ;//计数变量
;     INT8U ItemBack ;
; 	
;     ItemBack=Item ;//---维护Item
	lds R20,_Item
;     if(Item==(ItemNum-1))
	lds R24,_ItemNum
	subi R24,1
	cp R20,R24
	brne L60
;     {
;         Item=0 ;
	clr R2
	sts _Item,R2
;     }
	xjmp L61
L60:
;     else 
;     {
;         Item++;
	lds R24,_Item
	subi R24,255    ; addi 1
	sts _Item,R24
;     }
L61:
; 
;     //---维护显示
;     if(Where!=(DispMin-1))
	lds R24,_DispMin
	subi R24,1
	lds R2,_Where
	cp R2,R24
	brne X3
	xjmp L62
X3:
;     {
;         //当前位置不为最末,两次反显
;         if (LessCPUUseage==TRUE)
	lds R24,_LessCPUUseage
	cpi R24,1
	brne L64
; 		{
;              GUI_SetEnFont(En_6x12);
	clr R16
	xcall _GUI_SetEnFont
;              GUI_DispCharAt(' ',BarXOffset,(Where++)*BarYSize+BarYOffset);
	lds R2,_Where
	clr R3
	mov R24,R2
	subi R24,255    ; addi 1
	sts _Where,R24
	ldi R16,16
	ldi R17,0
	movw R18,R2
	xcall empy16s
	std y+0,R16
	clr R18
	ldi R16,32
	xcall _GUI_DispCharAt
;              GUI_DispCharAt('>',BarXOffset,Where*BarYSize+BarYOffset);
	lds R2,_Where
	ldi R24,16
	mul R24,R2
	std y+0,R0
	clr R18
	ldi R16,62
	xcall _GUI_DispCharAt
;         }
	xjmp L63
L64:
; 		else
; 		{ 
;                  //原来位置取消反显   项是ItemBack  位置Where
;              BarDisp(*(DispItem+ItemBack),BarXOffset,(Where++)*BarYSize+BarYOffset,0);
	clr R2
	std y+2,R2
	lds R2,_Where
	clr R3
	mov R24,R2
	subi R24,255    ; addi 1
	sts _Where,R24
	ldi R16,16
	ldi R17,0
	movw R18,R2
	xcall empy16s
	std y+0,R16
	clr R18
	ldi R24,2
	mul R24,R20
	movw R30,R0
	lds R2,_DispItem
	lds R3,_DispItem+1
	add R30,R2
	adc R31,R3
	ldd R16,z+0
	ldd R17,z+1
	xcall _BarDisp
;                  //下移后的位置反显   项是Item      位置Where+1(Where++实现)
;              BarDisp(*(DispItem+Item),BarXOffset,Where*BarYSize+BarYOffset,1);
	ldi R24,1
	std y+2,R24
	lds R2,_Where
	ldi R24,16
	mul R24,R2
	std y+0,R0
	clr R18
	lds R2,_Item
	ldi R24,2
	mul R24,R2
	movw R30,R0
	lds R2,_DispItem
	lds R3,_DispItem+1
	add R30,R2
	adc R31,R3
	ldd R16,z+0
	ldd R17,z+1
	xcall _BarDisp
;                  //反显
;         }
;         
;         #ifdef RockBack 
;     }
	xjmp L63
L62:
;     else 
;     {
;         //当前位置为DispMax    底部  下移
;         #ifdef DynamicBar 
;         if((ItemNum>DispMax)||(BarDataMode==DynamicData))
;         {
;             //需要显示的Bar多于单屏可以显示的Bar,那么重新显示//08/29
;             #else 
;             if(ItemNum>DispMax)
	ldi R24,3
	lds R2,_ItemNum
	cp R24,R2
	brlo X4
	xjmp L66
X4:
;             {
;                 //需要显示的Bar多于单屏可以显示的Bar,那么重新显示
;                 #endif 
;                 #else 
;             }
;             else if(ItemBack!=(ItemNum-1))
;             {
;                 //当前位置为DispMax    如果原来显示位置不是最后一项,则 底部  下移
;                 if(ItemNum>DispMax)
;                 {
;                     //需要显示的Bar多于单屏可以显示的Bar,那么重新显示
;                     #endif 
;                     Menu_j=Item ;
	lds R10,_Item
;                     Menu_i=DispMax ;
	ldi R22,3
;                     //项是 Item  位置是 DispMax
;                     BarDisp(*(DispItem+Menu_j),BarXOffset,(Menu_i-1)*BarYSize+BarYOffset,1);
	ldi R24,1
	std y+2,R24
	ldi R24,16
	mul R24,R22
	mov R24,R0
	subi R24,16
	std y+0,R24
	clr R18
	ldi R24,2
	mul R24,R10
	movw R30,R0
	lds R2,_DispItem
	lds R3,_DispItem+1
	add R30,R2
	adc R31,R3
	ldd R16,z+0
	ldd R17,z+1
	xcall _BarDisp
;                     if(Menu_j==0)
	tst R10
	brne L68
;                     {
;                         Menu_j=ItemNum-1 ;
	lds R24,_ItemNum
	subi R24,1
	mov R10,R24
;                     }
	xjmp L69
L68:
;                     else 
;                     {
;                         Menu_j--;
	dec R10
;                     }
L69:
;                     //显示其他项
;                     for(Menu_i=DispMax-1;Menu_i>0;Menu_i--)
	ldi R22,2
	xjmp L73
L70:
;                     {
;                         BarDisp(*(DispItem+Menu_j),BarXOffset,(Menu_i-1)*BarYSize+BarYOffset,0);
	clr R2
	std y+2,R2
	ldi R24,16
	mul R24,R22
	mov R24,R0
	subi R24,16
	std y+0,R24
	clr R18
	ldi R24,2
	mul R24,R10
	movw R30,R0
	lds R2,_DispItem
	lds R3,_DispItem+1
	add R30,R2
	adc R31,R3
	ldd R16,z+0
	ldd R17,z+1
	xcall _BarDisp
;                         if(Menu_j==0)
	tst R10
	brne L74
;                         {
;                             Menu_j=ItemNum-1 ;
	lds R24,_ItemNum
	subi R24,1
	mov R10,R24
;                         }
	xjmp L75
L74:
;                         else 
;                         {
;                             Menu_j--;
	dec R10
;                         }
L75:
L71:
	dec R22
L73:
	clr R2

⌨️ 快捷键说明

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