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

📄 main.lst

📁 一个用于LCD的菜单模式界面的程序,如何实现滚屏.
💻 LST
📖 第 1 页 / 共 3 页
字号:
    020D C068      RJMP	0x0276
    020E 3D4D      CPI	R20,0xDD
    020F E0E0      LDI	R30,0
    0210 075E      CPC	R21,R30
    0211 F409      BNE	0x0213
    0212 C05B      RJMP	0x026E
    0213 3D4E      CPI	R20,0xDE
    0214 E0E0      LDI	R30,0
    0215 075E      CPC	R21,R30
    0216 F409      BNE	0x0218
    0217 C04E      RJMP	0x0266
    0218 ED8E      LDI	R24,0xDE
    0219 E090      LDI	R25,0
    021A 1784      CP	R24,R20
    021B 0795      CPC	R25,R21
    021C F164      BLT	0x0249
    021D 3747      CPI	R20,0x77
    021E E0E0      LDI	R30,0
    021F 075E      CPC	R21,R30
    0220 F409      BNE	0x0222
    0221 C060      RJMP	0x0282
    0222 374B      CPI	R20,0x7B
    0223 E0E0      LDI	R30,0
    0224 075E      CPC	R21,R30
    0225 F409      BNE	0x0227
    0226 C053      RJMP	0x027A
    0227 374D      CPI	R20,0x7D
    0228 E0E0      LDI	R30,0
    0229 075E      CPC	R21,R30
    022A F409      BNE	0x022C
    022B C046      RJMP	0x0272
    022C 374E      CPI	R20,0x7E
    022D E0E0      LDI	R30,0
    022E 075E      CPC	R21,R30
    022F F409      BNE	0x0231
    0230 C039      RJMP	0x026A
    0231 3747      CPI	R20,0x77
    0232 E0E0      LDI	R30,0
    0233 075E      CPC	R21,R30
    0234 F40C      BGE	0x0236
    0235 C04E      RJMP	0x0284
    0236 3B47      CPI	R20,0xB7
    0237 E0E0      LDI	R30,0
    0238 075E      CPC	R21,R30
    0239 F409      BNE	0x023B
    023A C045      RJMP	0x0280
    023B 3B4B      CPI	R20,0xBB
    023C E0E0      LDI	R30,0
    023D 075E      CPC	R21,R30
    023E F409      BNE	0x0240
    023F C038      RJMP	0x0278
    0240 3B4D      CPI	R20,0xBD
    0241 E0E0      LDI	R30,0
    0242 075E      CPC	R21,R30
    0243 F161      BEQ	0x0270
    0244 3B4E      CPI	R20,0xBE
    0245 E0E0      LDI	R30,0
    0246 075E      CPC	R21,R30
    0247 F101      BEQ	0x0268
    0248 C03B      RJMP	0x0284
    0249 3E47      CPI	R20,0xE7
    024A E0E0      LDI	R30,0
    024B 075E      CPC	R21,R30
    024C F179      BEQ	0x027C
    024D 3E4B      CPI	R20,0xEB
    024E E0E0      LDI	R30,0
    024F 075E      CPC	R21,R30
    0250 F119      BEQ	0x0274
    0251 3E4D      CPI	R20,0xED
    0252 E0E0      LDI	R30,0
    0253 075E      CPC	R21,R30
    0254 F0B9      BEQ	0x026C
    0255 3E4E      CPI	R20,0xEE
    0256 E0E0      LDI	R30,0
    0257 075E      CPC	R21,R30
    0258 F059      BEQ	0x0264
    0259 3E47      CPI	R20,0xE7
    025A E0E0      LDI	R30,0
    025B 075E      CPC	R21,R30
    025C F13C      BLT	0x0284
    025D 3F4F      CPI	R20,0xFF
    025E E0E0      LDI	R30,0
    025F 075E      CPC	R21,R30
    0260 F009      BEQ	0x0262
    0261 C022      RJMP	0x0284
(0027) 	{
(0028) 		case 0xff:return 0x00;
    0262 2700      CLR	R16
    0263 C021      RJMP	0x0285
(0029) 		case 0xee:return '0';
    0264 E300      LDI	R16,0x30
    0265 C01F      RJMP	0x0285
(0030) 		case 0xde:return '1';
    0266 E301      LDI	R16,0x31
    0267 C01D      RJMP	0x0285
(0031) 		case 0xbe:return '2';
    0268 E302      LDI	R16,0x32
    0269 C01B      RJMP	0x0285
(0032) 		case 0x7e:return '3';
    026A E303      LDI	R16,0x33
    026B C019      RJMP	0x0285
(0033) 		case 0xed:return '4';
    026C E304      LDI	R16,0x34
    026D C017      RJMP	0x0285
(0034) 		case 0xdd:return '5';
    026E E305      LDI	R16,0x35
    026F C015      RJMP	0x0285
(0035) 		case 0xbd:return '6';
    0270 E306      LDI	R16,0x36
    0271 C013      RJMP	0x0285
(0036) 		case 0x7d:return '7';
    0272 E307      LDI	R16,0x37
    0273 C011      RJMP	0x0285
(0037) 		case 0xeb:return '8';
    0274 E308      LDI	R16,0x38
    0275 C00F      RJMP	0x0285
(0038) 		case 0xdb:return '9';
    0276 E309      LDI	R16,0x39
    0277 C00D      RJMP	0x0285
(0039) 		case 0xbb:return 'A';
    0278 E401      LDI	R16,0x41
    0279 C00B      RJMP	0x0285
(0040) 		case 0x7b:return 'B';
    027A E402      LDI	R16,0x42
    027B C009      RJMP	0x0285
(0041) 		case 0xe7:return 'C';
    027C E403      LDI	R16,0x43
    027D C007      RJMP	0x0285
(0042) 		case 0xd7:return 'D';
    027E E404      LDI	R16,0x44
    027F C005      RJMP	0x0285
(0043) 		case 0xb7:return 'E';
    0280 E405      LDI	R16,0x45
    0281 C003      RJMP	0x0285
(0044) 		case 0x77:return 'F';
    0282 E406      LDI	R16,0x46
    0283 C001      RJMP	0x0285
(0045) 		default:return 0x00;
    0284 2700      CLR	R16
    0285 940E0460  CALL	pop_gset1
    0287 9508      RET
_get_key:
  i                    --> R20
    0288 940E045D  CALL	push_gset1
(0046) 	}
(0047) }
(0048) 
(0049) unsigned char get_key(void)
(0050) {
(0051) 	unsigned char i;
(0052) 	static unsigned char j;//按键记录
(0053) 	
(0054) 	i=key_read();
    028A DF63      RCALL	_key_read
    028B 2F40      MOV	R20,R16
(0055) 	if(i==0x00)	//无有效按键按下
    028C 2300      TST	R16
    028D F429      BNE	0x0293
(0056) 	{
(0057) 		j=0x00;	//清除按键记录
    028E 2422      CLR	R2
    028F 92200230  STS	j,R2
(0058) 		return 0x00; //程序退出
    0291 2700      CLR	R16
    0292 C011      RJMP	0x02A4
(0059) 	}
(0060) 	if(j==0x00) //为新按键
    0293 90200230  LDS	R2,j
    0295 2022      TST	R2
    0296 F461      BNE	0x02A3
(0061) 	{	
(0062) 		j=i; 	//保存本次结果
    0297 93400230  STS	j,R20
(0063) 		delay_nms(10); //延时去抖动
    0299 E00A      LDI	R16,0xA
    029A E010      LDI	R17,0
    029B DEB6      RCALL	_delay_nms
(0064) 		i=key_read();
    029C DF51      RCALL	_key_read
    029D 2F40      MOV	R20,R16
(0065) 		if(i==j)
    029E 90200230  LDS	R2,j
    02A0 1502      CP	R16,R2
    02A1 F409      BNE	0x02A3
(0066) 			return i;
    02A2 C001      RJMP	0x02A4
(0067) 	}
(0068) 	return 0x00;
    02A3 2700      CLR	R16
    02A4 940E0460  CALL	pop_gset1
    02A6 9508      RET
FILE: C:\DOCUME~1\Administrator\桌面\Menu\uart.h
(0001) 
(0002) 
(0003) #define BAUDRATE        9600	//波特率
(0004) #define F_CPU 			8000000
(0005) 
(0006) void init_USART(void);
(0007) void put_c(unsigned char c);
(0008) void put_s(unsigned char *ptr);
(0009) unsigned char get_c(void);
(0010) #ifndef __uart_h
(0011) #define __uart_h
(0012) void put_c(unsigned char c) 
(0013) {
(0014) 	while( !(UCSRA & (1<<UDRE)) );
_put_c:
  c                    --> R16
    02A7 9B5D      SBIS	0x0B,5
    02A8 CFFE      RJMP	_put_c
(0015) 	UDR=c;
    02A9 B90C      OUT	0x0C,R16
    02AA 9508      RET
_put_s:
  ptr                  --> R20
    02AB 940E045D  CALL	push_gset1
    02AD 01A8      MOVW	R20,R16
(0016) }
(0017) 
(0018) void put_s(unsigned char *ptr)
(0019) {
    02AE C004      RJMP	0x02B3
(0020) 	while (*ptr)
(0021) 	{
(0022) 		put_c(*ptr++);
    02AF 01FA      MOVW	R30,R20
    02B0 9101      LD	R16,Z+
    02B1 01AF      MOVW	R20,R30
    02B2 DFF4      RCALL	_put_c
    02B3 01FA      MOVW	R30,R20
    02B4 8020      LDD	R2,Z+0
    02B5 2022      TST	R2
    02B6 F7C1      BNE	0x02AF
(0023) 	}
(0024) 	put_c(0x0D);	  //换行
    02B7 E00D      LDI	R16,0xD
    02B8 DFEE      RCALL	_put_c
(0025) 	put_c(0x0A);  //回车
    02B9 E00A      LDI	R16,0xA
    02BA DFEC      RCALL	_put_c
    02BB 940E0460  CALL	pop_gset1
    02BD 9508      RET
(0026) }
(0027) 
(0028) unsigned char get_c(void)
(0029) {	while(!(UCSRA&(1<<RXC)));
_get_c:
    02BE 9B5F      SBIS	0x0B,7
    02BF CFFE      RJMP	_get_c
(0030) 	return UDR;
    02C0 B10C      IN	R16,0x0C
    02C1 9508      RET
(0031) }	
(0032) 
(0033) void init_USART(void)//USART 初始化
(0034) {
(0035) 
(0036)     //USART 9600 8, n,1  超级终端等也要设成同样的设置才能通讯
(0037)     UCSRC = (1<<URSEL) | 0x06;
_init_USART:
    02C2 E886      LDI	R24,0x86
    02C3 BD80      OUT	0x20,R24
(0038)     //异步,8位数据,无奇偶校验,一个停止位,无倍速  
(0039)     UBRRL= (F_CPU/BAUDRATE/16-1)%256;
    02C4 E383      LDI	R24,0x33
    02C5 B989      OUT	0x09,R24
(0040)     UBRRH= (F_CPU/BAUDRATE/16-1)/256;
    02C6 2422      CLR	R2
    02C7 BC20      OUT	0x20,R2
(0041)     UCSRA = 0x00;
    02C8 B82B      OUT	0x0B,R2
(0042)     UCSRB = (1<<RXEN)|(1<<TXEN);	//使能接收,使能发送
    02C9 E188      LDI	R24,0x18
    02CA B98A      OUT	0x0A,R24
    02CB 9508      RET
FILE: C:\DOCUME~1\Administrator\桌面\Menu\main.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "1602.h"
(0004) #include "key.h"
(0005) #include "uart.h"
(0006) 
(0007) 
(0008) 
(0009) 
(0010) /************************************************************** 
(0011) * 主函数 * 
(0012) **************************************************************/
(0013) 
(0014) 
(0015) void main(void)
(0016) {  
(0017)    LCD_init();
_main:
    02CC DE94      RCALL	_LCD_init
(0018)    init_USART();
    02CD DFF4      RCALL	_init_USART
(0019)    ShowMenu(); //欢迎界面显示
    02CE 940E02E7  CALL	_ShowMenu
    02D0 C004      RJMP	0x02D5
(0020)    while(1)
(0021)    {
(0022)    		Menu_Change(get_key());
    02D1 DFB6      RCALL	_get_key
    02D2 2711      CLR	R17
    02D3 940E033A  CALL	_Menu_Change
    02D5 CFFB      RJMP	0x02D1
    02D6 9508      RET
FILE: C:\DOCUME~1\Administrator\桌面\Menu\menu.c
(0001) 
(0002) 
(0003) #define Null 0
(0004) 
(0005) 
(0006) /*********************** 
(0007) * 函数声明 * 
(0008) ***********************/ 
(0009) void ShowMenu(void);
(0010) void Menu_Change(unsigned char KeyNum);
(0011) 
(0012) /*********************** 
(0013) * 按键功能键宏定义 * 
(0014) ***********************/ 
(0015) #define UP		   	'3'
(0016) #define Down		'7'
(0017) #define Esc			'B'
(0018) #define Enter		'F'
(0019) #define Reset		'0'
(0020) 
(0021) 
(0022) /********************** 
(0023) * 目录结构体定义 * 
(0024) **********************/ 
(0025) struct MenuItem
(0026) { 
(0027) unsigned char MenuCount; 		//当前层节点数
(0028) unsigned char *DisplayString; 	//菜单标题
(0029) void (*Subs)(); 			  	//节点函数
(0030) struct MenuItem *ChildrenMenus; //子节点
(0031) struct MenuItem *ParentMenus; 	//父节点
(0032) }; 
(0033) 
(0034) /*********************** 
(0035) * 调用子函数区 * 
(0036) ***********************/ 
(0037) void NullSubs(void) 
(0038) { 
_NullSubs:
    02D7 9508      RET
(0039) }
(0040) //----------------------以下为例子,请根据实际情况修改---------------------------
(0041) 
(0042) void TimeSet(void)
(0043) {
(0044)  put_s("TimeSet");
_TimeSet:
    02D8 E208      LDI	R16,0x28
    02D9 E012      LDI	R17,2
    02DA 940E02AB  CALL	_put_s
    02DC 9508      RET
(0045) }
(0046) 
(0047) void DateSet(void)
(0048) {
(0049) put_s("DateSet");
_DateSet:
    02DD E200      LDI	R16,0x20
    02DE E012      LDI	R17,2
    02DF 940E02AB  CALL	_put_s
    02E1 9508      RET
(0050) }
(0051) 
(0052) void AlertSet (void)
(0053) {
(0054) put_s("AlertSet");
_AlertSet:
    02E2 E107      LDI	R16,0x17
    02E3 E012      LDI	R17,2
    02E4 940E02AB  CALL	_put_s
    02E6 9508      RET
_ShowMenu:
  n                    --> R20
    02E7 940E045D  CALL	push_gset1
    02E9 9722      SBIW	R28,2
(0055) }
(0056) //------------------------------------------------------------------------------
(0057) 
(0058) 
(0059) 
(0060) 
(0061) 
(0062) 
(0063) /*********************** 
(0064) * 结构体区 * 
(0065) ***********************/ 
(0066) //----------------------以下为例子,请根据实际情况修改---------------------------
(0067) struct MenuItem TimeMenu[4];
(0068) struct MenuItem FlashMenu[5];
(0069) struct MenuItem VoiceMenu[5];
(0070) struct MenuItem RobotMenu[5];
(0071) struct MenuItem MainMenu[5];
(0072) 
(0073) struct MenuItem TimeMenu[4]=
(0074) {  //MenuCount		 DisplayString			 Subs				ChildrenMenus		ParentMenus
(0075) 	 {4, 			 "1.Time Set",			 TimeSet,			Null,				MainMenu},
(0076) 	 {4,			 "2.Date Set",		 	 DateSet,			Null,				MainMenu},
(0077) 	 {4,			 "3.AlertSet",		 	 AlertSet,			Null,				MainMenu},
(0078) 	 {4,  			 "4.Back",		 		 NullSubs,			MainMenu,			MainMenu},
(0079) };	
(0080) 
(0081) struct MenuItem FlashMenu[5]=
(0082) {  //MenuCount		 DisplayString			 Subs				ChildrenMenus		ParentMenus
(0083) 	 {5, 			 "1.Flash Record",		 NullSubs,			Null,				MainMenu},
(0084) 	 {5,			 "2.Play",		 	 	 NullSubs,			Null,				MainMenu},
(0085) 	 {5,			 "3.Pause",		 	 	 NullSubs,			Null,				MainMenu},
(0086) 	 {5,  			 "4.Flash Delete",		 NullSubs,			Null,				MainMenu},
(0087) 	 {5,			 "5.Back",				 NullSubs,			MainMenu,			MainMenu},
(0088) };	 
(0089) 
(0090) struct MenuItem VoiceMenu[5]=
(0091) {  //MenuCount		 DisplayString			 Subs				ChildrenMenus		ParentMenus
(0092) 	 {5, 			 "1.Voice Record"	,	 NullSubs,			Null,				MainMenu},
(0093) 	 {5,			 "2.Play",		 	 	 NullSubs,			Null,				MainMenu},
(0094) 	 {5,			 "3.Pause",		 	     NullSubs,			Null,				MainMenu},
(0095) 	 {5,  			 "4.Voice Delete",		 NullSubs,			Null,				MainMenu},
(0096)  	 {5,			 "5.Back",				 NullSubs,			MainMenu,			MainMenu},
(0097) };	 
(0098) 
(0099) struct MenuItem RobotMenu[5]=
(0100) {  //MenuCount		 DisplayString			 Subs				ChildrenMenus		ParentMenus
(0101) 	 {5, 			 "1.Turn Left",		 	 NullSubs,			Null,				MainMenu},
(0102) 	 {5,			 "2.Turn Right",		 NullSubs,			Null,				MainMenu},
(0103) 	 {5,			 "3.Go Ahead",		 	 NullSubs,			Null,				MainMenu},
(0104) 	 {5,  			 "4.Go Back",		 	 NullSubs,			Null,				MainMenu},
(0105) 	 {5,			 "5.Back",				 NullSubs,			MainMenu,			MainMenu},
(0106) };	 
(0107) 
(0108) 
(0109) struct MenuItem MainMenu[5]=
(0110) {  //MenuCount		 DisplayString			 Subs				ChildrenMenus		ParentMenus
(0111) 	 {5, 			 "1.Time Set"	,		 NullSubs,			TimeMenu,			Null},
(0112) 	 {5,			 "2.Voice Center",		 NullSubs,			VoiceMenu,			Null},
(0113) 	 {5,			 "3.Robot Control",		 NullSubs,			RobotMenu,			Null},

⌨️ 快捷键说明

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