📄 menu.s
字号:
.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 + -