查看: 7773|回復(fù): 1
收起左側(cè)

發(fā)一個(gè)用匯編寫LCD12864的俄羅斯方塊游戲

[復(fù)制鏈接]
ID:162136 發(fā)表于 2017-3-29 21:00 | 顯示全部樓層 |閱讀模式
先說明:1,游戲頁面是借鑒了網(wǎng)絡(luò)上的圖片的,本想用適合LCD12864的位置顯示,基于學(xué)習(xí)的目的所以高仿游戲頁面。
2,看過網(wǎng)上有的多是C語言寫的,所以特意用匯編編寫。
3,認(rèn)為程序?qū)懙貌缓谜?qǐng)不要罵,謝謝。
4,歡迎各位指點(diǎn)。
5,首次發(fā)貼,排版什么的基本都不會(huì),見諒。

在普中開發(fā)箱上的俄羅斯方塊

在普中開發(fā)箱上的俄羅斯方塊

在普中開發(fā)箱上的俄羅斯方塊

在普中開發(fā)箱上的俄羅斯方塊


匯編源碼:
  1. /*STC12 LCD1286動(dòng)態(tài)點(diǎn)陣
  2. 高128字節(jié)RAM只能間接尋址,特殊功能寄存器區(qū)只可直接尋址*/

  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                ;轉(zhuǎn)動(dòng)按鍵
  12.         KEY_DOW        EQU                P1.3                ;下降按鍵
  13.         KEY_SET        EQU                P1.4                ;設(shè)置按鍵

  14.         GDRAM_Y        DATA        30H                        ;LCD_GDRAM_Y軸數(shù)據(jù)
  15.         GDRAM_X        DATA        31H                        ;LCD_GDRAM_X軸數(shù)據(jù)

  16.         SCORE_G        DATA        32H                        ;計(jì)分個(gè)位
  17.         SCORE_S        DATA        33H                        ;計(jì)分十位
  18.         SCORE_B        DATA        34H                        ;計(jì)分百位
  19.         SCORE_Q        DATA        35H                        ;計(jì)分千位
  20.         SCORE_W        DATA        36H                        ;計(jì)分萬位

  21.         ELIM_NUM        DATA        37H                ;1次性消除的行數(shù) 0-4

  22.         SPEED_G        DATA        38H                        ;等級(jí)記錄數(shù)據(jù)

  23.         RAN_NUM        DATA        39H                        ;預(yù)覽區(qū)模型數(shù)據(jù)

  24.         RAN_FIGN        EQU        20H.0                ;生成隨機(jī)標(biāo)記
  25.         PRE_FIGN        EQU        20H.1                ;移入模型標(biāo)記
  26.         SCORE_FIGN        EQU        20H.2                ;分?jǐn)?shù)刷新標(biāo)記
  27.         SPEED_FIGN        EQU        20H.3                ;等級(jí)刷新標(biāo)記

  28.         POS_FIGN        EQU        20H.4                ;位置數(shù)據(jù)高低半字節(jié)定位

  29.         LEF_FIGN        EQU        20H.5                ;左移標(biāo)記,按鍵
  30.         RIG_FIGN        EQU        20H.6                ;右移標(biāo)記,按鍵
  31.         TUR_FIGN        EQU        20H.7                ;轉(zhuǎn)動(dòng)標(biāo)記,按鍵
  32.         DOW_FIGN        EQU        21H.0                ;下移標(biāo)記,按鍵
  33.         SET_FIGN        EQU        21H.1                ;設(shè)置標(biāo)記,頁面

  34.         HALF_FIGN        EQU        21H.2                ;上下半屏刷新標(biāo)記

  35.         REF_FIGN        EQU        21H.3                ;刷新標(biāo)記

  36.         LOST_FIGN        EQU        21H.4                ;游戲輸了,結(jié)束標(biāo)記

  37.         BEAT_FIGN        EQU        21H.5                ;游戲達(dá)到10W分,通關(guān)標(biāo)記

  38.         MOD_NUM        DATA        3AH                        ;移動(dòng)中模型的代碼
  39.         TUR_NUM        DATA        3BH                        ;移到中模型轉(zhuǎn)動(dòng)的代碼

  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                ;速度延時(shí)
  49.         SPEED_NUM        EQU                235                ;游戲速度調(diào)節(jié)

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

  51. ;計(jì)分用RAM位置0C0H-0DBH(27字節(jié)),等級(jí)數(shù)用RAM位置0E0H-0FB(27字節(jié))

  52.         ORG                00H
  53.         JMP                START
  54. ;        ORG                30H
  55. START:
  56.         MOV                R0,                #0FFH                                        /*清0片內(nèi)256Byte RAM*/
  57.         CLR                A
  58. ST1:
  59.         MOV                @R0,        A
  60.         DJNZ        R0,                ST1                                                ;12MHz 用時(shí)約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 用時(shí)約1.2ms
  70. MAIN:                                                                                /*開始*/
  71.         CALL        INIT                                                                                 
  72. ;        SETB        SET_FIGN                                                ;游戲開始先入設(shè)置頁面
  73.         MOV                SPEED_DEY,        #SPEED_NUM                        ;速度初始數(shù)據(jù)
  74. ;        MOV                SPEED_G,        #9                                        ;等級(jí)測(cè)試
  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                                                        ;程序運(yùn)行檢測(cè)
  82.         JMP                MN1

  83. SETTING:                                                                        /*速度設(shè)置頁面*/
  84.         CALL        SET_DIS                                                        ;設(shè)置顯示
  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                                ;軟件復(fù)位
  92. SG1:               
  93.         CALL        SET_KEYS                                                ;設(shè)置按鍵
  94.         JB                SET_FIGN,        SETTING
  95.         CALL        COME_GAME                                                ;回到游戲
  96.         RET
  97.                                                                                                           
  98. COME_GAME:                                                                        /*回到游戲 清除右邊的內(nèi)容*/
  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:                                                                        回到游戲 保留右邊內(nèi)容
  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:                                                                        /*設(shè)置頁面按鍵檢測(cè)*/
  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                                                        ;左按鍵 等級(jí)/速度+1
  136.         SETB        SPEED_FIGN                                                ;修改后標(biāo)記等級(jí)刷新標(biāo)記
  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                                                        ;右按鍵 等級(jí)/速度-1
  146.         SETB        SPEED_FIGN                                                ;修改后標(biāo)記等級(jí)刷新標(biāo)記
  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                                                ;設(shè)置頁面標(biāo)記復(fù)位
  154.         JNB                KEY_SET,        $
  155. SKS3:       
  156.         RET

  157. SET_DIS:                                                                        /*設(shè)置顯示*/
  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                        ;通關(guān)
  172.         JMP                SDS3
  173. SDS2:
  174.         JNB                LOST_FIGN,        SDS4
  175.         MOV                DPTR,        #TAB_CHINESE5                        ;結(jié)束
  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        '通關(guān)'
  210. TAB_CHINESE5:        DB        '結(jié)束'
  211. TAB_CHINESE6:        DB        'SPEED:'
  212. TAB_CHINESE7:        DB        '0123456789'

  213. OUT_LCD:                                                                        /*LCD顯示*/
  214. OUT_LCD_GDRAM:                                                                /*GDRAM顯示*/
  215.         CALL        CAL_SCORE                                                ;分?jǐn)?shù)處理
  216.         CALL        CAL_SPEED                                                ;等級(jí)數(shù)處理
  217.         MOV                A,                #34H                                       
  218.         CALL        LCD_WRITE_CMD                                        ;關(guān)GDRAM顯示
  219.         JNB                SCORE_FIGN,        OLG1
  220.         CALL        OUT_SCORE                                                ;刷新顯示分?jǐn)?shù)值
  221.         CLR                SCORE_FIGN
  222. OLG1:
  223.         JNB                SPEED_FIGN,        OLG2
  224.         CALL        OUT_SPEED                                                ;刷新顯示等級(jí)值
  225.         CLR                SPEED_FIGN
  226. OLG2:
  227.         JNB                RAN_FIGN,        OLG3                                        
  228.         CALL        CAL_MODEL_RAN                                        ;生成隨機(jī)模型                                                       
  229.         CALL        PRE_MODEL_RAN                                        ;寫入預(yù)覽隨機(jī)模型
  230.         SETB        REF_FIGN                                                ;刷新標(biāo)記
  231.         CLR                RAN_FIGN
  232. OLG3:
  233.         MOV                A,                ELIM_NUM
  234.         JZ                OLG4                                                        ;沒有消除跳轉(zhuǎn)
  235.         CALL        REFRESH_ALL                                                ;游戲全部刷新
  236.         MOV                ELIM_NUM,        #0
  237.         JMP                OLG5
  238. OLG4:
  239.         JNB                REF_FIGN,        OLG5                                ;模型沒有變動(dòng)跳轉(zhuǎn)   
  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                                        ;預(yù)覽模型傳到游戲        確定模型位置MODLE_POS       
  247.         CLR                PRE_FIGN
  248.         SETB        RAN_FIGN
  249. OLG6:
  250.         CALL        DRAW_POINTS                                                ;畫點(diǎn)
  251.         CALL        MOVE                                                        ;移動(dòng)
  252.         CALL        LOST                                                        ;檢查游戲是否結(jié)束
  253.         RET

  254. LOST:                                                                                /*檢查游戲是否結(jié)束*/
  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 跳轉(zhuǎn)
  270.         CLR                A
  271. RAP1:
  272.         MOV                R6,                A                                                ;行地址存入R6
  273. RAP3:
  274.         CALL        REFRESH_POS                                                ;刷新1個(gè)點(diǎn)
  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個(gè)點(diǎn)的1大行位置*/
  285.         RLC                A
  286.         MOV                HALF_FIGN,        C
  287.        


  288. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

0.png
下載:
51匯編俄羅斯方塊.rar (68.85 KB, 下載次數(shù): 68)

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:573484 發(fā)表于 2019-7-8 23:30 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

快速回復(fù) 返回頂部 返回列表