📄 lcd5110.lst
字号:
__start:
__text_start:
0207 E5CF LDI R28,0x5F
0208 E0D4 LDI R29,4
0209 BFCD OUT 0x3D,R28
020A BFDE OUT 0x3E,R29
020B 51C0 SUBI R28,0x10
020C 40D0 SBCI R29,0
020D EA0A LDI R16,0xAA
020E 8308 STD Y+0,R16
020F 2400 CLR R0
0210 E4E9 LDI R30,0x49
0211 E0F1 LDI R31,1
0212 E011 LDI R17,1
0213 36E8 CPI R30,0x68
0214 07F1 CPC R31,R17
0215 F011 BEQ 0x0218
0216 9201 ST R0,Z+
0217 CFFB RJMP 0x0213
0218 8300 STD Z+0,R16
0219 E2E4 LDI R30,0x24
021A E0F3 LDI R31,3
021B E6A0 LDI R26,0x60
021C E0B0 LDI R27,0
021D E014 LDI R17,4
021E 30ED CPI R30,0xD
021F 07F1 CPC R31,R17
0220 F021 BEQ 0x0225
0221 95C8 LPM
0222 9631 ADIW R30,1
0223 920D ST R0,X+
0224 CFF9 RJMP 0x021E
0225 940E0243 CALL _main
_exit:
0227 CFFF RJMP _exit
FILE: E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏\main.c
(0001) #include <iom16v.h>
(0002) #include <MACROS.h>
(0003) #include "Define.h"
(0004) #include "5110.h"
(0005)
(0006) //=======================================================================
(0007) //=======================================================================
(0008) //按键I/O口定义
(0009) #define key_ddr DDRA
(0010) #define key_port PORTA
(0011) #define key_pin PINA
(0012)
(0013) //=======================================================================
(0014) //按键键值定义
(0015) #define all_key 0xF8
(0016)
(0017) #define Up 0x78 //7
(0018) #define Right 0xB8 //6
(0019) #define Enter 0xD8 //5
(0020) #define Left 0xE8 //4
(0021) #define Down 0xF0 //3
(0022) extern const uint8 font6x8[][6]; //LCD字符显示码表声明
(0023)
(0024) uint8 key_state; //按键状态
(0025) uint8 key_value; //按键返回值
(0026) uint8 key_last_value; //上次按键返回值
(0027) uint8 key_one; //处理按键后是否完成一次显示
(0028)
(0029) uint8 X; //鼠标X轴
(0030) uint8 Y; //鼠标Y轴
(0031)
(0032) uint16 NUM_BEST; //最好步数
(0033) uint16 NUM_YOUR; //走的步数
(0034)
(0035) uint8 guanshu; //第几局
(0036) uint8 disp_buffer[5][4]; //显示缓存区
(0037)
(0038)
(0039) uint8 disp1_buffer[5][4]={ //第一局开局棋子布局
(0040) {0x11,0x41,0x41,0x13},
(0041) {0x12,0x41,0x41,0x14},
(0042) {0x21,0x31,0x31,0x24},
(0043) {0x21,0x22,0x23,0x24},
(0044) {0x00,0x22,0x23,0x00},
(0045) };
(0046) uint8 disp2_buffer[5][4]={ //第二局开局棋子布局
(0047) {0x11,0x41,0x41,0x13},
(0048) {0x12,0x41,0x41,0x14},
(0049) {0x31,0x31,0x32,0x32},
(0050) {0x33,0x33,0x34,0x34},
(0051) {0x00,0x35,0x35,0x00},
(0052) };
(0053)
(0054)
(0055) //=======================================================================
(0056) //延时函数
(0057) void Delay_us(uint16 time)
(0058) {while (time--)
_Delay_us:
time --> R16
0228 C001 RJMP 0x022A
(0059) _WDR();
0229 95A8 WDR
022A 0118 MOVW R2,R16
022B 5001 SUBI R16,1
022C 4010 SBCI R17,0
022D 2022 TST R2
022E F7D1 BNE 0x0229
022F 2033 TST R3
0230 F7C1 BNE 0x0229
0231 9508 RET
_Delay_ms:
time --> R20
0232 940E12A7 CALL push_gset1
0234 01A8 MOVW R20,R16
(0060)
(0061) }
(0062) void Delay_ms(uint16 time)
(0063) {while (time--)
0235 C003 RJMP 0x0239
(0064) Delay_us(1200);
0236 EB00 LDI R16,0xB0
0237 E014 LDI R17,4
0238 DFEF RCALL _Delay_us
0239 011A MOVW R2,R20
023A 5041 SUBI R20,1
023B 4050 SBCI R21,0
023C 2022 TST R2
023D F7C1 BNE 0x0236
023E 2033 TST R3
023F F7B1 BNE 0x0236
0240 940E12AA CALL pop_gset1
0242 9508 RET
_main:
i --> R20
j --> R22
0243 9726 SBIW R28,6
(0065) }
(0066)
(0067)
(0068) //=======================================================================
(0069) //主函数
(0070) void main(void)
(0071) {
(0072) uint8 i,j;
(0073) guanshu=1;
0244 E081 LDI R24,1
0245 9380015D STS guanshu,R24
(0074) NUM_BEST=100;
0247 E684 LDI R24,0x64
0248 E090 LDI R25,0
0249 93900161 STS NUM_BEST+1,R25
024B 93800160 STS NUM_BEST,R24
(0075)
(0076) SETBIT(DDRC,BACKLED_EN); //配置背光控制端口
024D 9AA7 SBI 0x14,7
(0077) CLEARBIT(PORTC,BACKLED_EN); //使能背光
024E 98AF CBI 0x15,7
(0078)
(0079) LCD_init(); //初始化LCD模块
024F 940E10BF CALL _LCD_init
0251 C148 RJMP 0x039A
(0080)
(0081) while(1) //总循环
(0082) {
(0083) LCD_clear(); //清屏
0252 940E10DC CALL _LCD_clear
(0084)
(0085) //显示数据界面
(0086) LCD_write_String(34,0,8,"YOUR:000",0);
0254 2422 CLR R2
0255 2433 CLR R3
0256 823D STD Y+5,R3
0257 822C STD Y+4,R2
0258 E480 LDI R24,0x40
0259 E091 LDI R25,1
025A 839B STD Y+3,R25
025B 838A STD Y+2,R24
025C E088 LDI R24,0x8
025D E090 LDI R25,0
025E 8399 STD Y+1,R25
025F 8388 STD Y+0,R24
0260 2722 CLR R18
0261 2733 CLR R19
0262 E202 LDI R16,0x22
0263 E010 LDI R17,0
0264 940E113C CALL _LCD_write_String
(0087) LCD_write_String(34,1,8,"BEST:000",0);
0266 2422 CLR R2
0267 2433 CLR R3
0268 823D STD Y+5,R3
0269 822C STD Y+4,R2
026A E387 LDI R24,0x37
026B E091 LDI R25,1
026C 839B STD Y+3,R25
026D 838A STD Y+2,R24
026E E088 LDI R24,0x8
026F E090 LDI R25,0
0270 8399 STD Y+1,R25
0271 8388 STD Y+0,R24
0272 E021 LDI R18,1
0273 E030 LDI R19,0
0274 E202 LDI R16,0x22
0275 E010 LDI R17,0
0276 940E113C CALL _LCD_write_String
(0088) LCD_write_String(34,3,8,"GUAN:001",0);
0278 2422 CLR R2
0279 2433 CLR R3
027A 823D STD Y+5,R3
027B 822C STD Y+4,R2
027C E28E LDI R24,0x2E
027D E091 LDI R25,1
027E 839B STD Y+3,R25
027F 838A STD Y+2,R24
0280 E088 LDI R24,0x8
0281 E090 LDI R25,0
0282 8399 STD Y+1,R25
0283 8388 STD Y+0,R24
0284 E023 LDI R18,3
0285 E030 LDI R19,0
0286 E202 LDI R16,0x22
0287 E010 LDI R17,0
0288 940E113C CALL _LCD_write_String
(0089)
(0090) NUMdisp_task(NUM_BEST,1); //显示最好成绩
028A E021 LDI R18,1
028B E030 LDI R19,0
028C 91000160 LDS R16,NUM_BEST
028E 91100161 LDS R17,NUM_BEST+1
0290 940E1060 CALL _NUMdisp_task
(0091) NUMdisp_task(guanshu,3); //显示第几关
0292 E023 LDI R18,3
0293 E030 LDI R19,0
0294 9100015D LDS R16,guanshu
0296 2711 CLR R17
0297 940E1060 CALL _NUMdisp_task
(0092)
(0093) //一切变量都重新初始化
(0094) key_init();
0299 D103 RCALL _key_init
(0095) key_state=0;
029A 2422 CLR R2
029B 92200167 STS key_state,R2
(0096) key_value=0;
029D 92200166 STS key_value,R2
(0097) key_last_value=0;
029F 92200165 STS key_last_value,R2
(0098) key_one=1;
02A1 E081 LDI R24,1
02A2 93800164 STS key_one,R24
(0099) X=0;
02A4 92200163 STS X,R2
(0100) Y=0;
02A6 92200162 STS Y,R2
(0101) NUM_YOUR=0;
02A8 2433 CLR R3
02A9 9230015F STS NUM_YOUR+1,R3
02AB 9220015E STS NUM_YOUR,R2
(0102) SEI(); //全局中断使能
02AD 9478 BSET 7
02AE C020 RJMP 0x02CF
(0103) while(1) //选关
(0104) {
(0105)
(0106) if(key_value==Down)
02AF 91800166 LDS R24,key_value
02B1 3F80 CPI R24,0xF0
02B2 F4A1 BNE 0x02C7
(0107) {
(0108) key_value=0;
02B3 2422 CLR R2
02B4 92200166 STS key_value,R2
(0109) guanshu++;
02B6 9180015D LDS R24,guanshu
02B8 5F8F SUBI R24,0xFF
02B9 9380015D STS guanshu,R24
(0110) if(guanshu==3)
02BB 3083 CPI R24,3
02BC F419 BNE 0x02C0
(0111) guanshu=1;
02BD E081 LDI R24,1
02BE 9380015D STS guanshu,R24
(0112) NUMdisp_task(guanshu,3);
02C0 E023 LDI R18,3
02C1 E030 LDI R19,0
02C2 9100015D LDS R16,guanshu
02C4 2711 CLR R17
02C5 940E1060 CALL _NUMdisp_task
(0113) }
(0114) if(key_value==Enter) //按确定选关完成
02C7 91800166 LDS R24,key_value
02C9 3D88 CPI R24,0xD8
02CA F421 BNE 0x02CF
(0115) {
(0116) key_value=0;
02CB 2422 CLR R2
02CC 92200166 STS key_value,R2
(0117) break;
02CE C001 RJMP 0x02D0
02CF CFDF RJMP 0x02AF
(0118) }
(0119) }
(0120)
(0121) //将选择的局载入显示缓存区
(0122) if(guanshu==1)
02D0 9180015D LDS R24,guanshu
02D2 3081 CPI R24,1
02D3 F509 BNE 0x02F5
(0123) {
(0124) for(i=0;i<5;i++)
02D4 2744 CLR R20
02D5 C01C RJMP 0x02F2
(0125) for(j=0;j<4;j++)
02D6 2766 CLR R22
02D7 C017 RJMP 0x02EF
(0126) {
(0127) disp_buffer[i][j]=disp1_buffer[i][j];
02D8 E084 LDI R24,4
02D9 9F84 MUL R24,R20
02DA EF80 LDI R24,0xF0
02DB E090 LDI R25,0
02DC 0110 MOVW R2,R0
02DD 0E28 ADD R2,R24
02DE 1E39 ADC R3,R25
02DF 2FE6 MOV R30,R22
02E0 27FF CLR R31
02E1 0DE2 ADD R30,R2
02E2 1DF3 ADC R31,R3
02E3 8020 LDD R2,Z+0
02E4 E489 LDI R24,0x49
02E5 E091 LDI R25,1
02E6 0120 MOVW R4,R0
02E7 0E48 ADD R4,R24
02E8 1E59 ADC R5,R25
02E9 2FE6 MOV R30,R22
02EA 27FF CLR R31
02EB 0DE4 ADD R30,R4
02EC 1DF5 ADC R31,R5
02ED 8220 STD Z+0,R2
02EE 9563 INC R22
02EF 3064 CPI R22,4
02F0 F338 BCS 0x02D8
02F1 9543 INC R20
02F2 3045 CPI R20,5
02F3 F310 BCS 0x02D6
(0128) }
(0129) }
02F4 C020 RJMP 0x0315
(0130) else
(0131) {
(0132) for(i=0;i<5;i++)
02F5 2744 CLR R20
02F6 C01C RJMP 0x0313
(0133) for(j=0;j<4;j++)
02F7 2766 CLR R22
02F8 C017 RJMP 0x0310
(0134) {
(0135) disp_buffer[i][j]=disp2_buffer[i][j];
02F9 E084 LDI R24,4
02FA 9F84 MUL R24,R20
02FB E084 LDI R24,4
02FC E091 LDI R25,1
02FD 0110 MOVW R2,R0
02FE 0E28 ADD R2,R24
02FF 1E39 ADC R3,R25
0300 2FE6 MOV R30,R22
0301 27FF CLR R31
0302 0DE2 ADD R30,R2
0303 1DF3 ADC R31,R3
0304 8020 LDD R2,Z+0
0305 E489 LDI R24,0x49
0306 E091 LDI R25,1
0307 0120 MOVW R4,R0
0308 0E48 ADD R4,R24
0309 1E59 ADC R5,R25
030A 2FE6 MOV R30,R22
030B 27FF CLR R31
030C 0DE4 ADD R30,R4
030D 1DF5 ADC R31,R5
030E 8220 STD Z+0,R2
030F 9563 INC R22
0310 3064 CPI R22,4
0311 F338 BCS 0x02F9
0312 9543 INC R20
0313 3045 CPI R20,5
0314 F310 BCS 0x02F7
(0136) }
(0137) }
(0138)
(0139) //开始闯关
(0140) for(;;)
(0141) {
(0142) //显示鼠标
(0143) LCD_set_XY(Y*8+3,X);//设置初始位置
0315 91200163 LDS R18,X
0317 90200162 LDS R2,Y
0319 E088 LDI R24,0x8
031A 9D82 MUL R24,R2
031B 2D00 MOV R16,R0
031C 5F0D SUBI R16,0xFD
031D 940E10FD CALL _LCD_set_XY
(0144) LCD_write_byte(0x3c,1);
031F E021 LDI R18,1
0320 E30C LDI R16,0x3C
0321 940E1216 CALL _LCD_write_byte
(0145) LCD_write_byte(0x3c,1);
0323 E021 LDI R18,1
0324 E30C LDI R16,0x3C
0325 940E1216 CALL _LCD_write_byte
(0146) KBOD_task(); //按键操作处理
0327 D0C0 RCALL _KBOD_task
(0147)
(0148) if(key_value!=0)
0328 90200166 LDS R2,key_value
032A 2022 TST R2
032B F041 BEQ 0x0334
(0149) {
(0150)
(0151) key_last_value=key_value; //将上次的键值存起来
032C 92200165 STS key_last_value,R2
(0152) key_value=0; //将当前键值清零
032E 2422 CLR R2
032F 92200166 STS key_value,R2
(0153) key_one=1; //将显示打开
0331 E081 LDI R24,1
0332 93800164 STS key_one,R24
(0154) }
(0155)
(0156) if(key_one==1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -