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

📄 tetriss.asm

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