📄 main.s
字号:
_disp1_buffer::
.blkb 2
.area idata
.byte 17,'A
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏/5110.h
.blkb 2
.area idata
.byte 'A,19
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏/5110.h
.blkb 2
.area idata
.byte 18,'A
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏/5110.h
.blkb 2
.area idata
.byte 'A,20
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏/5110.h
.blkb 2
.area idata
.byte 33,49
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏/5110.h
.blkb 2
.area idata
.byte 49,36
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏/5110.h
.blkb 2
.area idata
.byte 33,34
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏/5110.h
.blkb 2
.area idata
.byte 35,36
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏/5110.h
.blkb 2
.area idata
.byte 0,34
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏/5110.h
.blkb 2
.area idata
.byte 35,0
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏/5110.h
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏\main.c
.dbsym e disp1_buffer _disp1_buffer A[20:5:4]c
_disp2_buffer::
.blkb 2
.area idata
.byte 17,'A
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏\main.c
.blkb 2
.area idata
.byte 'A,19
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏\main.c
.blkb 2
.area idata
.byte 18,'A
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏\main.c
.blkb 2
.area idata
.byte 'A,20
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏\main.c
.blkb 2
.area idata
.byte 49,49
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏\main.c
.blkb 2
.area idata
.byte 50,50
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏\main.c
.blkb 2
.area idata
.byte 51,51
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏\main.c
.blkb 2
.area idata
.byte 52,52
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏\main.c
.blkb 2
.area idata
.byte 0,53
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏\main.c
.blkb 2
.area idata
.byte 53,0
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏\main.c
.dbsym e disp2_buffer _disp2_buffer A[20:5:4]c
.area text(rom, con, rel)
.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏\main.c
.dbfunc e Delay_us _Delay_us fV
; time -> R16,R17
.even
_Delay_us::
.dbline -1
.dbline 58
; #include <iom16v.h>
; #include <MACROS.h>
; #include "Define.h"
; #include "5110.h"
;
; //=======================================================================
; //=======================================================================
; //按键I/O口定义
; #define key_ddr DDRA
; #define key_port PORTA
; #define key_pin PINA
;
; //=======================================================================
; //按键键值定义
; #define all_key 0xF8
;
; #define Up 0x78 //7
; #define Right 0xB8 //6
; #define Enter 0xD8 //5
; #define Left 0xE8 //4
; #define Down 0xF0 //3
; extern const uint8 font6x8[][6]; //LCD字符显示码表声明
;
; uint8 key_state; //按键状态
; uint8 key_value; //按键返回值
; uint8 key_last_value; //上次按键返回值
; uint8 key_one; //处理按键后是否完成一次显示
;
; uint8 X; //鼠标X轴
; uint8 Y; //鼠标Y轴
;
; uint16 NUM_BEST; //最好步数
; uint16 NUM_YOUR; //走的步数
;
; uint8 guanshu; //第几局
; uint8 disp_buffer[5][4]; //显示缓存区
;
;
; uint8 disp1_buffer[5][4]={ //第一局开局棋子布局
; {0x11,0x41,0x41,0x13},
; {0x12,0x41,0x41,0x14},
; {0x21,0x31,0x31,0x24},
; {0x21,0x22,0x23,0x24},
; {0x00,0x22,0x23,0x00},
; };
; uint8 disp2_buffer[5][4]={ //第二局开局棋子布局
; {0x11,0x41,0x41,0x13},
; {0x12,0x41,0x41,0x14},
; {0x31,0x31,0x32,0x32},
; {0x33,0x33,0x34,0x34},
; {0x00,0x35,0x35,0x00},
; };
;
;
; //=======================================================================
; //延时函数
; void Delay_us(uint16 time)
; {while (time--)
xjmp L3
L2:
.dbline 59
wdr
L3:
.dbline 58
movw R2,R16
subi R16,1
sbci R17,0
tst R2
brne L2
tst R3
brne L2
X0:
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r time 16 i
.dbend
.dbfunc e Delay_ms _Delay_ms fV
; time -> R20,R21
.even
_Delay_ms::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 63
; _WDR();
;
; }
; void Delay_ms(uint16 time)
; {while (time--)
xjmp L7
L6:
.dbline 64
ldi R16,1200
ldi R17,4
xcall _Delay_us
L7:
.dbline 63
movw R2,R20
subi R20,1
sbci R21,0
tst R2
brne L6
tst R3
brne L6
X1:
.dbline -2
L5:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r time 20 i
.dbend
.dbfunc e main _main fV
; i -> R20
; j -> R22
.even
_main::
sbiw R28,6
.dbline -1
.dbline 71
; Delay_us(1200);
; }
;
;
; //=======================================================================
; //主函数
; void main(void)
; {
.dbline 73
; uint8 i,j;
; guanshu=1;
ldi R24,1
sts _guanshu,R24
.dbline 74
; NUM_BEST=100;
ldi R24,100
ldi R25,0
sts _NUM_BEST+1,R25
sts _NUM_BEST,R24
.dbline 76
;
; SETBIT(DDRC,BACKLED_EN); //配置背光控制端口
sbi 0x14,7
.dbline 77
; CLEARBIT(PORTC,BACKLED_EN); //使能背光
cbi 0x15,7
.dbline 79
;
; LCD_init(); //初始化LCD模块
xcall _LCD_init
xjmp L11
L10:
.dbline 82
;
; while(1) //总循环
; {
.dbline 83
; LCD_clear(); //清屏
xcall _LCD_clear
.dbline 86
;
; //显示数据界面
; LCD_write_String(34,0,8,"YOUR:000",0);
clr R2
clr R3
std y+5,R3
std y+4,R2
ldi R24,<L13
ldi R25,>L13
std y+3,R25
std y+2,R24
ldi R24,8
ldi R25,0
std y+1,R25
std y+0,R24
clr R18
clr R19
ldi R16,34
ldi R17,0
xcall _LCD_write_String
.dbline 87
; LCD_write_String(34,1,8,"BEST:000",0);
clr R2
clr R3
std y+5,R3
std y+4,R2
ldi R24,<L14
ldi R25,>L14
std y+3,R25
std y+2,R24
ldi R24,8
ldi R25,0
std y+1,R25
std y+0,R24
ldi R18,1
ldi R19,0
ldi R16,34
ldi R17,0
xcall _LCD_write_String
.dbline 88
; LCD_write_String(34,3,8,"GUAN:001",0);
clr R2
clr R3
std y+5,R3
std y+4,R2
ldi R24,<L15
ldi R25,>L15
std y+3,R25
std y+2,R24
ldi R24,8
ldi R25,0
std y+1,R25
std y+0,R24
ldi R18,3
ldi R19,0
ldi R16,34
ldi R17,0
xcall _LCD_write_String
.dbline 90
;
; NUMdisp_task(NUM_BEST,1); //显示最好成绩
ldi R18,1
ldi R19,0
lds R16,_NUM_BEST
lds R17,_NUM_BEST+1
xcall _NUMdisp_task
.dbline 91
; NUMdisp_task(guanshu,3); //显示第几关
ldi R18,3
ldi R19,0
lds R16,_guanshu
clr R17
xcall _NUMdisp_task
.dbline 94
;
; //一切变量都重新初始化
; key_init();
xcall _key_init
.dbline 95
; key_state=0;
clr R2
sts _key_state,R2
.dbline 96
; key_value=0;
sts _key_value,R2
.dbline 97
; key_last_value=0;
sts _key_last_value,R2
.dbline 98
; key_one=1;
ldi R24,1
sts _key_one,R24
.dbline 99
; X=0;
sts _X,R2
.dbline 100
; Y=0;
sts _Y,R2
.dbline 101
; NUM_YOUR=0;
clr R3
sts _NUM_YOUR+1,R3
sts _NUM_YOUR,R2
.dbline 102
; SEI(); //全局中断使能
sei
xjmp L17
L16:
.dbline 104
; while(1) //选关
; {
.dbline 106
;
; if(key_value==Down)
lds R24,_key_value
cpi R24,240
brne L19
.dbline 107
; {
.dbline 108
; key_value=0;
clr R2
sts _key_value,R2
.dbline 109
; guanshu++;
lds R24,_guanshu
subi R24,255 ; addi 1
sts _guanshu,R24
.dbline 110
; if(guanshu==3)
cpi R24,3
brne L21
.dbline 111
; guanshu=1;
ldi R24,1
sts _guanshu,R24
L21:
.dbline 112
; NUMdisp_task(guanshu,3);
ldi R18,3
ldi R19,0
lds R16,_guanshu
clr R17
xcall _NUMdisp_task
.dbline 113
; }
L19:
.dbline 114
; if(key_value==Enter) //按确定选关完成
lds R24,_key_value
cpi R24,216
brne L23
.dbline 115
; {
.dbline 116
; key_value=0;
clr R2
sts _key_value,R2
.dbline 117
; break;
xjmp L18
L23:
.dbline 119
L17:
.dbline 103
xjmp L16
L18:
.dbline 122
; }
; }
;
; //将选择的局载入显示缓存区
; if(guanshu==1)
lds R24,_guanshu
cpi R24,1
brne L25
.dbline 123
; {
.dbline 124
; for(i=0;i<5;i++)
clr R20
xjmp L30
L27:
.dbline 125
; for(j=0;j<4;j++)
clr R22
xjmp L34
L31:
.dbline 126
.dbline 127
ldi R24,4
mul R24,R20
ldi R24,<_disp1_buffer
ldi R25,>_disp1_buffer
movw R2,R0
add R2,R24
adc R3,R25
mov R30,R22
clr R31
add R30,R2
adc R31,R3
ldd R2,z+0
ldi R24,<_disp_buffer
ldi R25,>_disp_buffer
movw R4,R0
add R4,R24
adc R5,R25
mov R30,R22
clr R31
add R30,R4
adc R31,R5
std z+0,R2
.dbline 128
L32:
.dbline 125
inc R22
L34:
.dbline 125
cpi R22,4
brlo L31
L28:
.dbline 124
inc R20
L30:
.dbline 124
cpi R20,5
brlo L27
.dbline 129
; {
; disp_buffer[i][j]=disp1_buffer[i][j];
; }
; }
xjmp L26
L25:
.dbline 131
; else
; {
.dbline 132
; for(i=0;i<5;i++)
clr R20
xjmp L38
L35:
.dbline 133
; for(j=0;j<4;j++)
clr R22
xjmp L42
L39:
.dbline 134
.dbline 135
ldi R24,4
mul R24,R20
ldi R24,<_disp2_buffer
ldi R25,>_disp2_buffer
movw R2,R0
add R2,R24
adc R3,R25
mov R30,R22
clr R31
add R30,R2
adc R31,R3
ldd R2,z+0
ldi R24,<_disp_buffer
ldi R25,>_disp_buffer
movw R4,R0
add R4,R24
adc R5,R25
mov R30,R22
clr R31
add R30,R4
adc R31,R5
std z+0,R2
.dbline 136
L40:
.dbline 133
inc R22
L42:
.dbline 133
cpi R22,4
brlo L39
L36:
.dbline 132
inc R20
L38:
.dbline 132
cpi R20,5
brlo L35
.dbline 137
; {
; disp_buffer[i][j]=disp2_buffer[i][j];
; }
; }
L26:
.dbline 140
;
; //开始闯关
; for(;;)
L43:
.dbline 141
; {
.dbline 143
; //显示鼠标
; LCD_set_XY(Y*8+3,X);//设置初始位置
lds R18,_X
lds R2,_Y
ldi R24,8
mul R24,R2
mov R16,R0
subi R16,253 ; addi 3
xcall _LCD_set_XY
.dbline 144
; LCD_write_byte(0x3c,1);
ldi R18,1
ldi R16,60
xcall _LCD_write_byte
.dbline 145
; LCD_write_byte(0x3c,1);
ldi R18,1
ldi R16,60
xcall _LCD_write_byte
.dbline 146
; KBOD_task(); //按键操作处理
xcall _KBOD_task
.dbline 148
;
; if(key_value!=0)
lds R2,_key_value
tst R2
breq L47
.dbline 149
; {
.dbline 151
;
; key_last_value=key_value; //将上次的键值存起来
sts _key_last_value,R2
.dbline 152
; key_value=0; //将当前键值清零
clr R2
sts _key_value,R2
.dbline 153
; key_one=1; //将显示打开
ldi R24,1
sts _key_one,R24
.dbline 154
; }
L47:
.dbline 156
;
; if(key_one==1)
lds R24,_key_one
cpi R24,1
brne L49
.dbline 157
; {
.dbline 158
; DISP_task(); //显示图形界面
xcall _DISP_task
.dbline 159
; key_one=0; //将显示关闭
clr R2
sts _key_one,R2
.dbline 160
; }
L49:
.dbline 163
;
; //判断通关与否
; if((disp_buffer[4][1]==0x41)&(disp_buffer[4][2]==0x41)) //通过
lds R24,_disp_buffer+16+1
cpi R24,65
brne L57
ldi R24,1
ldi R25,0
movw R10,R24
xjmp L58
L57:
clr R10
clr R11
L58:
lds R24,_disp_buffer+16+2
cpi R24,65
brne L59
ldi R22,1
ldi R23,0
xjmp L60
L59:
clr R22
clr R23
L60:
movw R2,R10
and R2,R22
and R3,R23
tst R2
brne X2
tst R3
brne X4
xjmp L43
X4:
X2:
.dbline 164
; {
.dbline 166
;
; LCD_clear(); //清屏
xcall _LCD_clear
.dbline 167
; LCD_write_String(0,5,15,"Congratulation!",0); //祝贺
clr R2
clr R3
std y+5,R3
std y+4,R2
ldi R24,<L61
ldi R25,>L61
std y+3,R25
std y+2,R24
ldi R24,15
ldi R25,0
std y+1,R25
std y+0,R24
ldi R18,5
ldi R19,0
clr R16
clr R17
xcall _LCD_write_String
.dbline 168
; LCD_write_String(0,4,5,"Wait!",0); //等待
clr R2
clr R3
std y+5,R3
std y+4,R2
ldi R24,<L62
ldi R25,>L62
std y+3,R25
std y+2,R24
ldi R24,5
ldi R25,0
std y+1,R25
std y+0,R24
ldi R18,4
ldi R19,0
clr R16
clr R17
xcall _LCD_write_String
.dbline 169
; Delay_ms(10000); //延时
ldi R16,10000
ldi R17,39
xcall _Delay_ms
.dbline 170
; guanshu++; //关数加1
lds R24,_guanshu
subi R24,255 ; addi 1
sts _guanshu,R24
.dbline 171
; if(guanshu==3) //达到最高关数就返回第一关
cpi R24,3
brne L63
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -