找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6910|回复: 1
收起左侧

发一个用汇编写LCD12864的俄罗斯方块游戏

[复制链接]
ID:162136 发表于 2017-3-29 21:00 | 显示全部楼层 |阅读模式
先说明:1,游戏页面是借鉴了网络上的图片的,本想用适合LCD12864的位置显示,基于学习的目的所以高仿游戏页面。
2,看过网上有的多是C语言写的,所以特意用汇编编写。
3,认为程序写得不好请不要骂,谢谢。
4,欢迎各位指点。
5,首次发贴,排版什么的基本都不会,见谅。

在普中开发箱上的俄罗斯方块

在普中开发箱上的俄罗斯方块

在普中开发箱上的俄罗斯方块

在普中开发箱上的俄罗斯方块


汇编源码:
  1. /*STC12 LCD1286动态点阵
  2. 高128字节RAM只能间接寻址,特殊功能寄存器区只可直接寻址*/

  3.         LCD_RS        EQU                P2.6                //LCD并口端口
  4.         LCD_RW        EQU                P2.5
  5.         LCD_EN        EQU                P2.7
  6.         LCD_PSB        EQU                P3.2
  7.         LCD_RST        EQU                P3.4
  8.         LCD_PD        EQU                P0

  9.         KEY_LEF        EQU                P1.0                ;左移按键
  10.         KEY_RIG        EQU                P1.1                ;右称按键
  11.         KEY_TUR        EQU                P1.2                ;转动按键
  12.         KEY_DOW        EQU                P1.3                ;下降按键
  13.         KEY_SET        EQU                P1.4                ;设置按键

  14.         GDRAM_Y        DATA        30H                        ;LCD_GDRAM_Y轴数据
  15.         GDRAM_X        DATA        31H                        ;LCD_GDRAM_X轴数据

  16.         SCORE_G        DATA        32H                        ;计分个位
  17.         SCORE_S        DATA        33H                        ;计分十位
  18.         SCORE_B        DATA        34H                        ;计分百位
  19.         SCORE_Q        DATA        35H                        ;计分千位
  20.         SCORE_W        DATA        36H                        ;计分万位

  21.         ELIM_NUM        DATA        37H                ;1次性消除的行数 0-4

  22.         SPEED_G        DATA        38H                        ;等级记录数据

  23.         RAN_NUM        DATA        39H                        ;预览区模型数据

  24.         RAN_FIGN        EQU        20H.0                ;生成随机标记
  25.         PRE_FIGN        EQU        20H.1                ;移入模型标记
  26.         SCORE_FIGN        EQU        20H.2                ;分数刷新标记
  27.         SPEED_FIGN        EQU        20H.3                ;等级刷新标记

  28.         POS_FIGN        EQU        20H.4                ;位置数据高低半字节定位

  29.         LEF_FIGN        EQU        20H.5                ;左移标记,按键
  30.         RIG_FIGN        EQU        20H.6                ;右移标记,按键
  31.         TUR_FIGN        EQU        20H.7                ;转动标记,按键
  32.         DOW_FIGN        EQU        21H.0                ;下移标记,按键
  33.         SET_FIGN        EQU        21H.1                ;设置标记,页面

  34.         HALF_FIGN        EQU        21H.2                ;上下半屏刷新标记

  35.         REF_FIGN        EQU        21H.3                ;刷新标记

  36.         LOST_FIGN        EQU        21H.4                ;游戏输了,结束标记

  37.         BEAT_FIGN        EQU        21H.5                ;游戏达到10W分,通关标记

  38.         MOD_NUM        DATA        3AH                        ;移动中模型的代码
  39.         TUR_NUM        DATA        3BH                        ;移到中模型转动的代码

  40.         BACK_P1        DATA        3CH                        ;0-15        POS_1备份
  41.         BACK_P2        DATA        3DH                        ;0-15        POS_2备份
  42.         BACK_P3        DATA        3EH                        ;0-9        POS_3备份
  43.         BACK_P4        DATA        3FH                        ;0-9        POS_4备份

  44.         POS_1        DATA        40H                        ;0-15        模型最上左位置
  45.         POS_2        DATA        41H                        ;0-15       
  46.         POS_3        DATA        42H                        ;0-9
  47.         POS_4        DATA        43H                        ;0-9        模型最下右位置

  48.         SPEED_DEY        DATA        44H                ;速度延时
  49.         SPEED_NUM        EQU                235                ;游戏速度调节

  50.         ISP_CONTR        EQU                0C7H        ;STC12C5A60S2的ISP/IAP控制寄存器地址

  51. ;计分用RAM位置0C0H-0DBH(27字节),等级数用RAM位置0E0H-0FB(27字节)

  52.         ORG                00H
  53.         JMP                START
  54. ;        ORG                30H
  55. START:
  56.         MOV                R0,                #0FFH                                        /*清0片内256Byte RAM*/
  57.         CLR                A
  58. ST1:
  59.         MOV                @R0,        A
  60.         DJNZ        R0,                ST1                                                ;12MHz 用时约0.15ms
  61.         MOV                SP,                #7FH                                                       
  62. /*                                                                                         */  
  63.         MOV                DPTR,        #0000H                                        /*清0片外1024Byte RAM(0000H-03FFH)*/
  64. ST2:
  65.         CLR                A                    
  66.         MOVX        @DPTR,        A
  67.         INC                DPTR
  68.         MOV                A,                DPH
  69.         CJNE        A,                #04H,        ST2                                ;12MHz 用时约1.2ms
  70. MAIN:                                                                                /*开始*/
  71.         CALL        INIT                                                                                 
  72. ;        SETB        SET_FIGN                                                ;游戏开始先入设置页面
  73.         MOV                SPEED_DEY,        #SPEED_NUM                        ;速度初始数据
  74. ;        MOV                SPEED_G,        #9                                        ;等级测试
  75. MN1:
  76.         MOV                A,                #40
  77.         CALL        DELAY
  78.         CALL        OUT_LCD                  
  79.         JNB                SET_FIGN,        MN1
  80.         CALL        SETTING                                                                                 
  81. ;        CPL                P2.0                                                        ;程序运行检测
  82.         JMP                MN1

  83. SETTING:                                                                        /*速度设置页面*/
  84.         CALL        SET_DIS                                                        ;设置显示
  85.         JNB                LOST_FIGN,        SG1
  86.         JB                KEY_SET,        SETTING
  87.         MOV                A,                #50
  88.         CALL        DELAY
  89.         JB                KEY_SET,        SETTING
  90.         JNB                KEY_SET,        $
  91.         ORL                ISP_CONTR,        #20H                                ;软件复位
  92. SG1:               
  93.         CALL        SET_KEYS                                                ;设置按键
  94.         JB                SET_FIGN,        SETTING
  95.         CALL        COME_GAME                                                ;回到游戏
  96.         RET
  97.                                                                                                           
  98. COME_GAME:                                                                        /*回到游戏 清除右边的内容*/
  99.         MOV                R1,                #98H+5
  100.         MOV                R2,                #90H+5
  101.         MOV                R3,                #88H+5
  102.         MOV                R4,                #80H+5
  103.         MOV                R0,                #4
  104. CGE1:
  105.         MOV                A,                @R0
  106.         CALL        LCD_WRITE_CMD
  107.         MOV                R7,                #6
  108.         MOV                A,                #' '                 
  109. CGE2:
  110.         CALL        LCD_WRITE_DAT
  111.         DJNZ        R7,                CGE2
  112.         DJNZ        R0,                CGE1
  113.         RET                                                                                                  
  114.                                                                                         /*
  115. COME_GAME:                                                                        回到游戏 保留右边内容
  116.         MOV                DPTR,        #TAB_CHINESE3                        ;开始
  117.         MOV                A,                #90H+6
  118.         CALL        LCD_WRITE_CMD
  119.         MOV                R7,                #4
  120. CGE1:
  121.         CLR                A
  122.         MOVC        A,                @A+DPTR
  123.         INC                DPTR
  124.         CALL        LCD_WRITE_DAT
  125.         DJNZ        R7,                CGE1
  126.         RET                                                                                                   */

  127. SET_KEYS:                                                                        /*设置页面按键检测*/
  128.         JB                KEY_LEF,        SKS1                               
  129.         MOV                A,                #20
  130.         CALL        DELAY
  131.         JB                KEY_LEF,        SKS1
  132.         MOV                A,                SPEED_G
  133.         XRL                A,                #9
  134.         JZ                SKS1
  135.         INC                SPEED_G                                                        ;左按键 等级/速度+1
  136.         SETB        SPEED_FIGN                                                ;修改后标记等级刷新标记
  137.         JNB                KEY_LEF,        $
  138. SKS1:
  139.         JB                KEY_RIG,        SKS2
  140.         MOV                A,                #20
  141.         CALL        DELAY
  142.         JB                KEY_RIG,        SKS2
  143.         MOV                A,                SPEED_G
  144.         JZ                SKS2
  145.         DEC                SPEED_G                                                        ;右按键 等级/速度-1
  146.         SETB        SPEED_FIGN                                                ;修改后标记等级刷新标记
  147.         JNB                KEY_RIG,        $
  148. SKS2:
  149.         JB                KEY_SET,        SKS3
  150.         MOV                A,                #50
  151.         CALL        DELAY
  152.         JB                KEY_SET,        SKS3
  153.         CLR                SET_FIGN                                                ;设置页面标记复位
  154.         JNB                KEY_SET,        $
  155. SKS3:       
  156.         RET

  157. SET_DIS:                                                                        /*设置显示*/
  158.         MOV                A,                #30H
  159.         CALL        LCD_WRITE_CMD
  160.         MOV                DPTR,        #TAB_CHINESE1                        ;游戏
  161.         MOV                A,                #80H+5
  162.         CALL        LCD_WRITE_CMD
  163.         MOV                R7,                #5
  164. SDS1:
  165.         CLR                A
  166.         MOVC        A,                @A+DPTR
  167.         INC                DPTR
  168.         CALL        LCD_WRITE_DAT
  169.         DJNZ        R7,                SDS1
  170.         JNB                BEAT_FIGN,        SDS2
  171.         MOV                DPTR,        #TAB_CHINESE4                        ;通关
  172.         JMP                SDS3
  173. SDS2:
  174.         JNB                LOST_FIGN,        SDS4
  175.         MOV                DPTR,        #TAB_CHINESE5                        ;结束
  176.         JMP                SDS3
  177. SDS4:
  178.         MOV                DPTR,        #TAB_CHINESE2                        ;暂停
  179. SDS3:
  180.         MOV                A,                #90H+6
  181.         CALL        LCD_WRITE_CMD
  182.         MOV                R7,                #4
  183. SDS5:
  184.         CLR                A
  185.         MOVC        A,                @A+DPTR
  186.         INC                DPTR
  187.         CALL        LCD_WRITE_DAT
  188.         DJNZ        R7,                SDS5
  189.         MOV                DPTR,        #TAB_CHINESE6                        ;‘SPEED’
  190.         MOV                A,                #88H+5
  191.         CALL        LCD_WRITE_CMD
  192.         MOV                R7,                #6
  193. SDS6:
  194.         CLR                A
  195.         MOVC        A,                @A+DPTR
  196.         INC                DPTR
  197.         CALL        LCD_WRITE_DAT
  198.         DJNZ        R7,                SDS6
  199.         MOV                DPTR,        #TAB_CHINESE7                        ;'0123456789'
  200.         MOV                A,                #98H+6
  201.         CALL        LCD_WRITE_CMD
  202.         MOV                A,                SPEED_G
  203.         MOVC        A,                @A+DPTR
  204.         CALL        LCD_WRITE_DAT
  205.         RET

  206. TAB_CHINESE1:        DB        '游戏:'
  207. TAB_CHINESE2:        DB        '暂停'
  208. TAB_CHINESE3:        DB        '开始'
  209. TAB_CHINESE4:        DB        '通关'
  210. TAB_CHINESE5:        DB        '结束'
  211. TAB_CHINESE6:        DB        'SPEED:'
  212. TAB_CHINESE7:        DB        '0123456789'

  213. OUT_LCD:                                                                        /*LCD显示*/
  214. OUT_LCD_GDRAM:                                                                /*GDRAM显示*/
  215.         CALL        CAL_SCORE                                                ;分数处理
  216.         CALL        CAL_SPEED                                                ;等级数处理
  217.         MOV                A,                #34H                                       
  218.         CALL        LCD_WRITE_CMD                                        ;关GDRAM显示
  219.         JNB                SCORE_FIGN,        OLG1
  220.         CALL        OUT_SCORE                                                ;刷新显示分数值
  221.         CLR                SCORE_FIGN
  222. OLG1:
  223.         JNB                SPEED_FIGN,        OLG2
  224.         CALL        OUT_SPEED                                                ;刷新显示等级值
  225.         CLR                SPEED_FIGN
  226. OLG2:
  227.         JNB                RAN_FIGN,        OLG3                                        
  228.         CALL        CAL_MODEL_RAN                                        ;生成随机模型                                                       
  229.         CALL        PRE_MODEL_RAN                                        ;写入预览随机模型
  230.         SETB        REF_FIGN                                                ;刷新标记
  231.         CLR                RAN_FIGN
  232. OLG3:
  233.         MOV                A,                ELIM_NUM
  234.         JZ                OLG4                                                        ;没有消除跳转
  235.         CALL        REFRESH_ALL                                                ;游戏全部刷新
  236.         MOV                ELIM_NUM,        #0
  237.         JMP                OLG5
  238. OLG4:
  239.         JNB                REF_FIGN,        OLG5                                ;模型没有变动跳转   
  240.         CALL        REFRESH_ALL_POS                                        ;游戏局部刷新
  241.         CLR                REF_FIGN
  242. OLG5:
  243.         MOV                A,                #36H
  244.         CALL        LCD_WRITE_CMD                                        ;开GDRAM显示
  245.         JNB                PRE_FIGN,        OLG6
  246.         CALL        MODEL_OUT_GAME                                        ;预览模型传到游戏        确定模型位置MODLE_POS       
  247.         CLR                PRE_FIGN
  248.         SETB        RAN_FIGN
  249. OLG6:
  250.         CALL        DRAW_POINTS                                                ;画点
  251.         CALL        MOVE                                                        ;移动
  252.         CALL        LOST                                                        ;检查游戏是否结束
  253.         RET

  254. LOST:                                                                                /*检查游戏是否结束*/
  255.         JNB                PRE_FIGN,        LT1
  256.         MOV                R0,                #8
  257.         MOVX        A,                @R0
  258.         JZ                LT1
  259.         SETB        SET_FIGN
  260.         SETB        LOST_FIGN
  261. LT1:
  262.         RET

  263. REFRESH_ALL_POS:                                                        /*刷新 BACK_P1到POS_4 大行位置*/
  264.         MOV                A,                POS_4
  265.         ANL                A,                #0F0H
  266.         MOV                R7,                A                                                ;最低POS_4存入R7
  267.         CLR                C
  268.         SUBB        A,                #40H
  269.         JNC                RAP1                                                        ;A>=30H 跳转
  270.         CLR                A
  271. RAP1:
  272.         MOV                R6,                A                                                ;行地址存入R6
  273. RAP3:
  274.         CALL        REFRESH_POS                                                ;刷新1个点
  275.         MOV                A,                R7
  276.         XRL                A,                R6
  277.         JZ                RAP2
  278.         MOV                A,                R6
  279.         ADD                A,                #10H
  280.         MOV                R6,                A
  281.         JMP                RAP3
  282. RAP2:
  283.         RET                                                                                         

  284. REFRESH_POS:                                                                /*刷新1个点的1大行位置*/
  285.         RLC                A
  286.         MOV                HALF_FIGN,        C
  287.        


  288. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

0.png
下载:
51汇编俄罗斯方块.rar (68.85 KB, 下载次数: 68)
回复

使用道具 举报

ID:573484 发表于 2019-7-8 23:30 | 显示全部楼层
感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表