先说明:1,游戏页面是借鉴了网络上的图片的,本想用适合LCD12864的位置显示,基于学习的目的所以高仿游戏页面。
2,看过网上有的多是C语言写的,所以特意用汇编编写。
3,认为程序写得不好请不要骂,谢谢。
4,欢迎各位指点。
5,首次发贴,排版什么的基本都不会,见谅。
汇编源码:
- /*STC12 LCD1286动态点阵
- 高128字节RAM只能间接寻址,特殊功能寄存器区只可直接寻址*/
- 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 ;转动按键
- KEY_DOW EQU P1.3 ;下降按键
- KEY_SET EQU P1.4 ;设置按键
- GDRAM_Y DATA 30H ;LCD_GDRAM_Y轴数据
- GDRAM_X DATA 31H ;LCD_GDRAM_X轴数据
- 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次性消除的行数 0-4
- SPEED_G DATA 38H ;等级记录数据
- RAN_NUM DATA 39H ;预览区模型数据
- RAN_FIGN EQU 20H.0 ;生成随机标记
- PRE_FIGN EQU 20H.1 ;移入模型标记
- SCORE_FIGN EQU 20H.2 ;分数刷新标记
- SPEED_FIGN EQU 20H.3 ;等级刷新标记
- POS_FIGN EQU 20H.4 ;位置数据高低半字节定位
- LEF_FIGN EQU 20H.5 ;左移标记,按键
- RIG_FIGN EQU 20H.6 ;右移标记,按键
- TUR_FIGN EQU 20H.7 ;转动标记,按键
- DOW_FIGN EQU 21H.0 ;下移标记,按键
- SET_FIGN EQU 21H.1 ;设置标记,页面
- HALF_FIGN EQU 21H.2 ;上下半屏刷新标记
- REF_FIGN EQU 21H.3 ;刷新标记
- LOST_FIGN EQU 21H.4 ;游戏输了,结束标记
- BEAT_FIGN EQU 21H.5 ;游戏达到10W分,通关标记
- MOD_NUM DATA 3AH ;移动中模型的代码
- TUR_NUM DATA 3BH ;移到中模型转动的代码
- 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 ;游戏速度调节
- ISP_CONTR EQU 0C7H ;STC12C5A60S2的ISP/IAP控制寄存器地址
- ;计分用RAM位置0C0H-0DBH(27字节),等级数用RAM位置0E0H-0FB(27字节)
- ORG 00H
- JMP START
- ; ORG 30H
- START:
- MOV R0, #0FFH /*清0片内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 ;游戏开始先入设置页面
- MOV SPEED_DEY, #SPEED_NUM ;速度初始数据
- ; 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: /*速度设置页面*/
- CALL SET_DIS ;设置显示
- JNB LOST_FIGN, SG1
- JB KEY_SET, SETTING
- MOV A, #50
- CALL DELAY
- JB KEY_SET, SETTING
- JNB KEY_SET, $
- ORL ISP_CONTR, #20H ;软件复位
- SG1:
- CALL SET_KEYS ;设置按键
- JB SET_FIGN, SETTING
- CALL COME_GAME ;回到游戏
- RET
-
- COME_GAME: /*回到游戏 清除右边的内容*/
- 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: 回到游戏 保留右边内容
- 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: /*设置页面按键检测*/
- 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 ;设置页面标记复位
- JNB KEY_SET, $
- SKS3:
- RET
- SET_DIS: /*设置显示*/
- 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 ;通关
- JMP SDS3
- SDS2:
- JNB LOST_FIGN, SDS4
- MOV DPTR, #TAB_CHINESE5 ;结束
- 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 '通关'
- TAB_CHINESE5: DB '结束'
- TAB_CHINESE6: DB 'SPEED:'
- TAB_CHINESE7: DB '0123456789'
- OUT_LCD: /*LCD显示*/
- OUT_LCD_GDRAM: /*GDRAM显示*/
- CALL CAL_SCORE ;分数处理
- CALL CAL_SPEED ;等级数处理
- MOV A, #34H
- CALL LCD_WRITE_CMD ;关GDRAM显示
- JNB SCORE_FIGN, OLG1
- CALL OUT_SCORE ;刷新显示分数值
- 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 ;写入预览随机模型
- SETB REF_FIGN ;刷新标记
- CLR RAN_FIGN
- OLG3:
- MOV A, ELIM_NUM
- JZ OLG4 ;没有消除跳转
- CALL REFRESH_ALL ;游戏全部刷新
- MOV ELIM_NUM, #0
- JMP OLG5
- OLG4:
- JNB REF_FIGN, OLG5 ;模型没有变动跳转
- CALL REFRESH_ALL_POS ;游戏局部刷新
- CLR REF_FIGN
- OLG5:
- MOV A, #36H
- CALL LCD_WRITE_CMD ;开GDRAM显示
- JNB PRE_FIGN, OLG6
- CALL MODEL_OUT_GAME ;预览模型传到游戏 确定模型位置MODLE_POS
- CLR PRE_FIGN
- SETB RAN_FIGN
- OLG6:
- CALL DRAW_POINTS ;画点
- CALL MOVE ;移动
- CALL LOST ;检查游戏是否结束
- RET
- LOST: /*检查游戏是否结束*/
- 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 跳转
- 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黑下载附件…………
复制代码
下载:
51汇编俄罗斯方块.rar
(68.85 KB, 下载次数: 68)
|