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

📄 menu.s

📁 做点阵式lcd多级菜单开发的一个例子 可以帮助初学者了解 交互式界面简单设计的部分
💻 S
📖 第 1 页 / 共 4 页
字号:
	.dbline 95
; 			{			
	.dbline 96
; 				user_choosen=max_item;
	lds R2,_max_item
	sts _user_choosen,R2
	.dbline 97
; 			}
L148:
	.dbline 98
; 			refresh=1;
	ldi R24,1
	sts _refresh,R24
	.dbline 99
; 			user_choosen--;
	lds R24,_user_choosen
	subi R24,1
	sts _user_choosen,R24
	.dbline 100
; 			break;
	xjmp L144
L150:
	.dbline 102
; 		case 2:				//向下键.
; 			user_choosen++;
	lds R24,_user_choosen
	subi R24,255    ; addi 1
	sts _user_choosen,R24
	.dbline 103
; 			if(user_choosen==max_item)
	lds R2,_max_item
	cp R24,R2
	brne L151
X37:
	.dbline 104
; 			{
	.dbline 105
; 				user_choosen=0;
	clr R2
	sts _user_choosen,R2
	.dbline 106
; 			}
L151:
	.dbline 107
; 			refresh=1;
	ldi R24,1
	sts _refresh,R24
	.dbline 108
; 			break;
	xjmp L144
L153:
	.dbline 110
; 		case 3:				//确认键.			
; 			if(menu_led[user_choosen].subs!=NULL)
	lds R2,_user_choosen
	ldi R24,9
	mul R24,R2
	movw R30,R0
	lds R2,_menu_led
	lds R3,_menu_led+1
	add R30,R2
	adc R31,R3
	ldd R2,z+3
	ldd R3,z+4
	tst R2
	brne X38
	tst R3
	breq L154
X38:
	.dbline 111
; 			{
	.dbline 112
; 				(*menu_led[user_choosen].subs)();	//执行函数.
	lds R2,_user_choosen
	mul R24,R2
	movw R30,R0
	lds R2,_menu_led
	lds R3,_menu_led+1
	add R30,R2
	adc R31,R3
	ldd R26,z+3
	ldd R27,z+4
	movw R30,R26
	xcall xicall
	.dbline 113
; 			}
L154:
	.dbline 114
; 			if(menu_led[user_choosen].children_menus!=NULL)
	lds R2,_user_choosen
	ldi R24,9
	mul R24,R2
	movw R30,R0
	lds R2,_menu_led
	lds R3,_menu_led+1
	add R30,R2
	adc R31,R3
	ldd R2,z+5
	ldd R3,z+6
	tst R2
	brne X39
	tst R3
	breq L156
X39:
	.dbline 115
; 			{
	.dbline 116
; 				temp_choosen=user_choosen;
	lds R2,_user_choosen
	sts _temp_choosen,R2
	.dbline 117
; 				menu_led=menu_led[user_choosen].children_menus;
	mul R24,R2
	movw R30,R0
	lds R2,_menu_led
	lds R3,_menu_led+1
	add R30,R2
	adc R31,R3
	ldd R2,z+5
	ldd R3,z+6
	sts _menu_led+1,R3
	sts _menu_led,R2
	.dbline 118
; 				user_choosen=0;
	clr R2
	sts _user_choosen,R2
	.dbline 119
; 			}
L156:
	.dbline 120
; 			refresh=1;
	ldi R24,1
	sts _refresh,R24
	.dbline 121
; 			break;
	xjmp L144
L158:
	.dbline 123
; 		case 4:				//返回键.
; 			if(menu_led[user_choosen].parent_menus!=NULL)
	lds R2,_user_choosen
	ldi R24,9
	mul R24,R2
	movw R30,R0
	lds R2,_menu_led
	lds R3,_menu_led+1
	add R30,R2
	adc R31,R3
	ldd R2,z+7
	ldd R3,z+8
	tst R2
	brne X40
	tst R3
	breq L159
X40:
	.dbline 124
; 			{
	.dbline 125
; 				menu_led=menu_led[user_choosen].parent_menus;
	lds R2,_user_choosen
	mul R24,R2
	movw R30,R0
	lds R2,_menu_led
	lds R3,_menu_led+1
	add R30,R2
	adc R31,R3
	ldd R2,z+7
	ldd R3,z+8
	sts _menu_led+1,R3
	sts _menu_led,R2
	.dbline 126
; 			}	
L159:
	.dbline 127
; 			refresh=1;
	ldi R24,1
	sts _refresh,R24
	.dbline 128
; 			break;
	.dbline 130
; 		default:
; 			break;			
L144:
	.dbline 132
; 	}
; 	if(refresh)					//是否需要刷新LCD标志位.
	lds R2,_refresh
	tst R2
	breq L161
X41:
	.dbline 133
; 	{
	.dbline 134
; 		lcd_clr();
	xcall _lcd_clr
	.dbline 135
; 		refresh=0;
	clr R2
	sts _refresh,R2
	.dbline 136
; 	}
L161:
	.dbline 137
; 	led_menu_show();	
	xcall _led_menu_show
	.dbline -2
L142:
	.dbline 0 ; func end
	ld R21,y+
	ld R20,y+
	ret
	.dbend
	.dbfunc e led_menu_show _led_menu_show fV
;              n -> R20
	.even
_led_menu_show::
	xcall push_xgsetF000
	sbiw R28,6
	.dbline -1
	.dbline 141
; }
; 
; void led_menu_show(void)	
; {
	.dbline 143
; 	uchar n;
; 	max_item=menu_led->menu_count;
	lds R30,_menu_led
	lds R31,_menu_led+1
	ldd R2,z+0
	sts _max_item,R2
	.dbline 144
; 	if (max_item>=3)				//菜单项为3则表示为主菜单.
	mov R24,R2
	cpi R24,3
	brlo L164
X44:
	.dbline 145
; 	{				
	.dbline 146
; 		for(n=0;n<3;n++)
	clr R20
	xjmp L169
L166:
	.dbline 147
; 		{
	.dbline 149
; /*使同一数组元素图形宽度相同,即取最大的图形宽度,这里取96,在数组赋值时也要注意*/		
; 			draw_bmp(n*2,20,96,0,menu_led[n].display);
	ldi R24,9
	mul R24,R20
	movw R30,R0
	lds R2,_menu_led
	lds R3,_menu_led+1
	add R30,R2
	adc R31,R3
	ldd R2,z+1
	ldd R3,z+2
	std y+5,R3
	std y+4,R2
	clr R2
	std y+2,R2
	ldi R24,96
	std y+0,R24
	ldi R18,20
	mov R16,R20
	lsl R16
	xcall _draw_bmp
	.dbline 150
; 		}
L167:
	.dbline 146
	inc R20
L169:
	.dbline 146
	cpi R20,3
	brlo L166
X45:
	.dbline 151
; 		select_item(user_choosen);		//标记出当前菜单项.
	lds R16,_user_choosen
	xcall _select_item
	.dbline 152
; 	}
	xjmp L165
L164:
	.dbline 154
; 	else
; 	{
	.dbline 155
; 		switch(temp_choosen)
	lds R22,_temp_choosen
	clr R23
	cpi R22,0
	cpc R22,R23
	breq L173
X46:
	cpi R22,1
	ldi R30,0
	cpc R23,R30
	breq L174
X47:
	cpi R22,2
	ldi R30,0
	cpc R23,R30
	breq L175
X48:
	xjmp L171
L173:
	.dbline 158
; 		{
; 			case 0:
; 				draw_bmp(0,20,96,0,blue);
	ldi R24,<_blue
	ldi R25,>_blue
	std y+5,R25
	std y+4,R24
	clr R2
	std y+2,R2
	ldi R24,96
	std y+0,R24
	ldi R18,20
	clr R16
	xcall _draw_bmp
	.dbline 159
; 				break;
	xjmp L171
L174:
	.dbline 161
; 			case 1:
; 				draw_bmp(0,20,96,0,green);
	ldi R24,<_green
	ldi R25,>_green
	std y+5,R25
	std y+4,R24
	clr R2
	std y+2,R2
	ldi R24,96
	std y+0,R24
	ldi R18,20
	clr R16
	xcall _draw_bmp
	.dbline 162
; 				break;
	xjmp L171
L175:
	.dbline 164
; 			case 2:
; 				draw_bmp(0,20,96,0,red);
	ldi R24,<_red
	ldi R25,>_red
	std y+5,R25
	std y+4,R24
	clr R2
	std y+2,R2
	ldi R24,96
	std y+0,R24
	ldi R18,20
	clr R16
	xcall _draw_bmp
	.dbline 165
; 				break;
	.dbline 167
; 			default:
; 				break;
L171:
	.dbline 169
; 		}
; 		for(n=0;n<max_item;n++)
	clr R20
	xjmp L179
L176:
	.dbline 170
; 		{
	.dbline 171
; 			draw_bmp((n+1)*2,20,32,0,menu_led[n].display);
	ldi R24,9
	mul R24,R20
	movw R30,R0
	lds R2,_menu_led
	lds R3,_menu_led+1
	add R30,R2
	adc R31,R3
	ldd R2,z+1
	ldd R3,z+2
	std y+5,R3
	std y+4,R2
	clr R2
	std y+2,R2
	ldi R24,32
	std y+0,R24
	ldi R18,20
	mov R16,R20
	subi R16,255    ; addi 1
	lsl R16
	xcall _draw_bmp
	.dbline 172
; 		}
L177:
	.dbline 169
	inc R20
L179:
	.dbline 169
	lds R2,_max_item
	cp R20,R2
	brlo L176
X49:
	.dbline 173
; 		select_item(user_choosen+1);					
	lds R16,_user_choosen
	subi R16,255    ; addi 1
	xcall _select_item
	.dbline 174
; 	}		
L165:
	.dbline -2
L163:
	.dbline 0 ; func end
	adiw R28,6
	xjmp pop_xgsetF000
	.dbsym r n 20 c
	.dbend
	.dbfunc e select_item _select_item fV
;              n -> R10
	.even
_select_item::
	st -y,R10
	mov R10,R16
	sbiw R28,6
	.dbline -1
	.dbline 178
; }
; 
; void select_item(uchar n)
; {
	.dbline 179
; 	draw_bmp(n*2,2,16,0,curflag);
	ldi R24,<_curflag
	ldi R25,>_curflag
	std y+5,R25
	std y+4,R24
	clr R2
	std y+2,R2
	ldi R24,16
	std y+0,R24
	ldi R18,2
	mov R16,R10
	lsl R16
	xcall _draw_bmp
	.dbline -2
L180:
	.dbline 0 ; func end
	adiw R28,6
	ld R10,y+
	ret
	.dbsym r n 10 c
	.dbend
	.dbfunc e openblue _openblue fV
	.even
_openblue::
	.dbline -1
	.dbline 183
; }
; 
; void openblue(void)
; {
	.dbline 184
; 	blueon;
	sbi 0x18,5
	.dbline 185
; 	greenoff;
	cbi 0x18,6
	.dbline 186
; 	redoff;
	cbi 0x18,7
	.dbline -2
L181:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e opengreen _opengreen fV
	.even
_opengreen::
	.dbline -1
	.dbline 190
; }
; 
; void opengreen(void)
; {
	.dbline 191
; 	blueoff;
	cbi 0x18,5
	.dbline 192
; 	greenon;
	sbi 0x18,6
	.dbline 193
; 	redoff;
	cbi 0x18,7
	.dbline -2
L182:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e openred _openred fV
	.even
_openred::
	.dbline -1
	.dbline 197
; }
; 
; void openred(void)
; {
	.dbline 198
; 	blueoff;
	cbi 0x18,5
	.dbline 199
; 	greenoff;
	cbi 0x18,6
	.dbline 200
; 	redon;
	sbi 0x18,7
	.dbline -2
L183:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e closeblue _closeblue fV
	.even
_closeblue::
	.dbline -1
	.dbline 204
; }
; 
; void closeblue(void)
; {
	.dbline 205
; 	blueoff;
	cbi 0x18,5
	.dbline -2
L184:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e closegreen _closegreen fV
	.even
_closegreen::
	.dbline -1
	.dbline 209
; }
; 
; void closegreen(void)
; {
	.dbline 210
; 	greenoff;
	cbi 0x18,6
	.dbline -2
L185:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
	.even
_main::
	sbiw R28,6
	.dbline -1
	.dbline 221
; }
; 	
; 
; 
; 
; /*************************************************
; 主程序.
; **************************************************/
; 
; void main(void)
; {
	.dbline 222
; 	main_init();
	xcall _main_init
	.dbline 223
; 	lcd_init();
	xcall _lcd_init
	.dbline 224
; 	lcd_clr();
	xcall _lcd_clr
	.dbline 225
; 	draw_bmp(0,0,128,0,xtcsh);		//函数调用形式为页,列,宽度,数据指针.
	ldi R24,<_xtcsh
	ldi R25,>_xtcsh
	std y+5,R25
	std y+4,R24
	clr R2
	std y+2,R2
	ldi R24,128
	std y+0,R24
	clr R18
	clr R16
	xcall _draw_bmp
	.dbline 226
; 	draw_bmp(2,8,72,0,writeby);
	ldi R24,<_writeby
	ldi R25,>_writeby
	std y+5,R25
	std y+4,R24
	clr R2
	std y+2,R2
	ldi R24,72
	std y+0,R24
	ldi R18,8
	ldi R16,2
	xcall _draw_bmp
	.dbline 227
; 	draw_bmp(4,56,32,1,jiangping);
	ldi R24,<_jiangping
	ldi R25,>_jiangping
	std y+5,R25
	std y+4,R24
	ldi R24,1
	std y+2,R24
	ldi R24,32
	std y+0,R24
	ldi R18,56
	ldi R16,4
	xcall _draw_bmp
	.dbline 229
; 
; 	blueon;
	sbi 0x18,5
	.dbline 230
; 	greenon;
	sbi 0x18,6
	.dbline 231
; 	redon;
	sbi 0x18,7
	.dbline 233
; 		
; 	delay_ms(3000);				//延时3秒.
	ldi R16,3000
	ldi R17,11
	xcall _delay_ms
	.dbline 234
; 	lcd_clr();
	xcall _lcd_clr
	.dbline 236
; 	
; 	blueoff;
	cbi 0x18,5
	.dbline 237
; 	greenoff;
	cbi 0x18,6
	.dbline 238
; 	redoff;
	cbi 0x18,7
	.dbline 240
; 	
; 	main_menu_initial();
	xcall _main_menu_initial
	.dbline 241
; 	blue_menu_initial();
	xcall _blue_menu_initial
	.dbline 242
; 	green_menu_initial();
	xcall _green_menu_initial
	xjmp L188
L187:
	.dbline 245
; 
;  	while(1)
; 	{
	.dbline 246
;  		keyval=get_key();	 			  //读键.
	xcall _get_key
	sts _keyval,R16
	.dbline 247
; 		led_menu_pro();
	xcall _led_menu_pro
	.dbline 248
; 	}
L188:
	.dbline 244
	xjmp L187
X50:
	.dbline -2
L186:
	.dbline 0 ; func end
	adiw R28,6
	ret
	.dbend
	.area bss(ram, con, rel)
	.dbfile F:\diy\LedMenu\menu.c
_temp_choosen::
	.blkb 1
	.dbfile F:\diy\LedMenu\menu.h
	.dbsym e temp_choosen _temp_choosen c
_green_menu::
	.blkb 18
	.dbsym e green_menu _green_menu A[18:2]S[menu_item]
_blue_menu::
	.blkb 18
	.dbsym e blue_menu _blue_menu A[18:2]S[menu_item]
_main_menu::
	.blkb 36
	.dbsym e main_menu _main_menu A[36:4]S[menu_item]
; }		
; 
; 
; 
	.area  func_lit
PL_closegreen:	.word `_closegreen
PL_opengreen:	.word `_opengreen
PL_closeblue:	.word `_closeblue
PL_openblue:	.word `_openblue
PL_openred:	.word `_openred

⌨️ 快捷键说明

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