⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tetriss.asm

📁 51单片机下俄罗斯方块游戏机设计
💻 ASM
📖 第 1 页 / 共 3 页
字号:
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 + -