📄 tetriss.asm
字号:
;*****************************************************
;******************俄罗斯方块源程序*******************
;*********************作者:张迎**********************
;*****************************************************
E EQU P1.0;片使能信号,下降沿锁存
RW EQU P1.1;H读,L写
RS EQU P1.2;H数据,L指令
CSB EQU P1.3;片选信号,00、01、10分别对应一片
CSA EQU P1.4;IC的SEG,11三片都不选中
RST EQU P2.4;复位信号,低电平有效
LED EQU P2.5;背光显示
SND EQU P2.6;蜂鸣器
DACS EQU P2.7;D/A片选
CTRY EQU 10H;显示Y地址计数器
CTRP EQU 11H;显示页地址计数器
PTAB EQU 12H;显示数据首地址
PLCD EQU 13H;液晶显示区域地址
LDAT EQU 14H;亮度
BX EQU 15H;图形选择转盘
BOX0 EQU 16H
BOX1 EQU 17H
BOX2 EQU 18H
BOX3 EQU 19H;基本单元地址暂存
DPTL EQU 1AH
DPTH EQU 1BH;DPTR数据保护暂存
TN EQU 1CH;DPTR地址偏移
BTTN EQU 1DH;图形到底标志
PBIT EQU 1EH;位地址暂存
DRAM EQU 1FH;RAM数据暂存
BMV0 EQU 35H
BMV1 EQU 36H
BMV2 EQU 37H;方块旋转的地址
MKS0 EQU 38H
MKS1 EQU 39H
MKS2 EQU 3AH
MKS3 EQU 3BH;分数存储
KLFT EQU 3CH;左键按下标志
KRGT EQU 3DH;右键按下标志
KPAU EQU 3EH;暂停键按下标志
KFST EQU 3FH;快速键按下标志
KTRN EQU 40H;旋转键按下标志
SPD EQU 41H;速度调节
ORG 0000H
AJMP MAIN
;*****************************************************
;***********************主程序************************
ORG 0030H
MAIN:
MOV SP,#49H;设定堆栈指针(栈底为50H,可用50H~7FH)
CLR LED;打开背光
MOV LDAT,#0A0H
LCALL LIGHT_CTL;调整LCD的亮度
CLR SND;开启蜂鸣器
LCALL DELAY_MIDDLE;调用延时
SETB SND;关闭蜂鸣器
LCALL DIS_INTL;调用LCD初始化子程序
MOV PLCD,#00000000B;CHIP(2/CSA、CSB)、ADRESSY(3)、PAGE(3)
;LCALL DIS_START;调用开机自检
AJMP TETRISS_MAIN;跳转到程序主体
;*****************************************************
;********************渐变画面程序*********************
DIS_START:
MOV DPTR,#TAB_CUBIC
LCALL DIS_FILL
INC PLCD
MOV A,PLCD
CJNE A,#0C0H,DIS_START
LCALL LIGHT_SMOOTH;平滑处理
DIS_START_CIR1:
MOV DPTR,#TAB_FORK
LCALL DIS_FILL
INC PLCD
MOV A,PLCD
CJNE A,#0C0H,DIS_START_CIR1
LCALL LIGHT_SMOOTH;平滑处理
DIS_START_CIR2:
MOV DPTR,#TAB_SOLIDFORK
LCALL DIS_FILL
INC PLCD
MOV A,PLCD
CJNE A,#0C0H,DIS_START_CIR2
LCALL LIGHT_SMOOTH;平滑处理
RET
;*****************************************************
;**********************程序主体***********************
TETRISS_MAIN:
LCALL DIS_TETRISS
LCALL LIGHT_SMOOTH
LCALL SPEEDCTL;调用速度控制子程序
LCALL CLEAR_RAM;清除作为显示缓冲区的RAM空间
MOV BX,#01H;图形选择转盘初始化
LCALL TETRISS_FRAME;构建框架
TETRISS_MAIN_CIR:
LCALL TETRISS_MARK;调用分数显示
LCALL TETRISS_PREVIEW;调用图形预览
LCALL TETRISS_GAMECTL;调用游戏控制
LCALL TETRISS_REMOVE;调用消行程序
AJMP TETRISS_MAIN_CIR;循环
;*****************************************************
;******************显示初始化子程序*******************
DIS_INTL:
CLR RST
SETB RST
CLR RS
SETB RW
DIS_INTL_CIR:
MOV P0,#0FFH
SETB E
MOV A,P0
CLR E
ANL A,#10H
;JNZ DIS_INTL_CIR;复位LCD
CLR CSB
CLR CSA
LCALL DIS_INTL_OPEN;开片选00
SETB CSB
CLR CSA
LCALL DIS_INTL_OPEN;开片选01
CLR CSB
SETB CSA
LCALL DIS_INTL_OPEN;开片选02
RET
DIS_INTL_OPEN:
LCALL DIS_BUSY
CLR RS
CLR RW
SETB E
MOV P0,#3FH;开显示
CLR E
RET
;*****************************************************
;**********************速度控制***********************
SPEEDCTL:
MOV LDAT,#0A0H
LCALL LIGHT_CTL;增加亮度
MOV PLCD,#00H
SPEEDCTL_CLR:
MOV DPTR,#TAB_BLANK
LCALL DIS_FILL
INC PLCD
MOV A,PLCD
CJNE A,#0C0H,SPEEDCTL_CLR;清屏
SPEEDCTL_SPEED:
MOV PLCD,#10011000B
MOV DPTR,#TAB_SPEED
SPEEDCTL_SPEED_CIR:
LCALL DIS_FILL
INC PLCD
MOV A,PLCD
CJNE A,#10011110B,SPEEDCTL_SPEED_CIR;显示速度方格
MOV SPD,#04H
SPEEDCTL_SET_SPEED:
MOV A,#08H
CLR CY
SUBB A,SPD
MOV R2,A
MOV PLCD,#10001000B
SPEEDCTL_SET_SPEED_DIS_FILL:
MOV DPTR,#TAB_CIR
LCALL DIS_FILL
INC PLCD
DJNZ R2,SPEEDCTL_SET_SPEED_DIS_FILL
SPEEDCTL_SET_SPEED_DIS_CLR:
MOV A,PLCD
MOV DPTR,#TAB_BLANK
LCALL DIS_FILL
INC PLCD
MOV R2,PLCD
CJNE R2,#10010000B,SPEEDCTL_SET_SPEED_DIS_CLR
LCALL DELAY_MIDDLE
SPEEDCTL_SET:
MOV KTRN,#00H
LCALL KEY_TURN
MOV R2,KTRN
CJNE R2,#01H,SPEEDCTL_SET_ST0
AJMP SPEEDCTL_END
SPEEDCTL_SET_ST0:
MOV KRGT,#00H
LCALL KEY_RIGHT
MOV A,SPD
CLR CY
SUBB A,KRGT
MOV KRGT,#00H
MOV KLFT,#00H
LCALL KEY_LEFT
ADD A,KLFT
CJNE A,#00H,SPEEDCTL_SET_ST1
MOV SPD,#01H
AJMP SPEEDCTL_SET_SPEED
SPEEDCTL_SET_ST1:
CJNE A,#08H,SPEEDCTL_SET_ST2
MOV A,#07H
AJMP SPEEDCTL_SET_SPEED
SPEEDCTL_SET_ST2:
MOV SPD,A
AJMP SPEEDCTL_SET_SPEED
SPEEDCTL_END:;速度调整
RET
;*****************************************************
;***********************RAM清除***********************
CLEAR_RAM:
PUSH 00H
MOV R0,#20H
CLEAR_RAM_CIR:
MOV @R0,#00H
INC R0
CJNE R0,#30H,CLEAR_RAM_CIR
MOV MKS0,#00H
MOV MKS1,#00H
MOV MKS2,#00H
MOV MKS3,#00H
POP 00H
RET
;CLEAR_RAM会清除20H~29H的的内容
;*****************************************************
;**********************框架构建***********************
TETRISS_FRAME:
MOV PLCD,#00000000B;CHIP(2/CSA、CSB)、ADRESSY(3)、PAGE(3)
TETRISS_FRAME_CLR:
MOV DPTR,#TAB_BLANK
LCALL DIS_FILL
INC PLCD
MOV A,PLCD
CJNE A,#0C0H,TETRISS_FRAME_CLR
MOV LDAT,#0A0H
LCALL LIGHT_CTL;清除LCD
MOV R3,#08H
MOV PLCD,#10000000B;CHIP(2/CSA、CSB)、ADRESSY(3)、PAGE(3)
TETRISS_FRAME_CIR1:
MOV DPTR,#TAB_SOLIDFORK
LCALL DIS_FILL
INC PLCD
DJNZ R3,TETRISS_FRAME_CIR1;建立游戏区域之上的一横线
;*****************************************************
MOV R3,#05H
MOV DPTR,#TAB_MARK;将TAB_MARK的首地址送给DPTR
MOV PLCD,#10010000B;CHIP(2/CSA、CSB)、ADRESSY(3)、PAGE(3)
TETRISS_FRAME_CIR2:
LCALL DIS_FILL
INC PLCD
DJNZ R3,TETRISS_FRAME_CIR2;构建MARK:
;*****************************************************
MOV R2,#04H
MOV R3,#04H
MOV DPTR,#TAB_PIC
MOV PLCD,#10100100B;CHIP(2/CSA、CSB)、ADRESSY(3)、PAGE(3)
TETRISS_PIC:
LCALL DIS_FILL
INC PLCD
DJNZ R3,TETRISS_PIC;构建图片
INC PLCD
INC PLCD
INC PLCD
INC PLCD
MOV R3,#04H
DJNZ R2,TETRISS_PIC
RET
;*****************************************************
;**********************构建分数***********************
TETRISS_MARK:
MOV PLCD,#10001011B
MOV R0,#3BH
TETRISS_MARK_DIS:
MOV A,@R0
MOV B,#08H
MUL AB
MOV B,A
MOV DPTR,#TAB_0
MOV A,DPL
ADD A,B
MOV DPL,A
MOV A,DPH
ADDC A,#00H
MOV DPH,A
LCALL DIS_FILL
INC PLCD
DEC R0
CJNE R0,#37H,TETRISS_MARK_DIS
MOV DPTR,#TAB_0
LCALL DIS_FILL
RET
;*****************************************************
;**********************构建预览***********************
TETRISS_PREVIEW:
MOV PLCD,#10100000B
MOV R2,#04H
MOV R3,#04H
TRTRISS_PREVIEW_ERASE:
MOV DPTR,#TAB_BLANK
LCALL DIS_FILL
INC PLCD
DJNZ R3,TRTRISS_PREVIEW_ERASE
INC PLCD
INC PLCD
INC PLCD
INC PLCD
MOV R3,#04H
DJNZ R2,TRTRISS_PREVIEW_ERASE;清除显示区域
MOV DPTR,#TAB_BOX_0
MOV A,BX
RL A
MOV BX,A
CJNE A,#01H,TETRISS_PREVIEW_CHOOSE
AJMP TETRISS_PREVIEW_DIS;转动转盘
TETRISS_PREVIEW_CHOOSE:
RR A
MOV R2,#04H
TETRISS_PREVIEW_CHOOSE_DTAD:
INC DPTR
DJNZ R2,TETRISS_PREVIEW_CHOOSE_DTAD
JNB Acc.0,TETRISS_PREVIEW_CHOOSE;图形选择
MOV DPTL,DPL
MOV DPTH,DPH
TETRISS_PREVIEW_DIS:
MOV DPTL,DPL
MOV DPTH,DPH
MOV R2,#04H
TETRISS_PREVIEW_DIS_CIR:;显示图形
CLR A
MOVC A,@A+DPTR
ADD A,#10101000B
CLR CY
SUBB A,#72H
MOV PLCD,A
PUSH DPH
PUSH DPL
MOV DPTR,#TAB_FORK
LCALL DIS_FILL
POP DPL
POP DPH
INC DPTR
DJNZ R2,TETRISS_PREVIEW_DIS_CIR
RET
;*****************************************************
;*******************按键扫描子程序********************
KEY_SERVE:
PUSH 10H
MOV R4,#04H
KEY_SERVE_ST0:
LCALL KEY_LEFT
LCALL KEY_FAST
MOV A,KFST
JNZ KEY_SERVE_ST1
LCALL DELAY_GAME
KEY_SERVE_ST1:
LCALL KEY_RIGHT
KEY_SERVE_ST2:
LCALL KEY_PAUSE
LCALL KEY_FAST
MOV A,KFST
JNZ KEY_SERVE_ST3
LCALL DELAY_GAME
KEY_SERVE_ST3:
LCALL KEY_TURN
KEY_SERVE_ST4:
LCALL TETRISS_GAMECTL_LEFT
LCALL TETRISS_GAMECTL_RIGHT
MOV A,R4
SUBB A,#02H
JZ KEY_SERVE_ST5
LCALL TETRISS_GAMECTL_TURN
KEY_SERVE_ST5:
DJNZ R4,KEY_SERVE_ST0
POP 04H
RET
;*****************************************************
;**********************游戏控制***********************
TETRISS_GAMECTL:
MOV R3,#08H
MOV PLCD,#10000000B;CHIP(2/CSA、CSB)、ADRESSY(3)、PAGE(3)
TETRISS_GAMECTL_FRAME:
MOV DPTR,#TAB_SOLIDFORK
LCALL DIS_FILL
INC PLCD
DJNZ R3,TETRISS_GAMECTL_FRAME;建立游戏区域之上的一横线
MOV TN,#20H;DPTR地址偏移初试化
MOV BTTN,#00H;到底标志清零
LCALL TETRISS_GAMECTL_PROPH;调用图形初始化
LCALL DELAY_MIDDLE;延时
TETRISS_GAMECTL_PROCESS:
LCALL KEY_SERVE;调用按键处理
LCALL TETRISS_GAMECTL_DOWN;向下进一行
MOV R5,BTTN
CJNE R5,#01H,TETRISS_GAMECTL_PROCESS;检查到底标志
RET
;*****************************************************
;*********************图形初始化**********************
TETRISS_GAMECTL_PROPH:
MOV A,DPTL
CLR CY
SUBB A,#04H
MOV DPTL,A
MOV A,DPTH
SUBB A,#00H
MOV DPTH,A
MOV R0,#16H
MOV R2,#04H
MOV DPTR,#TAB_BOX_0
MOV A,DPTL
CLR CY
SUBB A,DPL
MOV A,DPTH
SUBB A,DPH
MOV DPL,DPTL
MOV DPH,DPTH
JNB CY,TETRISS_GAMECTL_CURRENT
MOV DPTR,#TAB_BOX_7
MOV DPTL,DPL
MOV DPTH,DPH;DPTR地址预处理
TETRISS_GAMECTL_CURRENT:
CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R2,TETRISS_GAMECTL_CURRENT
MOV R0,#16H
MOV R2,#04H;将图形转存到RAM单元中
TETRISS_GAMECTL_BEGIN:
MOV DPTR,#TAB_FORK
MOV PLCD,@R0
LCALL DIS_FILL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -