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

📄 ledmenu_icc.lst

📁 做点阵式lcd多级菜单开发的一个例子 可以帮助初学者了解 交互式界面简单设计的部分
💻 LST
📖 第 1 页 / 共 4 页
字号:
(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 + -