📄 lcd5110.lst
字号:
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 + -