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

📄 lcd5110.lst

📁 meg16 的所有功能实例
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0334 91800164  LDS	R24,key_one
    0336 3081      CPI	R24,1
    0337 F429      BNE	0x033D
(0157)      {
(0158) 	  DISP_task();						 //显示图形界面
    0338 940E0F77  CALL	_DISP_task
(0159)       key_one=0;						 //将显示关闭
    033A 2422      CLR	R2
    033B 92200164  STS	key_one,R2
(0160) 	 }
(0161) 	 
(0162)    //判断通关与否
(0163)    if((disp_buffer[4][1]==0x41)&(disp_buffer[4][2]==0x41))    //通过
    033D 9180015A  LDS	R24,0x15A
    033F 3481      CPI	R24,0x41
    0340 F421      BNE	0x0345
    0341 E081      LDI	R24,1
    0342 E090      LDI	R25,0
    0343 015C      MOVW	R10,R24
    0344 C002      RJMP	0x0347
    0345 24AA      CLR	R10
    0346 24BB      CLR	R11
    0347 9180015B  LDS	R24,0x15B
    0349 3481      CPI	R24,0x41
    034A F419      BNE	0x034E
    034B E061      LDI	R22,1
    034C E070      LDI	R23,0
    034D C002      RJMP	0x0350
    034E 2766      CLR	R22
    034F 2777      CLR	R23
    0350 0115      MOVW	R2,R10
    0351 2226      AND	R2,R22
    0352 2237      AND	R3,R23
    0353 2022      TST	R2
    0354 F419      BNE	0x0358
    0355 2033      TST	R3
    0356 F409      BNE	0x0358
    0357 CFBD      RJMP	0x0315
(0164)     {
(0165) 	 
(0166) 	 LCD_clear();											  //清屏
    0358 940E10DC  CALL	_LCD_clear
(0167)      LCD_write_String(0,5,15,"Congratulation!",0);			  //祝贺
    035A 2422      CLR	R2
    035B 2433      CLR	R3
    035C 823D      STD	Y+5,R3
    035D 822C      STD	Y+4,R2
    035E E18E      LDI	R24,0x1E
    035F E091      LDI	R25,1
    0360 839B      STD	Y+3,R25
    0361 838A      STD	Y+2,R24
    0362 E08F      LDI	R24,0xF
    0363 E090      LDI	R25,0
    0364 8399      STD	Y+1,R25
    0365 8388      STD	Y+0,R24
    0366 E025      LDI	R18,5
    0367 E030      LDI	R19,0
    0368 2700      CLR	R16
    0369 2711      CLR	R17
    036A 940E113C  CALL	_LCD_write_String
(0168) 	 LCD_write_String(0,4,5,"Wait!",0);						  //等待
    036C 2422      CLR	R2
    036D 2433      CLR	R3
    036E 823D      STD	Y+5,R3
    036F 822C      STD	Y+4,R2
    0370 E188      LDI	R24,0x18
    0371 E091      LDI	R25,1
    0372 839B      STD	Y+3,R25
    0373 838A      STD	Y+2,R24
    0374 E085      LDI	R24,5
    0375 E090      LDI	R25,0
    0376 8399      STD	Y+1,R25
    0377 8388      STD	Y+0,R24
    0378 E024      LDI	R18,4
    0379 E030      LDI	R19,0
    037A 2700      CLR	R16
    037B 2711      CLR	R17
    037C 940E113C  CALL	_LCD_write_String
(0169) 	 Delay_ms(10000);										  //延时
    037E E100      LDI	R16,0x10
    037F E217      LDI	R17,0x27
    0380 DEB1      RCALL	_Delay_ms
(0170) 	 guanshu++;												  //关数加1
    0381 9180015D  LDS	R24,guanshu
    0383 5F8F      SUBI	R24,0xFF
    0384 9380015D  STS	guanshu,R24
(0171) 	 if(guanshu==3)											  //达到最高关数就返回第一关
    0386 3083      CPI	R24,3
    0387 F419      BNE	0x038B
(0172) 	    guanshu=1;
    0388 E081      LDI	R24,1
    0389 9380015D  STS	guanshu,R24
(0173) 	 if(NUM_BEST>NUM_YOUR)									  //存储最好成绩
    038B 9020015E  LDS	R2,NUM_YOUR
    038D 9030015F  LDS	R3,NUM_YOUR+1
    038F 90400160  LDS	R4,NUM_BEST
    0391 90500161  LDS	R5,NUM_BEST+1
    0393 1424      CP	R2,R4
    0394 0435      CPC	R3,R5
    0395 F420      BCC	0x039A
(0174) 	    NUM_BEST=NUM_YOUR;
    0396 92300161  STS	NUM_BEST+1,R3
    0398 92200160  STS	NUM_BEST,R2
    039A CEB7      RJMP	0x0252
    039B 9626      ADIW	R28,6
    039C 9508      RET
(0175) 	 break;				  									  //跳出此关,进行下一关
(0176) 	}
(0177)   }
(0178)  }
(0179) }
(0180) //=======================================================================
(0181) //键盘初始化(采用定时扫描)
(0182) void key_init(void)
(0183) {
(0184)  key_ddr&=~all_key;
_key_init:
    039D B38A      IN	R24,0x1A
    039E 7087      ANDI	R24,7
    039F BB8A      OUT	0x1A,R24
(0185)  key_port|=all_key;
    03A0 B38B      IN	R24,0x1B
    03A1 6F88      ORI	R24,0xF8
    03A2 BB8B      OUT	0x1B,R24
(0186) 
(0187)  //t/c0初始化
(0188)  TCCR0=0X0D;
    03A3 E08D      LDI	R24,0xD
    03A4 BF83      OUT	0x33,R24
(0189)  TCNT0=0X00;
    03A5 2422      CLR	R2
    03A6 BE22      OUT	0x32,R2
(0190)  OCR0=0XF0;         //定时30ms
    03A7 EF80      LDI	R24,0xF0
    03A8 BF8C      OUT	0x3C,R24
(0191)  TIMSK|=0X02;
    03A9 B789      IN	R24,0x39
    03AA 6082      ORI	R24,2
    03AB BF89      OUT	0x39,R24
    03AC 9508      RET
(0192) }
(0193) 
(0194) //=======================================================================
(0195) //扫描程序(带去抖功能)
(0196) void read_keyboard(void)
(0197) {
(0198)  switch(key_state)
_read_keyboard:
    03AD 91000167  LDS	R16,key_state
    03AF 2711      CLR	R17
    03B0 3000      CPI	R16,0
    03B1 0701      CPC	R16,R17
    03B2 F049      BEQ	0x03BC
    03B3 3001      CPI	R16,1
    03B4 E0E0      LDI	R30,0
    03B5 071E      CPC	R17,R30
    03B6 F079      BEQ	0x03C6
    03B7 3002      CPI	R16,2
    03B8 E0E0      LDI	R30,0
    03B9 071E      CPC	R17,R30
    03BA F0F9      BEQ	0x03DA
    03BB C025      RJMP	0x03E1
(0199)  {
(0200)   case 0:
(0201)          if((key_pin&all_key)!=all_key)
    03BC B389      IN	R24,0x19
    03BD 7F88      ANDI	R24,0xF8
    03BE 3F88      CPI	R24,0xF8
    03BF F109      BEQ	0x03E1
(0202) 		    key_state++;
    03C0 91800167  LDS	R24,key_state
    03C2 5F8F      SUBI	R24,0xFF
    03C3 93800167  STS	key_state,R24
(0203) 		 break;
    03C5 C01B      RJMP	0x03E1
(0204)   case 1:
(0205)          if((key_pin&all_key)!=all_key)
    03C6 B389      IN	R24,0x19
    03C7 7F88      ANDI	R24,0xF8
    03C8 3F88      CPI	R24,0xF8
    03C9 F051      BEQ	0x03D4
(0206) 		    {
(0207) 			 key_state++;
    03CA 91800167  LDS	R24,key_state
    03CC 5F8F      SUBI	R24,0xFF
    03CD 93800167  STS	key_state,R24
(0208) 			 key_value=key_pin&all_key;
    03CF B389      IN	R24,0x19
    03D0 7F88      ANDI	R24,0xF8
    03D1 93800166  STS	key_value,R24
(0209) 			}
    03D3 C00D      RJMP	0x03E1
(0210) 		 else key_state--;
    03D4 91800167  LDS	R24,key_state
    03D6 5081      SUBI	R24,1
    03D7 93800167  STS	key_state,R24
(0211) 		 break;
    03D9 C007      RJMP	0x03E1
(0212)   case 2:
(0213)          if((key_pin&all_key)==all_key)
    03DA B389      IN	R24,0x19
    03DB 7F88      ANDI	R24,0xF8
    03DC 3F88      CPI	R24,0xF8
    03DD F419      BNE	0x03E1
(0214) 		    {key_state=0;
    03DE 2422      CLR	R2
    03DF 92200167  STS	key_state,R2
(0215) 			}
(0216) 		 break;
    03E1 9508      RET
_timer0comp:
    03E2 940E12BE  CALL	push_lset
(0217)  }
(0218)  
(0219) }
(0220) 
(0221) //=======================================================================
(0222) //定时中断,进行键盘扫描
(0223) #pragma interrupt_handler timer0comp:20
(0224) void timer0comp (void)
(0225) { 
(0226)  read_keyboard();
    03E4 DFC8      RCALL	_read_keyboard
    03E5 940E12D5  CALL	pop_lset
    03E7 9518      RETI
(0227) }
(0228) 
(0229) //=======================================================================
(0230) //键盘键值处理(有键被按下以后进行的处理)
(0231) void KBOD_task(void)
(0232) {
(0233)  
(0234)  if(key_value!=0)
_KBOD_task:
    03E8 90200166  LDS	R2,key_value
    03EA 2022      TST	R2
    03EB F411      BNE	0x03EE
    03EC 940C0F76  JMP	0xF76
(0235)  {
(0236)   switch(key_value)
    03EE 2D02      MOV	R16,R2
    03EF 2711      CLR	R17
    03F0 3D08      CPI	R16,0xD8
    03F1 E0E0      LDI	R30,0
    03F2 071E      CPC	R17,R30
    03F3 F411      BNE	0x03F6
    03F4 940C0F76  JMP	0xF76
    03F6 ED88      LDI	R24,0xD8
    03F7 E090      LDI	R25,0
    03F8 1780      CP	R24,R16
    03F9 0791      CPC	R25,R17
    03FA F08C      BLT	0x040C
    03FB 3708      CPI	R16,0x78
    03FC E0E0      LDI	R30,0
    03FD 071E      CPC	R17,R30
    03FE F101      BEQ	0x041F
    03FF 3708      CPI	R16,0x78
    0400 E0E0      LDI	R30,0
    0401 071E      CPC	R17,R30
    0402 F414      BGE	0x0405
    0403 940C0F76  JMP	0xF76
    0405 3B08      CPI	R16,0xB8
    0406 E0E0      LDI	R30,0
    0407 071E      CPC	R17,R30
    0408 F409      BNE	0x040A
    0409 C2FA      RJMP	0x0704
    040A 940C0F76  JMP	0xF76
    040C 3E08      CPI	R16,0xE8
    040D E0E0      LDI	R30,0
    040E 071E      CPC	R17,R30
    040F F409      BNE	0x0411
    0410 C5C6      RJMP	0x09D7
    0411 3E08      CPI	R16,0xE8
    0412 E0E0      LDI	R30,0
    0413 071E      CPC	R17,R30
    0414 F414      BGE	0x0417
    0415 940C0F76  JMP	0xF76
    0417 3F00      CPI	R16,0xF0
    0418 E0E0      LDI	R30,0
    0419 071E      CPC	R17,R30
    041A F411      BNE	0x041D
    041B 940C0CA8  JMP	0xCA8
    041D 940C0F76  JMP	0xF76
(0237)   {
(0238)    case Up:		   //向上键被按下
(0239)    		 if(key_last_value!=Enter)		  //判断是走局还是移动鼠标
    041F 91800165  LDS	R24,key_last_value
    0421 3D88      CPI	R24,0xD8
    0422 F069      BEQ	0x0430
(0240) 		   {
(0241) 		    if(X>0)X--;					  //鼠标向上移动
    0423 2422      CLR	R2
    0424 90300163  LDS	R3,X
    0426 1423      CP	R2,R3
    0427 F010      BCS	0x042A
    0428 940C0F76  JMP	0xF76
    042A 2D83      MOV	R24,R3
    042B 5081      SUBI	R24,1
    042C 93800163  STS	X,R24
(0242) 		   }
    042E 940C0F76  JMP	0xF76
(0243) 		 
(0244) 		 else		   					  //走局操作
(0245) 		   {
(0246) 		   if((disp_buffer[X][Y]&0xF0)==0x00)return;//如果移动的是空白,则跳出
    0430 90200163  LDS	R2,X
    0432 E084      LDI	R24,4
    0433 9D82      MUL	R24,R2
    0434 0110      MOVW	R2,R0
    0435 E489      LDI	R24,0x49
    0436 E091      LDI	R25,1
    0437 0E28      ADD	R2,R24
    0438 1E39      ADC	R3,R25
    0439 91E00162  LDS	R30,Y
    043B 27FF      CLR	R31
    043C 0DE2      ADD	R30,R2
    043D 1DF3      ADC	R31,R3
    043E 8180      LDD	R24,Z+0
    043F 7F80      ANDI	R24,0xF0
    0440 F411      BNE	0x0443
    0441 940C0F76  JMP	0xF76
(0247) 		   else if((disp_buffer[X][Y]&0xF0)==0x10)	//如果移动的是兵
    0443 90200163  LDS	R2,X
    0445 E084      LDI	R24,4
    0446 9D82      MUL	R24,R2
    0447 0110      MOVW	R2,R0
    0448 E489      LDI	R24,0x49
    0449 E091      LDI	R25,1
    044A 0E28      ADD	R2,R24
    044B 1E39      ADC	R3,R25
    044C 91E00162  LDS	R30,Y
    044E 27FF      CLR	R31
    044F 0DE2      ADD	R30,R2
    0450 1DF3      ADC	R31,R3
    0451 8180      LDD	R24,Z+0
    0452 7F80      ANDI	R24,0xF0
    0453 3180      CPI	R24,0x10
    0454 F009      BEQ	0x0456
    0455 C052      RJMP	0x04A8
(0248) 		   {
(0249) 		   if(X>0)
    0456 2422      CLR	R2
    0457 90300163  LDS	R3,X
    0459 1423      CP	R2,R3
    045A F010      BCS	0x045D
    045B 940C0F76  JMP	0xF76
(0250) 		   if(disp_buffer[X-1][Y]==0x00)
    045D 2C23      MOV	R2,R3
    045E E084      LDI	R24,4
    045F 9D82      MUL	R24,R2
    0460 0110      MOVW	R2,R0
    0461 E485      LDI	R24,0x45
    0462 E091      LDI	R25,1
    0463 0E28      ADD	R2,R24
    0464 1E39      ADC	R3,R25
    0465 91E00162  LDS	R30,Y
    0467 27FF      CLR	R31
    0468 0DE2      ADD	R30,R2
    0469 1DF3      ADC	R31,R3
    046A 8020      LDD	R2,Z+0
    046B 2022      TST	R2
    046C F011      BEQ	0x046F
    046D 940C0F76  JMP	0xF76
(0251) 		     {
(0252) 			 X--;
    046F 91800163  LDS	R24,X
    0471 5081      SUBI	R24,1
    0472 93800163  STS	X,R24
(0253) 			 disp_buffer[X][Y]=disp_buffer[X+1][Y];
    0474 2E28      MOV	R2,R24
    0475 E084      LDI	R24,4
    0476 9D82      MUL	R24,R2
    0477 E48D      LDI	R24,0x4D
    0478 E091      LDI	R25,1
    0479 0110      MOVW	R2,R0
    047A 0E28      ADD	R2,R24
    047B 1E39      ADC	R3,R25
    047C 91E00162  LDS	R30,Y
    047E 27FF      CLR	R31
    047F 0DE2      ADD	R30,R2
    0480 1DF3      ADC	R31,R3
    0481 8020      LDD	R2,Z+0
    0482 E489      LDI	R24,0x49
    0483 E091      LDI	R25,1
    0484 0120      MOVW	R4,R0
    0485 0E48      ADD	R4,R24
    0486 1E59      ADC	R5,R25
    0487 91E00162  LDS	R30,Y
    0489 27FF      CLR	R31
    048A 0DE4      ADD	R30,R4
    048B 1DF5      ADC	R31,R5
    048C 8220      STD	Z+0,R2
(0254) 			 disp_buffer[X+1][Y]=0x00;
    048D 90200163  LDS	R2,X
    048F E084      LDI	R24,4
    0490 9D82      MUL	R24,R2
    0491 0110      MOVW	R2,R0
    0492 E48D      LDI	R24,0x4D
    0493 E091      LDI	R25,1
    0494 0E28      ADD	R2,R24
    0495 1E39      ADC	R3,R25
    0496 91E00162  LDS	R30,Y
    0498 27FF      CLR	R31
    0499 0DE2      ADD	R30,R2
    049A 1DF3      ADC	R31,R3
    049B 2422      CLR	R2
    049C 8220      STD	Z+0,R2
(0255) 			 NUM_YOUR++;
    049D 9180015E  LDS	R24,NUM_YOUR
    049F 9190015F  LDS	R25,NUM_YOUR+1
    04A1 9601      ADIW	R24,1
    04A2 9390015F  STS	NUM_YOUR+1,R25
    04A4 9380015E  STS	NUM_YOUR,R24
(0256) 			 }
(0257) 		   }
    04A6 940C0F76  JMP	0xF76
(0258) 		   else if((disp_buffer[X][Y]&0xF0)==0x20) //如果移动的是竖将
    04A8 90200163  LDS	R2,X
    04AA E084      LDI	R24,4
    04AB 9D82      MUL	R24,R2
    04AC 0110      MOVW	R2,R0
    04AD E489      LDI	R24,0x49
    04AE E091      LDI	R25,1
    04AF 0E28      ADD	R2,R24
    04B0 1E39      ADC	R3,R25

⌨️ 快捷键说明

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