先說明:1,游戲頁面是借鑒了網(wǎng)絡(luò)上的圖片的,本想用適合LCD12864的位置顯示,基于學(xué)習(xí)的目的所以高仿游戲頁面。
2,看過網(wǎng)上有的多是C語言寫的,所以特意用匯編編寫。
3,認為程序?qū)懙貌缓谜埐灰R,謝謝。
4,歡迎各位指點。
5,首次發(fā)貼,排版什么的基本都不會,見諒。
基于普中51單片機開發(fā)箱1.jpg (115.63 KB, 下載次數(shù): 112)
下載附件
在普中開發(fā)箱上的俄羅斯方塊
2017-3-29 20:47 上傳
基于普中51單片機開發(fā)箱2.jpg (117.4 KB, 下載次數(shù): 126)
下載附件
在普中開發(fā)箱上的俄羅斯方塊
2017-3-29 20:47 上傳
匯編源碼:
- /*STC12 LCD1286動態(tài)點陣
- 高128字節(jié)RAM只能間接尋址,特殊功能寄存器區(qū)只可直接尋址*/
- LCD_RS EQU P2.6 //LCD并口端口
- LCD_RW EQU P2.5
- LCD_EN EQU P2.7
- LCD_PSB EQU P3.2
- LCD_RST EQU P3.4
- LCD_PD EQU P0
- KEY_LEF EQU P1.0 ;左移按鍵
- KEY_RIG EQU P1.1 ;右稱按鍵
- KEY_TUR EQU P1.2 ;轉(zhuǎn)動按鍵
- KEY_DOW EQU P1.3 ;下降按鍵
- KEY_SET EQU P1.4 ;設(shè)置按鍵
- GDRAM_Y DATA 30H ;LCD_GDRAM_Y軸數(shù)據(jù)
- GDRAM_X DATA 31H ;LCD_GDRAM_X軸數(shù)據(jù)
- SCORE_G DATA 32H ;計分個位
- SCORE_S DATA 33H ;計分十位
- SCORE_B DATA 34H ;計分百位
- SCORE_Q DATA 35H ;計分千位
- SCORE_W DATA 36H ;計分萬位
- ELIM_NUM DATA 37H ;1次性消除的行數(shù) 0-4
- SPEED_G DATA 38H ;等級記錄數(shù)據(jù)
- RAN_NUM DATA 39H ;預(yù)覽區(qū)模型數(shù)據(jù)
- RAN_FIGN EQU 20H.0 ;生成隨機標記
- PRE_FIGN EQU 20H.1 ;移入模型標記
- SCORE_FIGN EQU 20H.2 ;分數(shù)刷新標記
- SPEED_FIGN EQU 20H.3 ;等級刷新標記
- POS_FIGN EQU 20H.4 ;位置數(shù)據(jù)高低半字節(jié)定位
- LEF_FIGN EQU 20H.5 ;左移標記,按鍵
- RIG_FIGN EQU 20H.6 ;右移標記,按鍵
- TUR_FIGN EQU 20H.7 ;轉(zhuǎn)動標記,按鍵
- DOW_FIGN EQU 21H.0 ;下移標記,按鍵
- SET_FIGN EQU 21H.1 ;設(shè)置標記,頁面
- HALF_FIGN EQU 21H.2 ;上下半屏刷新標記
- REF_FIGN EQU 21H.3 ;刷新標記
- LOST_FIGN EQU 21H.4 ;游戲輸了,結(jié)束標記
- BEAT_FIGN EQU 21H.5 ;游戲達到10W分,通關(guān)標記
- MOD_NUM DATA 3AH ;移動中模型的代碼
- TUR_NUM DATA 3BH ;移到中模型轉(zhuǎn)動的代碼
- BACK_P1 DATA 3CH ;0-15 POS_1備份
- BACK_P2 DATA 3DH ;0-15 POS_2備份
- BACK_P3 DATA 3EH ;0-9 POS_3備份
- BACK_P4 DATA 3FH ;0-9 POS_4備份
- POS_1 DATA 40H ;0-15 模型最上左位置
- POS_2 DATA 41H ;0-15
- POS_3 DATA 42H ;0-9
- POS_4 DATA 43H ;0-9 模型最下右位置
- SPEED_DEY DATA 44H ;速度延時
- SPEED_NUM EQU 235 ;游戲速度調(diào)節(jié)
- ISP_CONTR EQU 0C7H ;STC12C5A60S2的ISP/IAP控制寄存器地址
- ;計分用RAM位置0C0H-0DBH(27字節(jié)),等級數(shù)用RAM位置0E0H-0FB(27字節(jié))
- ORG 00H
- JMP START
- ; ORG 30H
- START:
- MOV R0, #0FFH /*清0片內(nèi)256Byte RAM*/
- CLR A
- ST1:
- MOV @R0, A
- DJNZ R0, ST1 ;12MHz 用時約0.15ms
- MOV SP, #7FH
- /* */
- MOV DPTR, #0000H /*清0片外1024Byte RAM(0000H-03FFH)*/
- ST2:
- CLR A
- MOVX @DPTR, A
- INC DPTR
- MOV A, DPH
- CJNE A, #04H, ST2 ;12MHz 用時約1.2ms
- MAIN: /*開始*/
- CALL INIT
- ; SETB SET_FIGN ;游戲開始先入設(shè)置頁面
- MOV SPEED_DEY, #SPEED_NUM ;速度初始數(shù)據(jù)
- ; MOV SPEED_G, #9 ;等級測試
- MN1:
- MOV A, #40
- CALL DELAY
- CALL OUT_LCD
- JNB SET_FIGN, MN1
- CALL SETTING
- ; CPL P2.0 ;程序運行檢測
- JMP MN1
- SETTING: /*速度設(shè)置頁面*/
- CALL SET_DIS ;設(shè)置顯示
- JNB LOST_FIGN, SG1
- JB KEY_SET, SETTING
- MOV A, #50
- CALL DELAY
- JB KEY_SET, SETTING
- JNB KEY_SET, $
- ORL ISP_CONTR, #20H ;軟件復(fù)位
- SG1:
- CALL SET_KEYS ;設(shè)置按鍵
- JB SET_FIGN, SETTING
- CALL COME_GAME ;回到游戲
- RET
-
- COME_GAME: /*回到游戲 清除右邊的內(nèi)容*/
- MOV R1, #98H+5
- MOV R2, #90H+5
- MOV R3, #88H+5
- MOV R4, #80H+5
- MOV R0, #4
- CGE1:
- MOV A, @R0
- CALL LCD_WRITE_CMD
- MOV R7, #6
- MOV A, #' '
- CGE2:
- CALL LCD_WRITE_DAT
- DJNZ R7, CGE2
- DJNZ R0, CGE1
- RET
- /*
- COME_GAME: 回到游戲 保留右邊內(nèi)容
- MOV DPTR, #TAB_CHINESE3 ;開始
- MOV A, #90H+6
- CALL LCD_WRITE_CMD
- MOV R7, #4
- CGE1:
- CLR A
- MOVC A, @A+DPTR
- INC DPTR
- CALL LCD_WRITE_DAT
- DJNZ R7, CGE1
- RET */
- SET_KEYS: /*設(shè)置頁面按鍵檢測*/
- JB KEY_LEF, SKS1
- MOV A, #20
- CALL DELAY
- JB KEY_LEF, SKS1
- MOV A, SPEED_G
- XRL A, #9
- JZ SKS1
- INC SPEED_G ;左按鍵 等級/速度+1
- SETB SPEED_FIGN ;修改后標記等級刷新標記
- JNB KEY_LEF, $
- SKS1:
- JB KEY_RIG, SKS2
- MOV A, #20
- CALL DELAY
- JB KEY_RIG, SKS2
- MOV A, SPEED_G
- JZ SKS2
- DEC SPEED_G ;右按鍵 等級/速度-1
- SETB SPEED_FIGN ;修改后標記等級刷新標記
- JNB KEY_RIG, $
- SKS2:
- JB KEY_SET, SKS3
- MOV A, #50
- CALL DELAY
- JB KEY_SET, SKS3
- CLR SET_FIGN ;設(shè)置頁面標記復(fù)位
- JNB KEY_SET, $
- SKS3:
- RET
- SET_DIS: /*設(shè)置顯示*/
- MOV A, #30H
- CALL LCD_WRITE_CMD
- MOV DPTR, #TAB_CHINESE1 ;游戲
- MOV A, #80H+5
- CALL LCD_WRITE_CMD
- MOV R7, #5
- SDS1:
- CLR A
- MOVC A, @A+DPTR
- INC DPTR
- CALL LCD_WRITE_DAT
- DJNZ R7, SDS1
- JNB BEAT_FIGN, SDS2
- MOV DPTR, #TAB_CHINESE4 ;通關(guān)
- JMP SDS3
- SDS2:
- JNB LOST_FIGN, SDS4
- MOV DPTR, #TAB_CHINESE5 ;結(jié)束
- JMP SDS3
- SDS4:
- MOV DPTR, #TAB_CHINESE2 ;暫停
- SDS3:
- MOV A, #90H+6
- CALL LCD_WRITE_CMD
- MOV R7, #4
- SDS5:
- CLR A
- MOVC A, @A+DPTR
- INC DPTR
- CALL LCD_WRITE_DAT
- DJNZ R7, SDS5
- MOV DPTR, #TAB_CHINESE6 ;‘SPEED’
- MOV A, #88H+5
- CALL LCD_WRITE_CMD
- MOV R7, #6
- SDS6:
- CLR A
- MOVC A, @A+DPTR
- INC DPTR
- CALL LCD_WRITE_DAT
- DJNZ R7, SDS6
- MOV DPTR, #TAB_CHINESE7 ;'0123456789'
- MOV A, #98H+6
- CALL LCD_WRITE_CMD
- MOV A, SPEED_G
- MOVC A, @A+DPTR
- CALL LCD_WRITE_DAT
- RET
- TAB_CHINESE1: DB '游戲:'
- TAB_CHINESE2: DB '暫停'
- TAB_CHINESE3: DB '開始'
- TAB_CHINESE4: DB '通關(guān)'
- TAB_CHINESE5: DB '結(jié)束'
- TAB_CHINESE6: DB 'SPEED:'
- TAB_CHINESE7: DB '0123456789'
- OUT_LCD: /*LCD顯示*/
- OUT_LCD_GDRAM: /*GDRAM顯示*/
- CALL CAL_SCORE ;分數(shù)處理
- CALL CAL_SPEED ;等級數(shù)處理
- MOV A, #34H
- CALL LCD_WRITE_CMD ;關(guān)GDRAM顯示
- JNB SCORE_FIGN, OLG1
- CALL OUT_SCORE ;刷新顯示分數(shù)值
- CLR SCORE_FIGN
- OLG1:
- JNB SPEED_FIGN, OLG2
- CALL OUT_SPEED ;刷新顯示等級值
- CLR SPEED_FIGN
- OLG2:
- JNB RAN_FIGN, OLG3
- CALL CAL_MODEL_RAN ;生成隨機模型
- CALL PRE_MODEL_RAN ;寫入預(yù)覽隨機模型
- SETB REF_FIGN ;刷新標記
- CLR RAN_FIGN
- OLG3:
- MOV A, ELIM_NUM
- JZ OLG4 ;沒有消除跳轉(zhuǎn)
- CALL REFRESH_ALL ;游戲全部刷新
- MOV ELIM_NUM, #0
- JMP OLG5
- OLG4:
- JNB REF_FIGN, OLG5 ;模型沒有變動跳轉(zhuǎn)
- CALL REFRESH_ALL_POS ;游戲局部刷新
- CLR REF_FIGN
- OLG5:
- MOV A, #36H
- CALL LCD_WRITE_CMD ;開GDRAM顯示
- JNB PRE_FIGN, OLG6
- CALL MODEL_OUT_GAME ;預(yù)覽模型傳到游戲 確定模型位置MODLE_POS
- CLR PRE_FIGN
- SETB RAN_FIGN
- OLG6:
- CALL DRAW_POINTS ;畫點
- CALL MOVE ;移動
- CALL LOST ;檢查游戲是否結(jié)束
- RET
- LOST: /*檢查游戲是否結(jié)束*/
- JNB PRE_FIGN, LT1
- MOV R0, #8
- MOVX A, @R0
- JZ LT1
- SETB SET_FIGN
- SETB LOST_FIGN
- LT1:
- RET
- REFRESH_ALL_POS: /*刷新 BACK_P1到POS_4 大行位置*/
- MOV A, POS_4
- ANL A, #0F0H
- MOV R7, A ;最低POS_4存入R7
- CLR C
- SUBB A, #40H
- JNC RAP1 ;A>=30H 跳轉(zhuǎn)
- CLR A
- RAP1:
- MOV R6, A ;行地址存入R6
- RAP3:
- CALL REFRESH_POS ;刷新1個點
- MOV A, R7
- XRL A, R6
- JZ RAP2
- MOV A, R6
- ADD A, #10H
- MOV R6, A
- JMP RAP3
- RAP2:
- RET
- REFRESH_POS: /*刷新1個點的1大行位置*/
- RLC A
- MOV HALF_FIGN, C
-
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
0.png (43.03 KB, 下載次數(shù): 99)
下載附件
2017-3-29 21:13 上傳
下載:
51匯編俄羅斯方塊.rar
(68.85 KB, 下載次數(shù): 68)
2017-3-29 20:51 上傳
點擊文件名下載附件
51匯編俄羅斯方塊 下載積分: 黑幣 -5
|