📄 ledmenu_icc.lst
字号:
(0130)
(0131) if (mod) send_data(~bmp[p]);
39F 8808 LDD R0,Y+16
3A0 2000 TST R0
3A1 F041 BEQ 0x03AA
3A2 2DEC MOV R30,R12
3A3 27FF CLR R31
3A4 0DEE ADD R30,R14
3A5 1DFF ADC R31,R15
3A6 9104 LPM R16,8(Z)
3A7 9500 COM R16
3A8 DF91 RCALL _send_data
3A9 C006 RJMP 0x03B0
(0132) else send_data(bmp[p]); //发送数据.
3AA 2DEC MOV R30,R12
3AB 27FF CLR R31
3AC 0DEE ADD R30,R14
3AD 1DFF ADC R31,R15
3AE 9104 LPM R16,6(Z)
3AF DF8A RCALL _send_data
(0133)
(0134) if(window)
3B0 2366 TST R22
3B1 F019 BEQ 0x03B5
(0135) {
(0136) L_on;
3B2 98C0 CBI 0x18,0
(0137) R_off;
3B3 9AC1 SBI 0x18,1
(0138) }
3B4 C002 RJMP 0x03B7
(0139)
(0140) else
(0141) {
(0142) L_off;
3B5 9AC0 SBI 0x18,0
(0143) R_on;
3B6 98C1 CBI 0x18,1
(0144) }
(0145)
(0146) send_comm((page_addr_set | page)+1); //页地址加一.
3B7 850A LDD R16,Y+10
3B8 6B08 ORI R16,0xB8
3B9 5F0F SUBI R16,0xFF
3BA DF74 RCALL _send_comm
(0147) send_comm(col_addr_set | address); //列地址不变.
3BB 2F04 MOV R16,R20
3BC 6400 ORI R16,0x40
3BD DF71 RCALL _send_comm
(0148)
(0149) if (mod) send_data(~bmp[p+width]);
3BE 8808 LDD R0,Y+16
3BF 2000 TST R0
3C0 F061 BEQ 0x03CD
3C1 842E LDD R2,Y+14
3C2 2433 CLR R3
3C3 2DEC MOV R30,R12
3C4 27FF CLR R31
3C5 0DE2 ADD R30,R2
3C6 1DF3 ADC R31,R3
3C7 0DEE ADD R30,R14
3C8 1DFF ADC R31,R15
3C9 9104 LPM R16,14(Z)
3CA 9500 COM R16
3CB DF6E RCALL _send_data
3CC C00A RJMP 0x03D7
(0150) else send_data(bmp[p+width]); //第二排数据.
3CD 842E LDD R2,Y+14
3CE 2433 CLR R3
3CF 2DEC MOV R30,R12
3D0 27FF CLR R31
3D1 0DE2 ADD R30,R2
3D2 1DF3 ADC R31,R3
3D3 0DEE ADD R30,R14
3D4 1DFF ADC R31,R15
3D5 9104 LPM R16,14(Z)
3D6 DF63 RCALL _send_data
(0151)
(0152) p++;
3D7 94C3 INC R12
3D8 94A3 INC R10
3D9 842C LDD R2,Y+12
3DA 840E LDD R0,Y+14
3DB 0C20 ADD R2,R0
3DC 14A2 CP R10,R2
3DD F408 BCC 0x03DF
3DE CFA3 RJMP 0x0382
3DF 940E 06D9 CALL pop_xgsetF0FC
3E1 9624 ADIW R28,4
3E2 9508 RET
FILE: F:\diy\LedMenu\get_key.h
(0001) /**********************************************************************************/
(0002) //写一个八个按键的程序.最后的两个按键为方向键,可以连续调整.
(0003) #define nullkey 0
(0004) #define pr_timekey 9
(0005) #define nusekey 10
(0006)
(0007) uchar get_key(void)
(0008) {
(0009) uchar pass,kcodebuf;
(0010) static uchar lastkcode,keytime=0; //定义为静态变量,外部不可见,但需要常驻内存.
(0011) static uchar havekey=0;
(0012) static uchar keylock=0;
(0013)
(0014) kcodebuf=PIND & 0xff;
_get_key:
pass --> R16
kcodebuf --> R18
3E3 B320 IN R18,0x10
3E4 7F2F ANDI R18,0xFF
(0015) keytime++;
3E5 9180 0066 LDS R24,keytime
3E7 5F8F SUBI R24,0xFF
3E8 9380 0066 STS keytime,R24
(0016) if (kcodebuf!=lastkcode) keytime=0;
3EA 9020 0069 LDS R2,get_key.h:lastkcode
3EC 1522 CP R18,R2
3ED F019 BEQ 0x03F1
3EE 2422 CLR R2
3EF 9220 0066 STS keytime,R2
(0017) if (kcodebuf==0xff)
3F1 3F2F CPI R18,0xFF
3F2 F449 BNE 0x03FC
(0018) {
(0019) havekey=0;
3F3 2422 CLR R2
3F4 9220 0067 STS get_key.h:havekey,R2
(0020) keylock=0;
3F6 9220 0068 STS get_key.h:keylock,R2
(0021) keytime=0;
3F8 9220 0066 STS keytime,R2
(0022) pass=0;
3FA 2700 CLR R16
(0023) }
3FB C066 RJMP 0x0462
(0024) else if (kcodebuf==0x7f)
3FC 372F CPI R18,0x7F
3FD F4A1 BNE 0x0412
(0025) {
(0026) keylock=1;
3FE E081 LDI R24,1
3FF 9380 0068 STS get_key.h:keylock,R24
(0027) if (keytime==0) pass=7;
401 9020 0066 LDS R2,keytime
403 2022 TST R2
404 F411 BNE 0x0407
405 E007 LDI R16,7
406 C05B RJMP 0x0462
(0028) else
(0029) {
(0030) if (keytime==100)
407 9180 0066 LDS R24,keytime
409 3684 CPI R24,0x64
40A F429 BNE 0x0410
(0031) {
(0032) pass=7;
40B E007 LDI R16,7
(0033) keytime=80;
40C E580 LDI R24,0x50
40D 9380 0066 STS keytime,R24
(0034) }
40F C052 RJMP 0x0462
(0035) else pass=pr_timekey;
410 E009 LDI R16,0x9
(0036) }
(0037) }
411 C050 RJMP 0x0462
(0038) else if (kcodebuf==0xbf)
412 3B2F CPI R18,0xBF
413 F4A1 BNE 0x0428
(0039) {
(0040) keylock=1;
414 E081 LDI R24,1
415 9380 0068 STS get_key.h:keylock,R24
(0041) if (keytime==0) pass=8;
417 9020 0066 LDS R2,keytime
419 2022 TST R2
41A F411 BNE 0x041D
41B E008 LDI R16,0x8
41C C045 RJMP 0x0462
(0042) else if (keytime==100)
41D 9180 0066 LDS R24,keytime
41F 3684 CPI R24,0x64
420 F429 BNE 0x0426
(0043) {
(0044) pass=8;
421 E008 LDI R16,0x8
(0045) keytime=80;
422 E580 LDI R24,0x50
423 9380 0066 STS keytime,R24
(0046) }
425 C03C RJMP 0x0462
(0047) else pass=pr_timekey;
426 E009 LDI R16,0x9
(0048) }
427 C03A RJMP 0x0462
(0049)
(0050) else if (havekey==0)
428 9020 0067 LDS R2,get_key.h:havekey
42A 2022 TST R2
42B F429 BNE 0x0431
(0051) {
(0052) havekey=1;
42C E081 LDI R24,1
42D 9380 0067 STS get_key.h:havekey,R24
(0053) pass=nusekey;
42F E00A LDI R16,0xA
(0054) }
430 C031 RJMP 0x0462
(0055)
(0056) else if (keylock==1) pass=nusekey;
431 9180 0068 LDS R24,get_key.h:keylock
433 3081 CPI R24,1
434 F411 BNE 0x0437
435 E00A LDI R16,0xA
436 C02B RJMP 0x0462
(0057)
(0058) else if (kcodebuf==0xdf)
437 3D2F CPI R18,0xDF
438 F429 BNE 0x043E
(0059) {
(0060) keylock=1;
439 E081 LDI R24,1
43A 9380 0068 STS get_key.h:keylock,R24
(0061) pass=6;
43C E006 LDI R16,6
(0062) }
43D C024 RJMP 0x0462
(0063) else if (kcodebuf==0xef)
43E 3E2F CPI R18,0xEF
43F F429 BNE 0x0445
(0064) {
(0065) keylock=1;
440 E081 LDI R24,1
441 9380 0068 STS get_key.h:keylock,R24
(0066) pass=5;
443 E005 LDI R16,5
(0067) }
444 C01D RJMP 0x0462
(0068) else if (kcodebuf==0xf7)
445 3F27 CPI R18,0xF7
446 F429 BNE 0x044C
(0069) {
(0070) keylock=1;
447 E081 LDI R24,1
448 9380 0068 STS get_key.h:keylock,R24
(0071) pass=4;
44A E004 LDI R16,4
(0072) }
44B C016 RJMP 0x0462
(0073) else if (kcodebuf==0xfb)
44C 3F2B CPI R18,0xFB
44D F429 BNE 0x0453
(0074) {
(0075) keylock=1;
44E E081 LDI R24,1
44F 9380 0068 STS get_key.h:keylock,R24
(0076) pass=3;
451 E003 LDI R16,3
(0077) }
452 C00F RJMP 0x0462
(0078) else if (kcodebuf==0xfd)
453 3F2D CPI R18,0xFD
454 F429 BNE 0x045A
(0079) {
(0080) keylock=1;
455 E081 LDI R24,1
456 9380 0068 STS get_key.h:keylock,R24
(0081) pass=2;
458 E002 LDI R16,2
(0082) }
459 C008 RJMP 0x0462
(0083) else if (kcodebuf==0xfe)
45A 3F2E CPI R18,0xFE
45B F429 BNE 0x0461
(0084) {
(0085) keylock=1;
45C E081 LDI R24,1
45D 9380 0068 STS get_key.h:keylock,R24
(0086) pass=1;
45F E001 LDI R16,1
(0087) }
460 C001 RJMP 0x0462
(0088) else pass=nusekey;
461 E00A LDI R16,0xA
(0089) lastkcode=kcodebuf;
462 9320 0069 STS get_key.h:lastkcode,R18
(0090)
(0091) return(pass);
464 9508 RET
FILE: F:\diy\LedMenu\menu.c
(0001) /****************************************************************************************
(0002) 简单菜单程序,八个按键.使用AVR单片机.2008/3/24
(0003) 编译器为ICCAVR7.14.晶振7.3728M,单片机为ATmega16(用ATmega32在proteus中仿真不成功!)
(0004) *****************************************************************************************/
(0005)
(0006) #include <iom16v.h>
(0007) #include <macros.h>
(0008) #include <stdio.h>
(0009) #include "menu.h" //所有变量定义以及函数声明均放在这个头文件里.
(0010) #include "delay.h"
(0011) #include "lcd_12864.h"
(0012) #include "get_key.h"
(0013)
(0014) #define blueon PORTB|=(1<<PORTB5)
(0015) #define blueoff PORTB&=~(1<<PORTB5)
(0016) #define greenon PORTB|=(1<<PORTB6)
(0017) #define greenoff PORTB&=~(1<<PORTB6)
(0018) #define redon PORTB|=(1<<PORTB7)
(0019) #define redoff PORTB&=~(1<<PORTB7)
(0020)
(0021) //SFR初始化.
(0022) void main_init(void)
(0023) {
(0024) DDRA=0xff; //A口设置为输出.
_main_init:
465 EF8F LDI R24,0xFF
466 BB8A OUT 0x1A,R24
(0025) PORTA=0x00;
467 2422 CLR R2
468 BA2B OUT 0x1B,R2
(0026) DDRB=0xff; //B口设置为输出.
469 BB87 OUT 0x17,R24
(0027) PORTB=0x00;
46A BA28 OUT 0x18,R2
(0028) // ASSR&=~(1<<AS2);
(0029) DDRC=0x00; //C口设置为输入.
46B BA24 OUT 0x14,R2
(0030) PORTC=0xff; //AVR没有上拉寄存器,在PORTC中写1即表示打开上拉了.
46C BB85 OUT 0x15,R24
(0031) DDRD=0x00; //D口设置为输入.
46D BA21 OUT 0x11,R2
(0032) PORTD=0xff; //打开D口上拉.
46E BB82 OUT 0x12,R24
46F 9508 RET
(0033) }
(0034)
(0035) void main_menu_initial(void) //LED主菜单初始化.
(0036) {
(0037) main_menu[0].menu_count=3; //有三个菜单项.
_main_menu_initial:
470 E083 LDI R24,3
471 9380 008F STS main_menu,R24
(0038) main_menu[0].display=blue;
473 EE8E LDI R24,0xEE
474 E092 LDI R25,2
475 9390 0091 STS main_menu+2,R25
477 9380 0090 STS main_menu+1,R24
(0039) main_menu[0].subs=NULL; //点亮兰灯
479 2422 CLR R2
47A 2433 CLR R3
47B 9230 0093 STS 0x0093,R3
47D 9220 0092 STS main_menu+3,R2
(0040) main_menu[0].children_menus=blue_menu;
47F E78D LDI R24,0x7D
480 E090 LDI R25,0
481 9390 0095 STS 0x0095,R25
483 9380 0094 STS 0x0094,R24
(0041) main_menu[0].parent_menus=NULL;
485 9230 0097 STS 0x0097,R3
487 9220 0096 STS 0x0096,R2
(0042)
(0043) main_menu[1].menu_count=3;
489 E083 LDI R24,3
48A 9380 0098 STS 0x0098,R24
(0044) main_menu[1].display=green; //点亮绿灯
48C EA8E LDI R24,0xAE
48D E093 LDI R25,3
48E 9390 009A STS 0x009A,R25
490 9380 0099 STS 0x0099,R24
(0045) main_menu[1].subs=NULL;
492 9230 009C STS 0x009C,R3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -