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

📄 main.lst

📁 一个用于LCD的菜单模式界面的程序,如何实现滚屏.
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0114) 	 {5,  			 "4.Flash Option",		 NullSubs,			FlashMenu,			Null},
(0115)  	 {5,			 "5.Back",				 NullSubs,			MainMenu,			MainMenu},
(0116) };	
(0117) //------------------------------------------------------------------------------
(0118) 
(0119) 
(0120) 
(0121) 
(0122) 
(0123) 
(0124) /*********************** 
(0125) * 全局变量声明区 * 
(0126) ***********************/ 
(0127) struct MenuItem (*MenuPoint) = MainMenu; //结构体指针,指向结构体后由内部函数指针指向功能函数
(0128) unsigned char DisplayStart = 0; //显示时的第一个菜单项
(0129) unsigned char UserChoose = 0;  	//用户所选菜单项
(0130) unsigned char DisplayPoint = 0; //显示指针
(0131) unsigned MaxItems; 		   	 	//同级最大菜单数
(0132) unsigned char ShowCount=2;		//同屏显示菜单数
(0133) 
(0134) 
(0135) /*********************** 
(0136) *显示函数区 * 
(0137) ***********************/ 
(0138) void ShowMenu(void) 
(0139) {
(0140)  	 unsigned char n;
(0141) 	 MaxItems = MenuPoint[0].MenuCount;//定义最大同级菜单
    02EA 91E00138  LDS	R30,MenuPoint
    02EC 91F00139  LDS	R31,MenuPoint+1
    02EE 8020      LDD	R2,Z+0
    02EF 2433      CLR	R3
    02F0 92300232  STS	MaxItems+1,R3
    02F2 92200231  STS	MaxItems,R2
(0142) 	 DisplayPoint = DisplayStart;
    02F4 9020013A  LDS	R2,DisplayStart
    02F6 9220013C  STS	DisplayPoint,R2
(0143) 	 for(n=0;DisplayPoint<MaxItems&&n<ShowCount;n++) 
    02F8 2744      CLR	R20
    02F9 C02E      RJMP	0x0328
(0144) 	 	{if(DisplayPoint==UserChoose)
    02FA 9020013B  LDS	R2,UserChoose
    02FC 9030013C  LDS	R3,DisplayPoint
    02FE 1432      CP	R3,R2
    02FF F451      BNE	0x030A
(0145) 		 		LCD_write_string(0,n,"->");
    0300 E38E      LDI	R24,0x3E
    0301 E091      LDI	R25,1
    0302 8399      STD	Y+1,R25
    0303 8388      STD	Y+0,R24
    0304 2F24      MOV	R18,R20
    0305 2733      CLR	R19
    0306 2700      CLR	R16
    0307 2711      CLR	R17
    0308 940E01CC  CALL	_LCD_write_string
(0146) 		 LCD_write_string(2,n,MenuPoint[DisplayPoint++].DisplayString);
    030A 9020013C  LDS	R2,DisplayPoint
    030C 2433      CLR	R3
    030D 2D82      MOV	R24,R2
    030E 5F8F      SUBI	R24,0xFF
    030F 9380013C  STS	DisplayPoint,R24
    0311 E009      LDI	R16,0x9
    0312 E010      LDI	R17,0
    0313 0191      MOVW	R18,R2
    0314 940E043F  CALL	empy16s
    0316 01F8      MOVW	R30,R16
    0317 90200138  LDS	R2,MenuPoint
    0319 90300139  LDS	R3,MenuPoint+1
    031B 0DE2      ADD	R30,R2
    031C 1DF3      ADC	R31,R3
    031D 8021      LDD	R2,Z+1
    031E 8032      LDD	R3,Z+2
    031F 8239      STD	Y+1,R3
    0320 8228      STD	Y+0,R2
    0321 2F24      MOV	R18,R20
    0322 2733      CLR	R19
    0323 E002      LDI	R16,2
    0324 E010      LDI	R17,0
    0325 940E01CC  CALL	_LCD_write_string
    0327 9543      INC	R20
    0328 90200231  LDS	R2,MaxItems
    032A 90300232  LDS	R3,MaxItems+1
    032C 9040013C  LDS	R4,DisplayPoint
    032E 2455      CLR	R5
    032F 1442      CP	R4,R2
    0330 0453      CPC	R5,R3
    0331 F420      BCC	0x0336
    0332 9020013D  LDS	R2,ShowCount
    0334 1542      CP	R20,R2
    0335 F220      BCS	0x02FA
    0336 9622      ADIW	R28,2
    0337 940E0460  CALL	pop_gset1
    0339 9508      RET
_Menu_Change:
  KeyNum               --> R20
    033A 940E045D  CALL	push_gset1
    033C 2F40      MOV	R20,R16
(0147) 		 
(0148) 	 	}
(0149) 
(0150) }
(0151) 
(0152) void Menu_Change(unsigned char KeyNum)
(0153) {
(0154) 		if(KeyNum)
    033D 2344      TST	R20
    033E F409      BNE	0x0340
    033F C0E4      RJMP	0x0424
(0155) 		{
(0156) 		   switch(KeyNum) 
    0340 2755      CLR	R21
    0341 3347      CPI	R20,0x37
    0342 E0E0      LDI	R30,0
    0343 075E      CPC	R21,R30
    0344 F409      BNE	0x0346
    0345 C053      RJMP	0x0399
    0346 E387      LDI	R24,0x37
    0347 E090      LDI	R25,0
    0348 1784      CP	R24,R20
    0349 0795      CPC	R25,R21
    034A F054      BLT	0x0355
    034B 3340      CPI	R20,0x30
    034C E0E0      LDI	R30,0
    034D 075E      CPC	R21,R30
    034E F409      BNE	0x0350
    034F C0A8      RJMP	0x03F8
    0350 3343      CPI	R20,0x33
    0351 E0E0      LDI	R30,0
    0352 075E      CPC	R21,R30
    0353 F081      BEQ	0x0364
    0354 C0AE      RJMP	0x0403
    0355 3442      CPI	R20,0x42
    0356 E0E0      LDI	R30,0
    0357 075E      CPC	R21,R30
    0358 F0B9      BEQ	0x0370
    0359 3442      CPI	R20,0x42
    035A E0E0      LDI	R30,0
    035B 075E      CPC	R21,R30
    035C F40C      BGE	0x035E
    035D C0A5      RJMP	0x0403
    035E 3446      CPI	R20,0x46
    035F E0E0      LDI	R30,0
    0360 075E      CPC	R21,R30
    0361 F409      BNE	0x0363
    0362 C04A      RJMP	0x03AD
    0363 C09F      RJMP	0x0403
(0157) 		   {		    
(0158) 		   				case UP: 
(0159) 							 UserChoose --; 
    0364 9180013B  LDS	R24,UserChoose
    0366 5081      SUBI	R24,1
    0367 9380013B  STS	UserChoose,R24
(0160) 							 if (UserChoose ==255)
    0369 3F8F      CPI	R24,0xFF
    036A F009      BEQ	0x036C
    036B C097      RJMP	0x0403
(0161) 							 { 
(0162) 							   	UserChoose = 0;//上翻截至,如果要回滚赋值MaxItems-1
    036C 2422      CLR	R2
    036D 9220013B  STS	UserChoose,R2
(0163) 							 } 
(0164) 							 break; 
    036F C093      RJMP	0x0403
(0165) 						case Esc: 
(0166) 							 if (MenuPoint[UserChoose].ParentMenus != Null) 
    0370 9020013B  LDS	R2,UserChoose
    0372 E089      LDI	R24,0x9
    0373 9D82      MUL	R24,R2
    0374 01F0      MOVW	R30,R0
    0375 90200138  LDS	R2,MenuPoint
    0377 90300139  LDS	R3,MenuPoint+1
    0379 0DE2      ADD	R30,R2
    037A 1DF3      ADC	R31,R3
    037B 8027      LDD	R2,Z+7
    037C 8430      LDD	R3,Z+8
    037D 2022      TST	R2
    037E F419      BNE	0x0382
    037F 2033      TST	R3
    0380 F409      BNE	0x0382
    0381 C081      RJMP	0x0403
(0167) 							 { 
(0168) 							   	MenuPoint = MenuPoint[UserChoose].ParentMenus; 
    0382 9020013B  LDS	R2,UserChoose
    0384 E089      LDI	R24,0x9
    0385 9D82      MUL	R24,R2
    0386 01F0      MOVW	R30,R0
    0387 90200138  LDS	R2,MenuPoint
    0389 90300139  LDS	R3,MenuPoint+1
    038B 0DE2      ADD	R30,R2
    038C 1DF3      ADC	R31,R3
    038D 8027      LDD	R2,Z+7
    038E 8430      LDD	R3,Z+8
    038F 92300139  STS	MenuPoint+1,R3
    0391 92200138  STS	MenuPoint,R2
(0169) 								UserChoose = 0; 
    0393 2422      CLR	R2
    0394 9220013B  STS	UserChoose,R2
(0170) 								DisplayStart = 0; 
    0396 9220013A  STS	DisplayStart,R2
(0171) 							} 
(0172) 							break; 
    0398 C06A      RJMP	0x0403
(0173) 						case Down: 
(0174) 							 UserChoose ++; 
    0399 9180013B  LDS	R24,UserChoose
    039B 5F8F      SUBI	R24,0xFF
    039C 9380013B  STS	UserChoose,R24
(0175) 							 if (UserChoose == MaxItems) 
    039E 90200231  LDS	R2,MaxItems
    03A0 90300232  LDS	R3,MaxItems+1
    03A2 2E48      MOV	R4,R24
    03A3 2455      CLR	R5
    03A4 1442      CP	R4,R2
    03A5 0453      CPC	R5,R3
    03A6 F009      BEQ	0x03A8
    03A7 C05B      RJMP	0x0403
(0176) 							 { 
(0177) 							   UserChoose = MaxItems-1;//下翻截至,如要回滚赋值为0 
    03A8 01C1      MOVW	R24,R2
    03A9 9701      SBIW	R24,1
    03AA 9380013B  STS	UserChoose,R24
(0178) 							 } 
(0179) 							 break; 
    03AC C056      RJMP	0x0403
(0180) 						case Enter: 
(0181) 							 if (MenuPoint[UserChoose].Subs != NullSubs) 
    03AD 9020013B  LDS	R2,UserChoose
    03AF E089      LDI	R24,0x9
    03B0 9D82      MUL	R24,R2
    03B1 01F0      MOVW	R30,R0
    03B2 90200138  LDS	R2,MenuPoint
    03B4 90300139  LDS	R3,MenuPoint+1
    03B6 0DE2      ADD	R30,R2
    03B7 1DF3      ADC	R31,R3
    03B8 8023      LDD	R2,Z+3
    03B9 8034      LDD	R3,Z+4
    03BA E584      LDI	R24,0x54
    03BB E090      LDI	R25,0
    03BC 1628      CP	R2,R24
    03BD 0639      CPC	R3,R25
    03BE F089      BEQ	0x03D0
(0182) 							 { 
(0183) 							   (*MenuPoint[UserChoose].Subs)(); 
    03BF 9020013B  LDS	R2,UserChoose
    03C1 E089      LDI	R24,0x9
    03C2 9D82      MUL	R24,R2
    03C3 01F0      MOVW	R30,R0
    03C4 90200138  LDS	R2,MenuPoint
    03C6 90300139  LDS	R3,MenuPoint+1
    03C8 0DE2      ADD	R30,R2
    03C9 1DF3      ADC	R31,R3
    03CA 81A3      LDD	R26,Z+3
    03CB 81B4      LDD	R27,Z+4
    03CC 01FD      MOVW	R30,R26
    03CD 940E0474  CALL	xicall
(0184) 							 } 
    03CF C033      RJMP	0x0403
(0185) 							 else if (MenuPoint[UserChoose].ChildrenMenus != Null) 
    03D0 9020013B  LDS	R2,UserChoose
    03D2 E089      LDI	R24,0x9
    03D3 9D82      MUL	R24,R2
    03D4 01F0      MOVW	R30,R0
    03D5 90200138  LDS	R2,MenuPoint
    03D7 90300139  LDS	R3,MenuPoint+1
    03D9 0DE2      ADD	R30,R2
    03DA 1DF3      ADC	R31,R3
    03DB 8025      LDD	R2,Z+5
    03DC 8036      LDD	R3,Z+6
    03DD 2022      TST	R2
    03DE F411      BNE	0x03E1
    03DF 2033      TST	R3
    03E0 F111      BEQ	0x0403
(0186) 							 { 
(0187) 							   MenuPoint = MenuPoint[UserChoose].ChildrenMenus; 
    03E1 9020013B  LDS	R2,UserChoose
    03E3 E089      LDI	R24,0x9
    03E4 9D82      MUL	R24,R2
    03E5 01F0      MOVW	R30,R0
    03E6 90200138  LDS	R2,MenuPoint
    03E8 90300139  LDS	R3,MenuPoint+1
    03EA 0DE2      ADD	R30,R2
    03EB 1DF3      ADC	R31,R3
    03EC 8025      LDD	R2,Z+5
    03ED 8036      LDD	R3,Z+6
    03EE 92300139  STS	MenuPoint+1,R3
    03F0 92200138  STS	MenuPoint,R2
(0188) 							   UserChoose = 0; 
    03F2 2422      CLR	R2
    03F3 9220013B  STS	UserChoose,R2
(0189) 							   DisplayStart = 0; 
    03F5 9220013A  STS	DisplayStart,R2
(0190) 							 } 
(0191) 							 break; 
    03F7 C00B      RJMP	0x0403
(0192) 					   case Reset: 
(0193) 					   		MenuPoint = MainMenu; 
    03F8 E08B      LDI	R24,0xB
    03F9 E091      LDI	R25,1
    03FA 93900139  STS	MenuPoint+1,R25
    03FC 93800138  STS	MenuPoint,R24
(0194) 							UserChoose = 0; 
    03FE 2422      CLR	R2
    03FF 9220013B  STS	UserChoose,R2
(0195) 							DisplayStart = 0; 
    0401 9220013A  STS	DisplayStart,R2
(0196) 							break; 
(0197) 					   default:break;
(0198) 			}
(0199) 			if (UserChoose%ShowCount==0)           //一屏只能显示ShowCount行
    0403 9110013D  LDS	R17,ShowCount
    0405 9100013B  LDS	R16,UserChoose
    0407 940E0427  CALL	mod8u
    0409 2300      TST	R16
    040A F429      BNE	0x0410
(0200) 			  DisplayStart = UserChoose;
    040B 9020013B  LDS	R2,UserChoose
    040D 9220013A  STS	DisplayStart,R2
    040F C00B      RJMP	0x041B
(0201) 			else if(UserChoose==1||UserChoose== 3)
    0410 9180013B  LDS	R24,UserChoose
    0412 3081      CPI	R24,1
    0413 F011      BEQ	0x0416
    0414 3083      CPI	R24,3
    0415 F429      BNE	0x041B
(0202) 			   DisplayStart = UserChoose-1;		   //实现滚屏的关键				 
    0416 9180013B  LDS	R24,UserChoose
    0418 5081      SUBI	R24,1
    0419 9380013A  STS	DisplayStart,R24
(0203) 			LCD_write_command(0x01);			   //液晶清屏,根据不同液晶函数自行修改
    041B E001      LDI	R16,1
    041C E010      LDI	R17,0
    041D 940E017C  CALL	_LCD_write_command
(0204) 			delay_nms(5);						   //液晶为慢速器件
    041F E005      LDI	R16,5
    0420 E010      LDI	R17,0
    0421 940E0152  CALL	_delay_nms
(0205) 			ShowMenu(); 
    0423 DEC3      RCALL	_ShowMenu
(0206) 		}
FILE: <library>
    0424 940E0460  CALL	pop_gset1
    0426 9508      RET
mod8u:
    0427 9468      BSET	6
    0428 C001      RJMP	xdiv8u
div8u:
    0429 94E8      BCLR	6
xdiv8u:
    042A 932A      ST	R18,-Y
    042B 92FA      ST	R15,-Y
    042C 92EA      ST	R14,-Y
    042D 24FF      CLR	R15
    042E 24EE      CLR	R14
    042F E120      LDI	R18,0x10
    0430 0F00      LSL	R16
    0431 1CFF      ROL	R15
    0432 1CEE      ROL	R14
    0433 16E1      CP	R14,R17
    0434 F010      BCS	0x0437
    0435 1AE1      SUB	R14,R17
    0436 9503      INC	R16
    0437 952A      DEC	R18
    0438 F7B9      BNE	0x0430
    0439 F40E      BRTC	0x043B
    043A 2D0E      MOV	R16,R14
    043B 90E9      LD	R14,Y+
    043C 90F9      LD	R15,Y+
    043D 9129      LD	R18,Y+
    043E 9508      RET
empy16s:
    043F 920A      ST	R0,-Y
    0440 921A      ST	R1,-Y
    0441 938A      ST	R24,-Y
    0442 939A      ST	R25,-Y
    0443 9F02      MUL	R16,R18
    0444 01C0      MOVW	R24,R0
    0445 9F12      MUL	R17,R18
    0446 0D90      ADD	R25,R0
    0447 9F03      MUL	R16,R19
    0448 0D90      ADD	R25,R0
    0449 018C      MOVW	R16,R24
    044A 9199      LD	R25,Y+
    044B 9189      LD	R24,Y+
    044C 9019      LD	R1,Y+
    044D 9009      LD	R0,Y+
    044E 9508      RET
pop_gset2:
    044F E0E2      LDI	R30,2
    0450 940C0461  JMP	pop
pop_gset3:
    0452 E0E4      LDI	R30,4
    0453 940C0461  JMP	pop
push_gset5:
    0455 92FA      ST	R15,-Y
    0456 92EA      ST	R14,-Y
push_gset4:
    0457 92DA      ST	R13,-Y
    0458 92CA      ST	R12,-Y
push_gset3:
    0459 92BA      ST	R11,-Y
    045A 92AA      ST	R10,-Y
push_gset2:
    045B 937A      ST	R23,-Y
    045C 936A      ST	R22,-Y
push_gset1:
    045D 935A      ST	R21,-Y
    045E 934A      ST	R20,-Y
    045F 9508      RET
pop_gset1:
    0460 E0E1      LDI	R30,1
pop:
    0461 9149      LD	R20,Y+
    0462 9159      LD	R21,Y+
    0463 FDE0      SBRC	R30,0
    0464 9508      RET
    0465 9169      LD	R22,Y+
    0466 9179      LD	R23,Y+
    0467 FDE1      SBRC	R30,1
    0468 9508      RET
    0469 90A9      LD	R10,Y+
    046A 90B9      LD	R11,Y+
    046B FDE2      SBRC	R30,2
    046C 9508      RET
    046D 90C9      LD	R12,Y+
    046E 90D9      LD	R13,Y+
    046F FDE3      SBRC	R30,3
    0470 9508      RET
    0471 90E9      LD	R14,Y+
    0472 90F9      LD	R15,Y+
    0473 9508      RET
xicall:
    0474 920A      ST	R0,-Y
    0475 95C8      LPM
    0476 920A      ST	R0,-Y
    0477 9631      ADIW	R30,1
    0478 95C8      LPM
    0479 2DF0      MOV	R31,R0
    047A 91E9      LD	R30,Y+
    047B 9009      LD	R0,Y+
    047C 9409      IJMP

⌨️ 快捷键说明

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