📄 tetriss.asm
字号:
INC R0
DJNZ R2,TETRISS_GAMECTL_BEGIN;填充图形
RET
;*****************************************************
;**********************向下移动***********************
TETRISS_GAMECTL_DOWN:
MOV R1,#16H
TETRISS_GAMECTL_DOWN_EST0:
MOV A,@R1
MOV B,#08H
DIV AB
JZ TETRISS_DOWN_ERROR;如果已经是最下一行,则停止向下运动
INC R1
CJNE R1,#1AH,TETRISS_GAMECTL_DOWN_EST0
MOV R1,#16H
TETRISS_GAMECTL_DOWN_EST1:
MOV A,@R1
CLR CY
SUBB A,#08H
MOV PBIT,A
LCALL BIT_RD
JB CY,TETRISS_DOWN_ERROR;如果下方有其他单元,停止向下运动
INC R1
CJNE R1,#1AH,TETRISS_GAMECTL_DOWN_EST1
MOV R1,#16H
TETRISS_GAMECTL_DOWN_CLR:
MOV DPTR,#TAB_BLANK
MOV PLCD,@R1
LCALL DIS_FILL
INC R1
CJNE R1,#1AH,TETRISS_GAMECTL_DOWN_CLR;清除原有区域
MOV R1,#16H
TETRISS_GAMECTL_DOWN_DEC:
MOV A,@R1
CLR CY
SUBB A,#08H
MOV @R1,A
INC R1
CJNE R1,#1AH,TETRISS_GAMECTL_DOWN_DEC;地址数据减8
MOV R1,#16H
TETRISS_GAMECTL_DOWN_WR:
MOV DPTR,#TAB_FORK
MOV PLCD,@R1
LCALL DIS_FILL
INC R1
CJNE R1,#1AH,TETRISS_GAMECTL_DOWN_WR;写现在区域
RET
TETRISS_DOWN_ERROR:
MOV BTTN,#01H
MOV R1,#16H;到底处理
TETRISS_DOWN_BITWR:
MOV PBIT,@R1
SETB CY
LCALL BIT_WR
INC R1
CJNE R1,#1AH,TETRISS_DOWN_BITWR;将图形转存到对应的RAM中
RET
;*****************************************************
;**********************向左移动***********************
TETRISS_GAMECTL_LEFT:
MOV A,KLFT
CJNE A,#01H,TETRISS_LEFT_NOKEY;判断左键是否按下
CLR SND
LCALL DELAY_SHORT
SETB SND;按键声
MOV R1,#16H
TETRISS_GAMECTL_LEFT_EST0:
MOV A,@R1
MOV B,#08H
DIV AB
MOV A,B
JZ TETRISS_LEFT_NOKEY
INC R1
CJNE R1,#1AH,TETRISS_GAMECTL_LEFT_EST0;检查是否已为最左边
MOV R1,#16H
TETRISS_GAMECTL_LEFT_EST1:
MOV A,@R1
DEC A
MOV PBIT,A
LCALL BIT_RD
JB CY,TETRISS_LEFT_NOKEY
INC R1
CJNE R1,#1AH,TETRISS_GAMECTL_LEFT_EST1;检查左方是否有其他单元
MOV R1,#16H
TETRISS_GAMECTL_LEFT_CLR:
MOV DPTR,#TAB_BLANK
MOV PLCD,@R1
LCALL DIS_FILL
INC R1
CJNE R1,#1AH,TETRISS_GAMECTL_LEFT_CLR;清除原有区域
MOV R1,#16H
TETRISS_GAMECTL_LEFT_DEC:
DEC @R1
INC R1
CJNE R1,#1AH,TETRISS_GAMECTL_LEFT_DEC;地址减1
MOV R1,#16H
TETRISS_GAMECTL_LEFT_WR:
MOV DPTR,#TAB_FORK
MOV PLCD,@R1
LCALL DIS_FILL
INC R1
CJNE R1,#1AH,TETRISS_GAMECTL_LEFT_WR;写现在单元
TETRISS_LEFT_NOKEY:
RET
;*****************************************************
;**********************向右移动***********************
TETRISS_GAMECTL_RIGHT:
MOV A,KRGT
CJNE A,#01H,TETRISS_RIGHT_NOKEY;判断右键是否按下
CLR SND
LCALL DELAY_SHORT
SETB SND;按键声
MOV R1,#16H
TETRISS_GAMECTL_RIGHT_EST0:
MOV A,@R1
MOV B,#08H
DIV AB
MOV A,B
CLR CY
SUBB A,#07H
JZ TETRISS_RIGHT_NOKEY
INC R1
CJNE R1,#1AH,TETRISS_GAMECTL_RIGHT_EST0;检查是否已为最右边
MOV R1,#16H
TETRISS_GAMECTL_RIGHT_EST1:
MOV A,@R1
INC A
MOV PBIT,A
LCALL BIT_RD
JB CY,TETRISS_RIGHT_NOKEY
INC R1
CJNE R1,#1AH,TETRISS_GAMECTL_RIGHT_EST1;检查右边是否有其他单元
MOV R1,#16H
TETRISS_GAMECTL_RIGHT_CLR:
MOV DPTR,#TAB_BLANK
MOV PLCD,@R1
LCALL DIS_FILL
INC R1
CJNE R1,#1AH,TETRISS_GAMECTL_RIGHT_CLR;清除原有区域
MOV R1,#16H
TETRISS_GAMECTL_RIGHT_INC:
INC @R1
INC R1
CJNE R1,#1AH,TETRISS_GAMECTL_RIGHT_INC;地址加1
MOV R1,#16H
TETRISS_GAMECTL_RIGHT_WR:
MOV DPTR,#TAB_FORK
MOV PLCD,@R1
LCALL DIS_FILL
INC R1
CJNE R1,#1AH,TETRISS_GAMECTL_RIGHT_WR;写现在单元
TETRISS_RIGHT_NOKEY:
RET
;*****************************************************
;**********************旋转运动***********************
TETRISS_TURN_ERROR:
RET
TETRISS_GAMECTL_TURN:
MOV A,KTRN
CJNE A,#01H,TETRISS_TURN_ERROR;判断旋转键是否按下
CLR SND
LCALL DELAY_SHORT
SETB SND;按键声
MOV A,DPTL
ADD A,TN
MOV DPL,A
MOV A,DPTH
ADDC A,#00H
MOV DPH,A
CLR A
MOVC A,@A+DPTR;取数据表中允许空格数据
MOV R2,A
MOV R1,#16H
TETRISS_GAMECTL_TURN_EST0:
MOV A,@R1
MOV B,#08H
CLR CY
DIV AB
TETRISS_GAMECTL_TURN_EST0_LEFT:
MOV A,R2
ANL A,#0F0H
SWAP A
MOV R3,A;R3为允许左方最小的剩余空格
MOV A,B;A为左方剩余的空格
CLR CY
SUBB A,R3
JB CY,TETRISS_TURN_ERROR
TETRISS_GAMECTL_TURN_EST0_RIGHT:
MOV A,R2
ANL A,#0FH;右方允许最小的剩余空格
ADD A,B
CLR CY
SUBB A,#08H
JNB CY,TETRISS_TURN_ERROR
INC R1
CJNE R1,#1AH,TETRISS_GAMECTL_TURN_EST0;判断旋转后地址是否超出范围
MOV R0,#35H
MOV R1,#16H
TETRISS_GAMECTL_TURN_EST1:
MOV A,@R1
MOV R2,A
INC DPTR
CLR A
MOVC A,@A+DPTR
JB Acc.7,TETRISS_GAMECTL_TURN_EST1_SUBB
TETRISS_GAMECTL_TURN_EST1_ADD:
ADD A,R2
MOV @R0,A
MOV PBIT,A
LCALL BIT_RD
JB CY,TETRISS_TURN_ERROR
AJMP TETRISS_GAMECTL_TURN_EST1_OK
TETRISS_GAMECTL_TURN_EST1_SUBB:
CLR Acc.7
MOV B,A
MOV A,R2
CLR CY
SUBB A,B
MOV @R0,A
MOV PBIT,A
LCALL BIT_RD
JB CY,TETRISS_TURN_ERROR
TETRISS_GAMECTL_TURN_EST1_OK:
INC R0
INC R1
CJNE R1,#19H,TETRISS_GAMECTL_TURN_EST1;判断旋转后地址是否冲突
MOV R1,#16H
TETRISS_GAMECTL_TURN_CLR:
MOV DPTR,#TAB_BLANK
MOV PLCD,@R1
LCALL DIS_FILL
INC R1
CJNE R1,#1AH,TETRISS_GAMECTL_TURN_CLR;清除原有区域
MOV R1,#16H
MOV R0,#35H
TETRISS_GAMECTL_TURN_MOVE:
MOV A,@R0
MOV @R1,A
INC R0
INC R1
CJNE R1,#19H,TETRISS_GAMECTL_TURN_MOVE;改变地址
MOV R1,#16H
TETRISS_GAMECTL_TURN_WR:
MOV DPTR,#TAB_FORK
MOV PLCD,@R1
LCALL DIS_FILL
INC R1
CJNE R1,#1AH,TETRISS_GAMECTL_TURN_WR;显示旋转后的图形
MOV A,TN
ADD A,#20H
CJNE A,#0A0H,TETRISS_TURN_FULL
MOV TN,#20H
RET
TETRISS_TURN_FULL:
MOV TN,A;修改DPTR地址偏移
RET
;*****************************************************
;*********************消行子程序**********************
TETRISS_REMOVE:
MOV R0,#20H
TETRISS_REMOVE_CIR:
MOV A,@R0
CJNE A,#0FFH,TETRISS_REMOVE_CIR_NO
MOV A,MKS0
INC A;消除一行,加10分
MOV MKS0,A
CJNE A,#0AH,TETRISS_REMOVE_CIR_BEFORE
MOV MKS0,#00H
SETB CY
MOV A,MKS1
ADDC A,#00H
MOV MKS1,A
CJNE A,#0AH,TETRISS_REMOVE_CIR_BEFORE
MOV MKS1,#00H
SETB CY
MOV A,MKS2
ADDC A,#00H
MOV MKS2,A
CJNE A,#0AH,TETRISS_REMOVE_CIR_BEFORE
MOV MKS2,#00H
SETB CY
MOV A,MKS3
ADDC A,#00H
MOV MKS3,A
CJNE A,#0AH,TETRISS_REMOVE_CIR_BEFORE
MOV MKS3,#00H
TETRISS_REMOVE_CIR_BEFORE:
MOV R1,00H
INC R1
TETRISS_REMOVE_CIR_REMOVE:
MOV A,@R1
MOV @R0,A
INC R0
INC R1
CJNE R0,#2FH,TETRISS_REMOVE_CIR_REMOVE
MOV R0,#19H
TETRISS_REMOVE_CIR_NO:
INC R0
CJNE R0,#2FH,TETRISS_REMOVE_CIR
MOV R0,#00H
RETRISS_REMOVE_REFRESH:
MOV PBIT,R0
LCALL BIT_RD
JB CY,RETRISS_REMOVE_REFRESH_SETB
MOV DPTR,#TAB_BLANK
AJMP RETRISS_REMOVE_REFRESH_DIS
RETRISS_REMOVE_REFRESH_SETB:
MOV DPTR,#TAB_FORK
RETRISS_REMOVE_REFRESH_DIS:
MOV PLCD,R0
LCALL DIS_FILL
INC R0
CJNE R0,#80H,RETRISS_REMOVE_REFRESH
RET
;*****************************************************
;*********************填充子程序**********************
DIS_FILL:
;**********************设置片选***********************
MOV A,PLCD
MOV C,Acc.7
MOV CSA,C;设置CSA
MOV C,Acc.6
MOV CSB,C;设置CSB
;***********************设置页************************
DIS_FILL_PAGE:
MOV A,PLCD
ANL A,#07H
ORL A,#0B8H
LCALL DIS_BUSY;调用读忙程序
CLR RS
CLR RW
SETB E
MOV P0,A
CLR E;设置页
;********************设置起始Y地址********************
DIS_FILL_ADRY:
MOV A,PLCD
ANL A,#38H
ORL A,#40H
LCALL DIS_BUSY;调用读忙程序
CLR RS
CLR RW
SETB E
MOV P0,A
CLR E;设置起始Y地址
;*****************设置显示起始行为00H*****************
LCALL DIS_BUSY;调用读忙程序
CLR RS
CLR RW
SETB E
MOV P0,#0C0H;设置显示起始行为00H
CLR E
;**********************填充方块***********************
DIS_FILL_BW:
MOV CTRY,#08H
DIS_FILL_BW_CIR:
LCALL DIS_BUSY;调用读忙程序
SETB RS
CLR RW
SETB E
DIS_FILL_DAT:
MOV A,#00H
MOVC A,@A+DPTR;将DPTR对应的ROM单元中的数据读出
MOV P0,A;填充数据
CLR E
INC DPTR
DJNZ CTRY,DIS_FILL_BW_CIR
RET
;调用TAB_FILL子程序后DPTR会自动增加08H
;需要重新定位PLCD
;*****************************************************
;********************亮度平滑处理*********************
LIGHT_SMOOTH:
MOV LDAT,#60H
LIGHT_SMOOTH_CIR_UP:
LCALL LIGHT_CTL
LCALL DELAY_SHORT
LCALL DELAY_SHORT
INC LDAT
MOV A,LDAT
CJNE A,#0A0H,LIGHT_SMOOTH_CIR_UP;亮度逐渐升高
LCALL DELAY_LONG;亮度保持
LIGHT_SMOOTH_CIR_DOWN:
LCALL LIGHT_CTL
LCALL DELAY_SHORT
LCALL DELAY_SHORT
DEC LDAT
MOV A,LDAT
CJNE A,#60H,LIGHT_SMOOTH_CIR_DOWN;亮度逐渐降低
RET
;调用LIGHT_SMOOTH,LCD亮度会逐渐增大,保持1S,然后降低
;*****************************************************
;*****************************************************
;不同扫描方式的转换^o^
DIS_TETRISS:
MOV PLCD,#00H
MOV DPTR,#TAB_TETRISS
MOV R2,#00H
DIS_TETRISS_CIR:
LCALL DIS_FILL
LCALL DIS_TETRISS_ADDRESSINC
INC R2
CJNE R2,#0C0H,DIS_TETRISS_CIR
RET
DIS_TETRISS_ADDRESSINC:
MOV A,PLCD
ANL A,#0F8H
RR A
RR A
RR A
INC A
MOV B,A
CLR CY
SUBB A,#00011000B
JB CY,DIS_TETRISS_ADDRESSINC_RIGHT
MOV B,#00H
MOV A,PLCD
INC A
MOV PLCD,A
DIS_TETRISS_ADDRESSINC_RIGHT:
ORL PLCD,#0F8H
MOV A,B
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -