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

📄 menutop.s

📁 Atmega64单片机程序(完整工程)
💻 S
📖 第 1 页 / 共 3 页
字号:
	.module MenuTop.C
	.area text(rom, con, rel)
	.even
_InitMenuVal::
; /******************************************************************************
;  * MenuTop.C - 顶层菜单 条项菜单核心函数 图标层函数等
;  ******************************************************************************/
; 
; #include "SYS_Config.h" 
; #include "GUI_Config.h" 
; #include "GUI.H" 
; #include "LcdDrive.h" 
; #include "Menu.H" 
; 
; #define BarRemainDot  3
; //数字显示位置
; #define BarNumPosY    56
; //Bar的显示开始/结束位置
; #define BarBeginPosY  0
; 
; #define BarEndPosX    LCD_XSIZE
; #define BarEndPosY    6*8
; 
; extern INT8U ItemBackup_i;
; extern INT8U ItemBackup[];
; 
; void Bar(INT8U Item_,INT8U ItemNum_,INT8U BarPosX,INT8U BarNumPosX);
; 
; void DispBuildTime(void);
; //编译时间
; /*
; *****************************************************************************
; * InitMenuVal - 初始化菜单系统
; * DESCRIPTION: -
; * 该函数必须在进入菜单前被调用   初始化全局变量
; *****************************************************************************
; */
; void InitMenuVal(void)
; {
;     WhereBackup_i=0 ;
	clr R2
	sts _WhereBackup_i,R2
;     ItemBackup_i=0 ;
	sts _ItemBackup_i,R2
;     Layer=0 ;
	sts _Layer,R2
;     FatherIndex[Layer++]=MenuTopIndex ;
	clr R3
	mov R24,R2
	subi R24,255    ; addi 1
	sts _Layer,R24
	ldi R24,<_FatherIndex
	ldi R25,>_FatherIndex
	mov R30,R2
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
L1:
	.dbline 0 ; func end
	ret
	.even
_DispMenuTop::
	sbiw R28,5
;     //push index  待机界面作为起点
; }
; /*
; *****************************************************************************
; * DispMenuTop - 待机界面层5个函数
; * DESCRIPTION: -
; * DispMenuTop   DispMenuTopUp  DispMenuTopDown  DispMenuTopLeft DispMenuTopRight
; *****************************************************************************
; */
; 
; //待机界面
; void DispMenuTop(void)
; {
;     GUI_Clear();
	xcall _GUI_Clear
;     GUI_DispStringAtBar("菜单",0,1,LCD_XSIZE,GUI_TA_HCENTER);
	ldi R24,16
	std y+4,R24
	ldi R24,97
	std y+2,R24
	ldi R24,1
	std y+0,R24
	clr R18
	ldi R16,<L3
	ldi R17,>L3
	xcall _GUI_DispStringAtBar
;     //显示按键对应的文字提示,0-->"功能表"
;     GUI_DispStringAt(*(Tip[language].Text),1,LCD_YSIZE-14);
	ldi R24,54
	std y+0,R24
	ldi R18,1
	lds R2,_language
	ldi R24,5
	mul R24,R2
	movw R30,R0
	ldi R24,<_Tip
	ldi R25,>_Tip
	add R30,R24
	adc R31,R25
	lpm R0,Z+
	lpm R1,Z
	movw R30,R0
	ldd R16,z+0
	ldd R17,z+1
	xcall _GUI_DispStringAt
; 	//显示按键对应的文字提示,0-->"捷径"
; 	GUI_DispStringAt(*(Tip[language].Text+5),LCD_XSIZE-24,LCD_YSIZE-14);
	ldi R24,54
	std y+0,R24
	ldi R18,73
	lds R2,_language
	ldi R24,5
	mul R24,R2
	movw R30,R0
	ldi R24,<_Tip
	ldi R25,>_Tip
	add R30,R24
	adc R31,R25
	lpm R0,Z+
	lpm R1,Z
	movw R30,R0
	ldd R16,z+10
	ldd R17,z+11
	xcall _GUI_DispStringAt
L2:
	adiw R28,5
	.dbline 0 ; func end
	ret
	.even
_DispMenuTopUp::
; }
; //待机界面下Up键的处理
; void DispMenuTopUp(void)
; {
;     //-------------------
;     KeyPressCount=0 ;
	clr R2
	sts _KeyPressCount,R2
;     //-------------------
;     GUI_Clear();
	xcall _GUI_Clear
;     //-------------------
;     //这里是顶层菜单,因此在进入子菜单前需要初始化变量
;     InitMenuVal();
	xcall _InitMenuVal
;     //--------------------------
;     //状态跳转,进入子菜单
;     //jump to Menu index
;     Jump2Menu(MenuIndex,FlashMode_AutoInit);
	ldi R18,1
	ldi R16,5
	xcall _Jump2Menu
;     return ;
L4:
	.dbline 0 ; func end
	ret
	.even
_DispMenuTopDown::
; }
; //待机界面下Down键的处理
; void DispMenuTopDown(void)
; {
; 	if((KeyPressCount++)==0x01)
	lds R2,_KeyPressCount
	clr R3
	mov R24,R2
	subi R24,255    ; addi 1
	sts _KeyPressCount,R24
	mov R24,R2
	cpi R24,1
	brne L6
; 	{
; 	    KeyPressCount=0 ;
	clr R2
	sts _KeyPressCount,R2
; 	    GUI_Clear();
	xcall _GUI_Clear
; 		Jump2Menu(MenuSetupIndex,FlashMode_AutoInit);
	ldi R18,1
	ldi R16,30
	xcall _Jump2Menu
;         return ;
	xjmp L5
L6:
; 	}
;     //return to MenuTop index
;     Jump2Menu(MenuTopIndex,FlashMode_NoAction);
	clr R18
	clr R16
	xcall _Jump2Menu
;     return ;
L5:
	.dbline 0 ; func end
	ret
	.even
_DispMenuTopLeft::
; }
; //待机界面下Left键的处理
; void DispMenuTopLeft(void)
; {
;     KeyPressCount=0 ;
	clr R2
	sts _KeyPressCount,R2
;     /**  这里可以做这个按键的功能定义,因为这是在待机界面下
;          比如,做某个子菜单的快捷链接--按下该按键就直接跳转到某个子菜单
;     */
;     //-------------------
;     //这里是顶层菜单,因此在进入子菜单前需要初始化变量
;     //    InitMenuVal();
;     //--------------------------
;     //状态跳转,进入子菜单
;     Jump2Menu(MenuTopIndex,FlashMode_NoAction);
	clr R18
	clr R16
	xcall _Jump2Menu
;     return ;
L8:
	.dbline 0 ; func end
	ret
	.even
_DispMenuTopRight::
; }
; //待机界面下Right键的处理
; void DispMenuTopRight(void)
; {
;     KeyPressCount=0 ;
	clr R2
	sts _KeyPressCount,R2
; 
;     //功能函数执行完毕后重新回到待机界面
;     Jump2Menu(MenuTopIndex,FlashMode_NoAction);
	clr R18
	clr R16
	xcall _Jump2Menu
;     return ;
L9:
	.dbline 0 ; func end
	ret
	.even
_PUSH::
; }
; 
; 
; //菜单备份函数,备份当前菜单的各个参数
; void PUSH(void)
; {
;     WhereBackup[WhereBackup_i++]=Where ;//备份Where--->高亮显示的位置
	lds R2,_WhereBackup_i
	clr R3
	mov R24,R2
	subi R24,255    ; addi 1
	sts _WhereBackup_i,R24
	ldi R24,<_WhereBackup
	ldi R25,>_WhereBackup
	mov R30,R2
	clr R31
	add R30,R24
	adc R31,R25
	lds R2,_Where
	std z+0,R2
;     ItemBackup[ItemBackup_i++]=Item ;   //备份Item--->当前项的位置
	lds R2,_ItemBackup_i
	clr R3
	mov R24,R2
	subi R24,255    ; addi 1
	sts _ItemBackup_i,R24
	ldi R24,<_ItemBackup
	ldi R25,>_ItemBackup
	mov R30,R2
	clr R31
	add R30,R24
	adc R31,R25
	lds R2,_Item
	std z+0,R2
;     FatherIndex[Layer++]=KeyFuncIndex ; //备份KeyFuncIndex--->状态机的状态
	lds R2,_Layer
	clr R3
	mov R24,R2
	subi R24,255    ; addi 1
	sts _Layer,R24
	ldi R24,<_FatherIndex
	ldi R25,>_FatherIndex
	mov R30,R2
	clr R31
	add R30,R24
	adc R31,R25
	lds R2,_KeyFuncIndex
	std z+0,R2
L10:
	.dbline 0 ; func end
	ret
	.even
_POP::
; }
; 
; //菜单还原函数
; void POP(void)
; {
;     Layer--;//先弹出一层,因为使用的是++,因此当前Layer指向下一个数组位置
	lds R24,_Layer
	subi R24,1
	sts _Layer,R24
;     KeyFuncIndex=FatherIndex[Layer-1]; //恢复KeyFuncIndex
	ldi R24,<_FatherIndex-1
	ldi R25,>_FatherIndex-1
	lds R30,_Layer
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts _KeyFuncIndex,R2
;     Where=WhereBackup[--WhereBackup_i];//恢复高亮显示位置Where
	lds R24,_WhereBackup_i
	subi R24,1
	mov R2,R24
	sts _WhereBackup_i,R2
	ldi R24,<_WhereBackup
	ldi R25,>_WhereBackup
	mov R30,R2
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts _Where,R2
;     Item=ItemBackup[--ItemBackup_i];   //恢复项位置Item
	lds R24,_ItemBackup_i
	subi R24,1
	mov R2,R24
	sts _ItemBackup_i,R2
	ldi R24,<_ItemBackup
	ldi R25,>_ItemBackup
	mov R30,R2
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts _Item,R2
;     Flash=FlashMode_ReFlash ;          //子项返回,请求刷新
	ldi R24,3
	sts _Flash,R24
L11:
	.dbline 0 ; func end
	ret
;      HighLight -> y+13
;              Y -> R10
;              X -> R22
;              s -> R20,R21
	.even
_BarDisp::
	xcall push_gset3
	mov R22,R18
	movw R20,R16
	sbiw R28,5
	ldd R10,y+11
; }
; 
; /*
; *****************************************************************************
; * BarDisp - Bar型菜单显示
; * @Para s:BAR显示的文字内容
; * @Para X:X轴坐标
; * @Para Y:Y轴坐标
; * @Para HighLight:1--->高亮显示当前项  0--->普通显示当前项
; //HightLight = 1--->HightLight Disp
; //HightLight = 0--->Normal Disp
; *****************************************************************************
; */
; //void BarDisp(INT8U _CONST_ *s,INT8U X,INT8U Y,INT8U HighLight)
; void BarDisp(INT8U *s,INT8U X,INT8U Y,INT8U HighLight)
; {
;     Y++;//主要是在第一行不显示,美观些
	inc R10
;     if(LessCPUUseage==TRUE)
	lds R24,_LessCPUUseage
	cpi R24,1
	brne L14
; 	{ 
;         if(HighLight==1)
	ldd R24,y+13
	cpi R24,1
	brne L16
;         {
;             //高亮显示
;             GUI_DispStringAtBar(s,X+8,Y,LCD_XSIZE,GUI_TA_LEFT);
	clr R2
	std y+4,R2
	ldi R24,97
	std y+2,R24
	std y+0,R10
	mov R18,R22
	subi R18,248    ; addi 8
	movw R16,R20
	xcall _GUI_DispStringAtBar
;             GUI_SetEnFont(En_6x12);
	clr R16
	xcall _GUI_SetEnFont
;             GUI_DispCharAt('>',X,Y);
	std y+0,R10
	mov R18,R22
	ldi R16,62
	xcall _GUI_DispCharAt
;         }
	xjmp L15
L16:
;         else 
;         {
;             //通常显示
;             //显示Bar的Text
;             GUI_DispStringAtBar(s,X+8,Y,LCD_XSIZE,GUI_TA_LEFT);
	clr R2
	std y+4,R2
	ldi R24,97
	std y+2,R24
	std y+0,R10
	mov R18,R22
	subi R18,248    ; addi 8
	movw R16,R20
	xcall _GUI_DispStringAtBar
;             GUI_SetEnFont(En_6x12);
	clr R16
	xcall _GUI_SetEnFont
;             GUI_DispCharAt(' ',X,Y);
	std y+0,R10
	mov R18,R22
	ldi R16,32
	xcall _GUI_DispCharAt
;         }
; 	}
	xjmp L15
L14:
;     else 
;     {
; 	    if(HighLight==1)
	ldd R24,y+13
	cpi R24,1
	brne L18
;         {
;             //高亮显示
;             GUI_SetTextMode(GUI_TEXTMODE_REVERSE);//更改字体颜色来突出显示
	ldi R16,1
	xcall _GUI_SetTextMode
;        	 	GUI_DispStringAtBar(s,X,Y,LCD_XSIZE,GUI_TA_LEFT);
	clr R2
	std y+4,R2
	ldi R24,97
	std y+2,R24
	std y+0,R10
	mov R18,R22
	movw R16,R20
	xcall _GUI_DispStringAtBar
;         	GUI_SetTextMode(GUI_TEXTMODE_NORMAL);
	clr R16
	xcall _GUI_SetTextMode
;         	//恢复原有字体颜色和背景颜色
;     	}
	xjmp L19
L18:
;     	else 
;     	{
;          	//通常显示
;         	//显示Bar的Text
; 			GUI_SetTextMode(GUI_TEXTMODE_NORMAL);
	clr R16
	xcall _GUI_SetTextMode
;         	GUI_DispStringAtBar(s,X,Y,LCD_XSIZE,GUI_TA_LEFT);
	clr R2
	std y+4,R2
	ldi R24,97
	std y+2,R24
	std y+0,R10
	mov R18,R22
	movw R16,R20
	xcall _GUI_DispStringAtBar
;     	}
L19:
; 	}
L15:
L13:
	adiw R28,5
	xcall pop_gset3
	.dbline 0 ; func end
	ret
;         Menu_i -> R20
;         Menu_j -> R22
	.even
_BarMenuInit::
	xcall push_gset2
	sbiw R28,3
; }
; 
; 
; /*FIXME!!!
; 如何修改BarMenuInit和如何处理Item Where的初始化来达到如此一个目的?
; 当前系统语言设定是英语,而英语这个项在第2项位置,因此如何能做到当菜单进入语言选择时,反显位置就在英语那里?
; 1。修改BarMenuInit代码,处理第一次进入时的处理方式,也许就可以仅仅使用从子菜单退出时的处理方法*/
; //Bar型菜单初始化  公共部分
; void BarMenuInit(void)
; {
;     INT8U Menu_i ;//计数变量 在菜单函数中用到
;     INT8U Menu_j ;//计数变量
;     
;     //比较"显示屏可以显示的项的数目(DispMax)"跟"需要显示的数目(ItemNum)"
;     //找出小者,以小者为显示上限
;     //例如显示屏可以显示3项,需要显示的项有2项,那么显示2项,有3项,显示3项,有4项的话,显示3项
;     if(ItemNum>DispMax)
	ldi R24,3
	lds R2,_ItemNum
	cp R24,R2
	brsh L21
;     {
;         DispMin=DispMax ;
	sts _DispMin,R24
;     }
	xjmp L22
L21:
;     else 
;     {
;         DispMin=ItemNum ;
	lds R2,_ItemNum
	sts _DispMin,R2
;     }
L22:
;     //--------------------
;     //    if (Flash) {//从父菜单进入 初始化
;     if(Flash==FlashMode_AutoInit)
	lds R24,_Flash
	cpi R24,1
	brne L23
;     {
;         //常规进入 做备份
;         PUSH();
	xcall _PUSH
;         //在修改Item Where之前备份这些参数数据!!
;         Item=0 ;
	clr R2
	sts _Item,R2
;         Where=0 ;
	sts _Where,R2
;     }
	xjmp L24
L23:
;     else if(Flash==FlashMode_ManualInit)
	lds R24,_Flash
	cpi R24,2
	brne L25
;     {
;         //非常规进入  在之前已经备份了,这里做边界检查
;         if(Where>DispMin-1)
	lds R24,_DispMin
	subi R24,1
	lds R2,_Where
	cp R24,R2
	brsh L27
;         {
;             //检查是否出界
;             //Where = DispMin-1;//A.最底部的显示位置
;             Where=0 ;
	clr R2
	sts _Where,R2
;             //B.最顶部的显示位置
;         }
L27:
;         if(Item>ItemNum-1)
	lds R24,_ItemNum
	subi R24,1
	lds R2,_Item
	cp R24,R2
	brsh L29
;         {
;             //检查是否出界
;             //Item = ItemNum-1;//A.最后的一个项
;             Item=0 ;
	clr R2
	sts _Item,R2
;             //B.最开始的一个项
;         }
L29:
;     }
L25:
L24:
;     //既然Item Where均是未定的,那么我们使用从子菜单退出的方法来找到应该再Where=0位置显示的Item项
; 
;     //方法2
;     if(Item>=Where)
	lds R2,_Where
	lds R3,_Item
	cp R3,R2
	brlo L31
;     {
;         //未跨越零点
;         Menu_j=Item-Where ;
	mov R22,R3
	sub R22,R2
;     }
	xjmp L32
L31:
;     else 
;     {
;         //跨越零点
;         Menu_j=ItemNum-(Where-Item);
	lds R2,_Item
	lds R3,_Where
	sub R3,R2
	lds R22,_ItemNum
	sub R22,R3
;     }
L32:
;     //此时Menu_J的值就是顶部(Where=0)显示的Item值
;     //显示全部的子菜单项
;     for(Menu_i=0;Menu_i<DispMin;Menu_i++)
	clr R20
	xjmp L36
L33:
;     {
;         if(Menu_j==Item)
	lds R2,_Item
	cp R22,R2
	brne L37
;         {
;             //反显第Item项,位置是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
;         }
	xjmp L38
L37:
;         else 
;         {
;             //其它项 正常显示
;             BarDisp(*(DispItem+Menu_j),BarXOffset,Menu_i*BarYSize+BarYOffset,0);
	clr R2
	std y+2,R2
	ldi R24,16
	mul R24,R20
	std y+0,R0

⌨️ 快捷键说明

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