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

📄 menu.s

📁 做点阵式lcd多级菜单开发的一个例子 可以帮助初学者了解 交互式界面简单设计的部分
💻 S
📖 第 1 页 / 共 4 页
字号:
	.dbsym r x 10 c
	.dbsym r bmp 14 pkc
	.dbsym l mod 16 c
	.dbsym l width 14 c
	.dbsym l col 12 c
	.dbsym l page 10 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile F:\diy\LedMenu\lcd_12864.h
L54:
	.blkb 1
	.area data(ram, con, rel)
	.dbfile F:\diy\LedMenu\lcd_12864.h
L55:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile F:\diy\LedMenu\lcd_12864.h
L56:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile F:\diy\LedMenu\lcd_12864.h
L57:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile F:\diy\LedMenu\lcd_12864.h
	.area text(rom, con, rel)
	.dbfile F:\diy\LedMenu\lcd_12864.h
	.dbfile F:\diy\LedMenu\get_key.h
	.dbfunc e get_key _get_key fc
	.dbsym s keylock L57 c
	.dbsym s havekey L56 c
	.dbsym s keytime L55 c
	.dbsym s lastkcode L54 c
;           pass -> R16
;       kcodebuf -> R18
	.even
_get_key::
	.dbline -1
	.dbline 8
; /**********************************************************************************/
; //写一个八个按键的程序.最后的两个按键为方向键,可以连续调整.
; #define nullkey 0
; #define pr_timekey 9
; #define nusekey 10
; 
; uchar get_key(void)
; {
	.dbline 14
; 	uchar pass,kcodebuf;	
; 	static uchar lastkcode,keytime=0;	//定义为静态变量,外部不可见,但需要常驻内存.
; 	static uchar havekey=0;
; 	static uchar keylock=0;
; 		
; 	kcodebuf=PIND & 0xff;
	in R18,0x10
	andi R18,255
	.dbline 15
; 	keytime++;
	lds R24,L55
	subi R24,255    ; addi 1
	sts L55,R24
	.dbline 16
; 	if (kcodebuf!=lastkcode) keytime=0;
	lds R2,L54
	cp R18,R2
	breq L58
X15:
	.dbline 16
	clr R2
	sts L55,R2
L58:
	.dbline 17
; 	if (kcodebuf==0xff)
	cpi R18,255
	brne L60
X16:
	.dbline 18
; 	{
	.dbline 19
; 		havekey=0;
	clr R2
	sts L56,R2
	.dbline 20
; 		keylock=0;
	sts L57,R2
	.dbline 21
; 		keytime=0;
	sts L55,R2
	.dbline 22
; 		pass=0;
	clr R16
	.dbline 23
; 	}
	xjmp L61
L60:
	.dbline 24
; 	else if (kcodebuf==0x7f)
	cpi R18,127
	brne L62
X17:
	.dbline 25
; 	{
	.dbline 26
; 		keylock=1;
	ldi R24,1
	sts L57,R24
	.dbline 27
; 		if (keytime==0) pass=7;
	lds R2,L55
	tst R2
	brne L64
X18:
	.dbline 27
	ldi R16,7
	xjmp L63
L64:
	.dbline 29
; 		else
; 		{
	.dbline 30
; 			if (keytime==100)
	lds R24,L55
	cpi R24,100
	brne L66
X19:
	.dbline 31
; 			{
	.dbline 32
; 				pass=7;
	ldi R16,7
	.dbline 33
; 				keytime=80;
	ldi R24,80
	sts L55,R24
	.dbline 34
; 			}
	xjmp L63
L66:
	.dbline 35
; 			else pass=pr_timekey;
	ldi R16,9
	.dbline 36
; 		}
	.dbline 37
; 	}
	xjmp L63
L62:
	.dbline 38
; 	else if (kcodebuf==0xbf)
	cpi R18,191
	brne L68
X20:
	.dbline 39
; 	{
	.dbline 40
; 		keylock=1;
	ldi R24,1
	sts L57,R24
	.dbline 41
; 		if (keytime==0) pass=8;
	lds R2,L55
	tst R2
	brne L70
X21:
	.dbline 41
	ldi R16,8
	xjmp L69
L70:
	.dbline 42
; 		else if (keytime==100)
	lds R24,L55
	cpi R24,100
	brne L72
X22:
	.dbline 43
; 		{
	.dbline 44
; 			pass=8;
	ldi R16,8
	.dbline 45
; 			keytime=80;
	ldi R24,80
	sts L55,R24
	.dbline 46
; 		}
	xjmp L69
L72:
	.dbline 47
; 		else pass=pr_timekey;
	ldi R16,9
	.dbline 48
; 	}
	xjmp L69
L68:
	.dbline 50
; 	
; 	else if (havekey==0)
	lds R2,L56
	tst R2
	brne L74
X23:
	.dbline 51
; 	{
	.dbline 52
; 		havekey=1;
	ldi R24,1
	sts L56,R24
	.dbline 53
; 		pass=nusekey;
	ldi R16,10
	.dbline 54
; 	}
	xjmp L75
L74:
	.dbline 56
; 	
; 	else if (keylock==1) pass=nusekey;
	lds R24,L57
	cpi R24,1
	brne L76
X24:
	.dbline 56
	ldi R16,10
	xjmp L77
L76:
	.dbline 58
; 	
; 	else if (kcodebuf==0xdf)
	cpi R18,223
	brne L78
X25:
	.dbline 59
; 	{
	.dbline 60
; 		keylock=1;
	ldi R24,1
	sts L57,R24
	.dbline 61
; 		pass=6;
	ldi R16,6
	.dbline 62
; 	}
	xjmp L79
L78:
	.dbline 63
; 	else if (kcodebuf==0xef)
	cpi R18,239
	brne L80
X26:
	.dbline 64
; 	{
	.dbline 65
; 		keylock=1;
	ldi R24,1
	sts L57,R24
	.dbline 66
; 		pass=5;
	ldi R16,5
	.dbline 67
; 	}
	xjmp L81
L80:
	.dbline 68
; 	else if (kcodebuf==0xf7)
	cpi R18,247
	brne L82
X27:
	.dbline 69
; 	{
	.dbline 70
; 		keylock=1;
	ldi R24,1
	sts L57,R24
	.dbline 71
; 		pass=4;
	ldi R16,4
	.dbline 72
; 	}
	xjmp L83
L82:
	.dbline 73
; 	else if (kcodebuf==0xfb)
	cpi R18,251
	brne L84
X28:
	.dbline 74
; 	{
	.dbline 75
; 		keylock=1;
	ldi R24,1
	sts L57,R24
	.dbline 76
; 		pass=3;
	ldi R16,3
	.dbline 77
; 	}
	xjmp L85
L84:
	.dbline 78
; 	else if (kcodebuf==0xfd)
	cpi R18,253
	brne L86
X29:
	.dbline 79
; 	{
	.dbline 80
; 		keylock=1;
	ldi R24,1
	sts L57,R24
	.dbline 81
; 		pass=2;
	ldi R16,2
	.dbline 82
; 	}
	xjmp L87
L86:
	.dbline 83
; 	else if (kcodebuf==0xfe)
	cpi R18,254
	brne L88
X30:
	.dbline 84
; 	{
	.dbline 85
; 		keylock=1;
	ldi R24,1
	sts L57,R24
	.dbline 86
; 		pass=1;
	ldi R16,1
	.dbline 87
; 	}
	xjmp L89
L88:
	.dbline 88
; 	else pass=nusekey;
	ldi R16,10
L89:
L87:
L85:
L83:
L81:
L79:
L77:
L75:
L69:
L63:
L61:
	.dbline 89
; 	lastkcode=kcodebuf;
	sts L54,R18
	.dbline 91
; 
; 	return(pass);
	.dbline -2
L53:
	.dbline 0 ; func end
	ret
	.dbsym r pass 16 c
	.dbsym r kcodebuf 18 c
	.dbend
	.dbfile F:\diy\LedMenu\menu.c
	.dbfunc e main_init _main_init fV
	.even
_main_init::
	.dbline -1
	.dbline 23
; /****************************************************************************************
; 简单菜单程序,八个按键.使用AVR单片机.2008/3/24
; 编译器为ICCAVR7.14.晶振7.3728M,单片机为ATmega16(用ATmega32在proteus中仿真不成功!)
; *****************************************************************************************/
; 
; #include <iom16v.h>
; #include <macros.h>
; #include <stdio.h>
; #include "menu.h"		//所有变量定义以及函数声明均放在这个头文件里.
; #include "delay.h"
; #include "lcd_12864.h"
; #include "get_key.h"
; 
; #define blueon PORTB|=(1<<PORTB5)
; #define blueoff PORTB&=~(1<<PORTB5)
; #define greenon PORTB|=(1<<PORTB6)
; #define greenoff PORTB&=~(1<<PORTB6)
; #define redon PORTB|=(1<<PORTB7)
; #define redoff PORTB&=~(1<<PORTB7)
; 
; //SFR初始化.
; void main_init(void)
; {
	.dbline 24
; 	DDRA=0xff;			//A口设置为输出.
	ldi R24,255
	out 0x1a,R24
	.dbline 25
; 	PORTA=0x00;
	clr R2
	out 0x1b,R2
	.dbline 26
; 	DDRB=0xff;			//B口设置为输出.
	out 0x17,R24
	.dbline 27
; 	PORTB=0x00;
	out 0x18,R2
	.dbline 29
; //	ASSR&=~(1<<AS2);
; 	DDRC=0x00;			//C口设置为输入.
	out 0x14,R2
	.dbline 30
; 	PORTC=0xff;			//AVR没有上拉寄存器,在PORTC中写1即表示打开上拉了.
	out 0x15,R24
	.dbline 31
; 	DDRD=0x00;			//D口设置为输入.												 
	out 0x11,R2
	.dbline 32
; 	PORTD=0xff;			//打开D口上拉.		
	out 0x12,R24
	.dbline -2
L90:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main_menu_initial _main_menu_initial fV
	.even
_main_menu_initial::
	.dbline -1
	.dbline 36
; }
; 
; void main_menu_initial(void)	//LED主菜单初始化.
; {
	.dbline 37
; 	main_menu[0].menu_count=3;	//有三个菜单项.
	ldi R24,3
	sts _main_menu,R24
	.dbline 38
; 	main_menu[0].display=blue;
	ldi R24,<_blue
	ldi R25,>_blue
	sts _main_menu+1+1,R25
	sts _main_menu+1,R24
	.dbline 39
; 	main_menu[0].subs=NULL;		//点亮兰灯
	clr R2
	clr R3
	sts _main_menu+3+1,R3
	sts _main_menu+3,R2
	.dbline 40
; 	main_menu[0].children_menus=blue_menu;
	ldi R24,<_blue_menu
	ldi R25,>_blue_menu
	sts _main_menu+5+1,R25
	sts _main_menu+5,R24
	.dbline 41
; 	main_menu[0].parent_menus=NULL;
	sts _main_menu+7+1,R3
	sts _main_menu+7,R2
	.dbline 43
; 	
; 	main_menu[1].menu_count=3;
	ldi R24,3
	sts _main_menu+9,R24
	.dbline 44
; 	main_menu[1].display=green;		//点亮绿灯
	ldi R24,<_green
	ldi R25,>_green
	sts _main_menu+9+1+1,R25
	sts _main_menu+9+1,R24
	.dbline 45
; 	main_menu[1].subs=NULL;
	sts _main_menu+9+3+1,R3
	sts _main_menu+9+3,R2
	.dbline 46
; 	main_menu[1].children_menus=green_menu;
	ldi R24,<_green_menu
	ldi R25,>_green_menu
	sts _main_menu+9+5+1,R25
	sts _main_menu+9+5,R24
	.dbline 47
; 	main_menu[1].parent_menus=NULL;
	sts _main_menu+9+7+1,R3
	sts _main_menu+9+7,R2
	.dbline 49
; 	
; 	main_menu[2].menu_count=3;
	ldi R24,3
	sts _main_menu+18,R24
	.dbline 50
; 	main_menu[2].display=red;		//点亮红灯.
	ldi R24,<_red
	ldi R25,>_red
	sts _main_menu+18+1+1,R25
	sts _main_menu+18+1,R24
	.dbline 51
; 	main_menu[2].subs=openred;
	ldi R24,<PL_openred
	ldi R25,>PL_openred
	sts _main_menu+18+3+1,R25
	sts _main_menu+18+3,R24
	.dbline 52
; 	main_menu[2].children_menus=NULL;
	sts _main_menu+18+5+1,R3
	sts _main_menu+18+5,R2
	.dbline 53
; 	main_menu[2].parent_menus=NULL;
	sts _main_menu+18+7+1,R3
	sts _main_menu+18+7,R2
	.dbline -2
L91:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e blue_menu_initial _blue_menu_initial fV
	.even
_blue_menu_initial::
	.dbline -1
	.dbline 57
; }
; 
; void blue_menu_initial(void)
; {
	.dbline 58
; 	blue_menu[0].menu_count=2;
	ldi R24,2
	sts _blue_menu,R24
	.dbline 59
; 	blue_menu[0].display=qr;			//点亮兰灯,确认.
	ldi R24,<_qr
	ldi R25,>_qr
	sts _blue_menu+1+1,R25
	sts _blue_menu+1,R24
	.dbline 60
; 	blue_menu[0].subs=openblue;
	ldi R24,<PL_openblue
	ldi R25,>PL_openblue
	sts _blue_menu+3+1,R25
	sts _blue_menu+3,R24
	.dbline 61
; 	blue_menu[0].children_menus=NULL;
	clr R2
	clr R3
	sts _blue_menu+5+1,R3
	sts _blue_menu+5,R2
	.dbline 62
; 	blue_menu[0].parent_menus=main_menu;
	ldi R24,<_main_menu
	ldi R25,>_main_menu
	sts _blue_menu+7+1,R25
	sts _blue_menu+7,R24
	.dbline 64
; 	
; 	blue_menu[1].menu_count=2;
	ldi R24,2
	sts _blue_menu+9,R24
	.dbline 65
; 	blue_menu[1].display=qx;			//取消.
	ldi R24,<_qx
	ldi R25,>_qx
	sts _blue_menu+9+1+1,R25
	sts _blue_menu+9+1,R24
	.dbline 66
; 	blue_menu[1].subs=closeblue;
	ldi R24,<PL_closeblue
	ldi R25,>PL_closeblue
	sts _blue_menu+9+3+1,R25
	sts _blue_menu+9+3,R24
	.dbline 67
; 	blue_menu[1].children_menus=NULL;
	sts _blue_menu+9+5+1,R3
	sts _blue_menu+9+5,R2
	.dbline 68
; 	blue_menu[1].parent_menus=main_menu;	
	ldi R24,<_main_menu
	ldi R25,>_main_menu
	sts _blue_menu+9+7+1,R25
	sts _blue_menu+9+7,R24
	.dbline -2
L114:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e green_menu_initial _green_menu_initial fV
	.even
_green_menu_initial::
	.dbline -1
	.dbline 72
; }
; 
; void green_menu_initial(void)
; {
	.dbline 73
; 	green_menu[0].menu_count=2;
	ldi R24,2
	sts _green_menu,R24
	.dbline 74
; 	green_menu[0].display=qr;			//点亮绿灯---确认.
	ldi R24,<_qr
	ldi R25,>_qr
	sts _green_menu+1+1,R25
	sts _green_menu+1,R24
	.dbline 75
; 	green_menu[0].subs=opengreen;
	ldi R24,<PL_opengreen
	ldi R25,>PL_opengreen
	sts _green_menu+3+1,R25
	sts _green_menu+3,R24
	.dbline 76
; 	green_menu[0].children_menus=NULL;
	clr R2
	clr R3
	sts _green_menu+5+1,R3
	sts _green_menu+5,R2
	.dbline 77
; 	green_menu[0].parent_menus=main_menu;
	ldi R24,<_main_menu
	ldi R25,>_main_menu
	sts _green_menu+7+1,R25
	sts _green_menu+7,R24
	.dbline 79
; 	
; 	green_menu[1].menu_count=2;
	ldi R24,2
	sts _green_menu+9,R24
	.dbline 80
; 	green_menu[1].display=qx;			//----取消.
	ldi R24,<_qx
	ldi R25,>_qx
	sts _green_menu+9+1+1,R25
	sts _green_menu+9+1,R24
	.dbline 81
; 	green_menu[1].subs=closegreen;
	ldi R24,<PL_closegreen
	ldi R25,>PL_closegreen
	sts _green_menu+9+3+1,R25
	sts _green_menu+9+3,R24
	.dbline 82
; 	green_menu[1].children_menus=NULL;
	sts _green_menu+9+5+1,R3
	sts _green_menu+9+5,R2
	.dbline 83
; 	green_menu[1].parent_menus=main_menu;
	ldi R24,<_main_menu
	ldi R25,>_main_menu
	sts _green_menu+9+7+1,R25
	sts _green_menu+9+7,R24
	.dbline -2
L128:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e led_menu_pro _led_menu_pro fV
	.even
_led_menu_pro::
	st -y,R20
	st -y,R21
	.dbline -1
	.dbline 88
; }
; 
; 
; void led_menu_pro(void)
; {
	.dbline 89
; 	max_item=menu_led->menu_count;
	lds R30,_menu_led
	lds R31,_menu_led+1
	ldd R2,z+0
	sts _max_item,R2
	.dbline 90
; 	switch(keyval)
	lds R20,_keyval
	clr R21
	cpi R20,0
	cpc R20,R21
	brne X42
	xjmp L144
X42:
X31:
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	breq L147
X32:
	cpi R20,2
	ldi R30,0
	cpc R21,R30
	breq L150
X33:
	cpi R20,3
	ldi R30,0
	cpc R21,R30
	breq L153
X34:
	cpi R20,4
	ldi R30,0
	cpc R21,R30
	brne X43
	xjmp L158
X43:
X35:
	xjmp L144
L147:
	.dbline 94
; 	{
; 		case 0: break;
; 		case 1:				//向上键.
; 			if(user_choosen==0)
	lds R2,_user_choosen
	tst R2
	brne L148
X36:

⌨️ 快捷键说明

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