点阵制作的俄罗斯方块游戏
- 格式:doc
- 大小:61.00 KB
- 文档页数:8
汇编俄罗斯方块8.8点阵纯为个人思路,无特殊,惊人语句…?初学完的;程序功能:最原始简单版俄罗斯方块;硬件连接:接双色点阵;晶振型号: 12M;单片机: STC89C52;编写时间:;编程人:HANG BIT P2.0 ;点阵行输入HW BITP2.1HZ BITP2.2LIE BIT P2.3 ;点阵列输入LW BIT P2.4LZ BIT P2.5WEI BITP2.6DUAN BIT P2.7XIAN EQU P1BiaoX BIT20H.0Biao_z BIT 20H.1;按键是否按下标志Biao_y BIT 20H.2 Biao_x BIT 20H.3Dou_z BIT 20H.4;按键相应标志位Ying_z BIT 20H.5Dou_y BIT 20H.6Ying_y BIT 20H.7Dou_x BIT 21H.0Ying_x BIT 21H.1Biao_ZY BIT 21H.2Biao_zt BIT 21H.3 ;开始、暂停标志KEY_z BIT P0.0;左、右、旋转按键KEY_y BIT P0.1KEY_x BIT P0.2ORG 0000HAJMP StartORG 0003HAJMP Int0_serORG 000BHAJMP T0_serORG 0030H*************************JStart:MOV R0,#08HMOV R1,#51HMOV R3,#03HMOV R4,#08H46H,#9940H,#03H30H,#0FEH33H,#0FEH37H,#80HTMOD,#01HMOV TH0,#(65536-10000) / 256 MOV TL0,#(65536-10000) MOD 256SETB EASETB EX0SETB ET0SETB IT0SETB TR0***************************** Main:CALL Zhanting ;暂停响应CALL Xianshi ;点阵显示CALL CMkey_z ;左移按键CALL CMkey_y ;右移按键CALL CMkey_x ;旋转按键CALL Panduan_z;判断是否可以左移CALL Panduan_y;判断是否可以右移// MOVMOVMOVMOVMOVMOVCALL Panduan_x ;判断是否可以旋转CALL Panduan_xia;判断是否可以下移CALL Panduan_xh ;判断消行CALL Saomiao_xh ;扫描消行CALL Jifen ;计算分值CALL JifenXianshi ;分值显示ORL PCON,#01HAJMP Main***************************** Zhanting:JB Biao_zt,Out_zt ;判断是否暂停Zhanti: MOV A,37H ;显示 STARTRLC AMOV 37H,AMOV LIE,CCLR LWSETB LWDJNZ R0,ZhantiMOV R0,#08HCLR LZMOV A,37HRLC ARR AMOV 37H,AZhan:SETB HANGCLR HWSETB HWDJNZ R0,ZhanMOV R0,#08HMOV A,38HINC 38HMOV DPTR,#TABZMOVC A,@A+DPTRMOV 39H,A Zhant:MOV A,39HRLC AMOV 39H,AMOV HANG,CCLR HWSETB HWDJNZ R0,Zhant MOV R0,#08HCLR HZSETB HZCALL DelayCALL Delay Qing: SETB HANGCLR HWSETB HWDJNZ R0,QingMOV R0,#08H Qing1: SETB HANGCLR HWSETB HWDJNZ R0,Qing1 MOV R0,#08HCLR HZDJNZ R4,Zhanti MOV R4,#08HCLR CYMOV A,38HSUBB A,#08HMOV 38H,A// MOV 38H,#00H MOV A,44HMOV 34H,#00HCJNE A,#10,Zhanting INC 38HMOV 44H,#00HMOV A,38HCJNE A,#31,Zhanting MOV 38H,#00HAJMP ZhantingOut_zt:RET************************** ***JXianshi:;移动积木显示CLR HWSETB HWDJNZ R0,XianshiMOV R0,#08H Loop: MOV A,30HRLC AMOV 30H,AMOV HANG,CCLR HWSETB HWDJNZ R0,LoopMOV R0,#08HCLR HZSETB HZMOV A,30HRLC ARL AMOV 30H,ACALL XingzMOV A,31HMOVC A,@A+DPTRMOV 32H,ACALL HengyiLoop1:MOV A,32HRLC AMOV 32H,AMOV LIE,CCLR LWSETB LWDJNZ R0,Loop1MOV R0,#08HCLR LZSETB LZCALL DelayCALL QingpingBeijing: ;背景显示SETB HANG CLR HWDJNZ R0,BeijingMOV R0,#08H Loop3:MOV A,33HRLC AMOV 33H,AMOV HANG,CCLR HWSETB HWDJNZ R0,Loop3MOV R0,#08HCLR HZSETB HZMOV A,33HRLC ARL AMOV 33H,AMOV A,@R1MOV 50H,A Loop2: RLC AMOV 50H,AMOV LIE,CCLR LWSETB LWDJNZ R0,Loop2MOV R0,#08HINC R1CLR LZSETB LZCALL DelayCALL Qingping CJNE R1,#59H,Xianshi0 MOV R1,#51HMOV 31H,#00HRETXianshi0:AJMP Xianshi确认显示形状********** **Xingz:MOV A,40HRET S1: CJNECALLRET S2: CJNECALLRET S3: CJNECALLRET S4: CJNECALLRET S5: CJNECALLRET S6: CALLRET Xuanz1:MOV A,#1,S2 Xuanz1 A,#2,S3 Xuanz2A,#3,S4 Xuanz3A,#4,S5 Xuanz4A,#5,S6 Xuanz5 Xuanz6A,41HRETXu1:CJNE A,#2,Zhuan1 MOV DPTR,#TAB1 RETZhuan1:MOV DPTR,#TAB1_1 RETXuanz2:MOV A,41HCJNE A,#0,Zhuan2_1 MOV DPTR,#TAB2 RETZhuan2_1:CJNE A,#1,Zhuan2_2 MOV DPTR,#TAB2_1 RETZhuan2_2:CJNE A,#2,Zhuan2_3 MOV DPTR,#TAB2_2 MOV DPTR,#TAB2_3 RETXuanz3:MOV A,41HCJNE A,#0,Zhuan3_1 MOV DPTR,#TAB3 RETZhuan3_1:CJNE A,#1,Zhuan3_2 MOV DPTR,#TAB3_1 RETZhuan3_2:CJNE A,#2,Zhuan3_3 MOV DPTR,#TAB3_2 RETZhuan3_3:MOV DPTR,#TAB3_3 RETXuanz4:MOV A,41HCJNE A,#0,Zhuan4_1 MOV DPTR,#TAB4 RETZhuan4_1:CJNE A,#1,Zhuan4_2 MOV DPTR,#TAB4_1 RETZhuan4_2:CJNE A,#2,Zhuan4_3 MOV DPTR,#TAB4_2 RETZhuan4_3:MOV DPTR,#TAB4_3 RETXuanz5:MOV A,41HCJNE A,#0,Zhuan5_1 MOV DPTR,#TAB5 RETZhuan5_1:CJNE A,#2,Zhuan5_2 MOV DPTR,#TAB5 MOV DPTR,#TAB5_1 RETXuanz6:MOV A,41HCJNE A,#0,Zhuan6_1 MOV DPTR,#TAB6RETZhuan6_CJNE A,#2,Zhuan6_2 MOV DPTR,#TAB6 RETZhuan6_2:MOV DPTR,#TAB6_1 RET确认左右移动Hengyi: CJNE R3,#03H,H1 RETH1: MOV A,32HRL ACJNE R3,#02H,H2 AJMP OUT1H2: RLCJNEAJMP H3: RL CJNEAJMP H4: MOVRRCJNEAJMP H5: RR CJNEAJMP H6: RR CJNEAJMP H7: RR OUT1: MOVRETAR3,#01H,H3 OUT1AR3,#00H,H4 OUT1A,32H AR3,#04H,H5 OUT1AR3,#05H,H6 OUT1AR3,#06H,H7 OUT1A32H,A*****************************左移按键JB KEY_z,Loopz0JB Dou_z,Loopz2SETB Dou_zRETLoopz2:INC 42HJB Ying_z,OutzSETB Ying_zSETB Biao_zRETLoopz0:CLR Dou_zCLR Ying_zOutz:RET*************************右移按键**** JCMkey_y:JB KEY_y,Loopy0JB Dou_y,Loopy2SETB Dou_yRETLoopy2:INC 42HJB Ying_y,OutySETB Ying_ySETB Biao_yRETLoopy0:CLR Dou_yCLR Ying_yOuty:RET***************************** J CMkey_x:JB KEY_x,Loopx0JB Dou_x,Loopx2SETB Dou_xRETLoopx2:INC 42HJB Ying_x,OutxSETB Ying_xSETB Biao_x。
本科课程设计题目:基于单片机的8*8LED 俄罗斯方块设计姓名孙俊学号2008130346院(系)物理与信息科学学院电子系专业、年级电子信息科学与技术2008级指导教师刘美容二○一一年十月基于单片机的8x8 俄罗斯方块设计一、设计任务《俄罗斯方块》是一款世人皆知,看似简单实则变化无穷的小游戏。
本次设计以51单片机为基础,设计一款功能简单的8*8点阵俄罗斯方块游戏,我们将以汇编语言编程实现以下操作:图形的显示合成,通过按键控制图形的移动和旋转,满格消行,手动复位等。
本次设计俄罗斯方块功能简单,用单片机的最小系统就能得以实现。
而单片机的最小系统设计中实际上最重要的就是对键盘/显示器接口电路的设计,由于系统功能不同所以要求就不同,接口设计也就不同。
对一个键盘/显示器接口设计应从整个系统出发,综合考虑软、硬件特点。
其中,硬件设计包括初始的设计原理和原理图介绍,到最终的电路图实际焊接以及布局,软件设计我们会给出具体的设计方案,比如图形的显示合成,通过按键控制图形的移动和旋转,满格消行等的设计流程图,以及具体的汇编程序。
二、设计方案本次设计初期是在keil和proteus联合仿真中进行,编程语言为51汇编语言,后期是进行实物焊接。
本次我们采用单片机STC89C52控制模块提供电源,以点阵式LED 显示,采用独立按键,直接在I/O口线上接上按键开关。
因为设计时精简和优化了电路,所以剩余的口资源还比较多,我们使用四个按键,分别是旋转键,下键,左键,右键。
这种方案实现可行,既满足系统功能要求,又减少了系统实现的复杂度。
而由于STC89C52是一种带8K 字节闪烁可编程可檫除只读存储器的低电压,高性能COMOS8的微处理器,该器件采用ATMEL 搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
89C52内置8位中央处理单元、256字节内部数据存储器RAM 、8k 片内程序存储器(ROM )32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。
俄罗斯方块小游戏(HTML游戏使用JavaScript开发)俄罗斯方块是一款风靡全球的经典游戏,现在我们将使用JavaScript语言开发一个基于HTML的俄罗斯方块小游戏。
在这篇文章中,我将介绍游戏的设计思路、实现过程以及一些技术细节。
一、游戏设计思路打开游戏页面后,玩家将看到一个空白的游戏区域,该区域由10列和20行方格构成。
方块将从游戏区域的顶部下落,玩家需要控制方块的方向和位置,使其在下落过程中填满一行或多行。
当一行被完全填满时,该行将被消除,并且玩家得到相应的分数。
游戏的难度会逐渐增加,方块下落的速度会逐渐加快,挑战玩家的反应和操作能力。
当方块堆积到游戏区域的顶部时,游戏结束。
玩家可以选择重新开始游戏或退出游戏。
二、游戏实现过程1. 创建HTML结构首先,我们需要创建一个HTML结构,包含游戏区域以及一些控制按钮。
游戏区域可以使用一个div元素进行表示,每个方格可以使用一个span元素表示。
同时,添加开始按钮和重新开始按钮,用于控制游戏的开始和重新开始。
2. CSS样式设计为了使游戏界面美观,我们需要设计一些CSS样式。
通过设置游戏区域的背景颜色、方格的颜色及边框效果,可以使游戏界面更加具有吸引力。
3. 实现游戏逻辑使用JavaScript语言实现游戏的逻辑部分。
我们需要为方块设计一个类,定义方块的形状、位置以及移动的方法。
在游戏的运行过程中,我们需要检测按键事件,根据玩家的操作移动方块的位置。
同时,需要实现方块的下落、旋转和消除行等功能。
4. 添加事件监听为了使玩家能够操作游戏,我们需要为游戏界面添加键盘事件监听。
通过监听键盘的上、下、左、右方向键,可以控制方块的移动和旋转。
5. 计分和游戏结束在游戏进行过程中,我们需要实时更新玩家的分数,并判断游戏是否结束。
当方块堆积到游戏区域的顶部时,游戏结束,弹出游戏结束的提示框,并显示玩家的最终得分。
三、技术细节在实现俄罗斯方块小游戏的过程中,我们使用了以下技术:1. HTML:用于创建游戏界面的结构,包括游戏区域和按钮等元素。
俄罗斯方块游戏是VHDL 应用于复杂数字系统的一个经典设计,本章将详细介绍该游戏的设计原理和设计方法。
其中包括系统构成、系统设计原理和系统各个模块的实现方法。
8.1 系统结构原理8.1.1 系统端口图8.1给出了系统的顶层设计符号,其端口包括:1)kc :PS/2键盘时钟输入; 2)kd :PS/2键盘数据输入; 3)mclk :系统主时钟输入;4)blue :蓝色信号输出到VGA 显示器接口; 5)grn :绿色信号输出到VGA 显示器接口; 6)red :红色信号输出到VGA 显示器接口; 7)hs :行扫描信号到VGA 显示器接口;8)vs :列扫描信号到VGA 显示器接口要开始一个游戏按F2键,但是当游戏正在运行时,不允许按键F2,如果要开始一个新的游戏必须停止它或者按键F1。
该游戏有5个不同的目标,可以对它进行旋转和左移或右移。
该游戏有4种不同的速度,当分数增加的时候,速度也随之增加,按键S 将增加速度,直到目标到达最底部。
速度和分数的关系是: 1)当分数<100,速度等级为1;2)当分数在(100,200)之间时,速度等级为2; 3)当分数在(200,300)之间时,速度等级为3; 4)当分数在>300时,速度等级为4;如图8.2所示,有两种不同的目标:右边是文本框,左边是俄罗斯方块。
使用两个BRAM 存储数据。
文本框中包含了32x16=512个字符,每个字符包含8比特,所以需要使用BRAM 。
在俄罗斯方块部分也使用了一个BRAM ,但其实这不是必须的,因为这增加了gamecontrol 模块的设计复杂度(只能在一个时钟周期访问一个BRAM )。
俄罗斯方块有10x20个块组成,每个块保存了4位(第1位用于说明是否有其它东西,其它3位保持着颜色)。
在屏幕上画像素需要25MHz 时钟,在设计中使用3线来传送颜色。
这也就是说,只能画出8种颜色(红,绿,蓝,黄,黑,白,浅绿和紫红)。
俄罗斯方块小游戏编程实现俄罗斯方块(Tetris)是一款经典的游戏,它的设计简单,玩法有趣,备受玩家喜爱。
在本文中,我们将探讨如何使用编程语言来实现俄罗斯方块小游戏。
1. 游戏介绍俄罗斯方块是一款由七种不同形状的方块组成的拼图游戏。
这些方块会从屏幕顶部逐渐下落,玩家需要通过调整方块的位置和旋转来使其完全填满一行。
当一行被填满时,该行会消除,并玩家会获得相应的分数。
游戏的目标是尽可能多地消除行并获得高分。
2. 游戏设计在编程实现俄罗斯方块游戏时,我们需要考虑以下几个关键因素:- 方块的形状:俄罗斯方块由七种不同形状的方块组成,每个方块由四个小方块组成。
- 方块的移动:玩家可以通过按下不同的按键来移动方块的位置,包括向左、向右和向下。
- 方块的旋转:方块可以按照一定的规则进行旋转,玩家可以通过按下相应的按键来实现旋转。
- 方块的下落:方块会以一定的速度从屏幕顶部下落,玩家需要控制方块的下落速度以适应游戏进程。
- 行的消除:当一行被填满时,该行会被消除,并玩家会获得相应的分数。
消除行后,上方的方块会下落填补空缺。
3. 编程实现为了编程实现俄罗斯方块游戏,我们可以选择使用一种合适的编程语言,例如Java、C++或Python。
这些语言都具备强大的图形库和用户交互功能,能够很好地支持游戏的图形界面和用户操作。
在编程实现过程中,我们可以使用面向对象的思想来设计游戏的各个组件,例如方块、游戏区域和玩家。
我们可以将方块抽象成一个类,其中包含方块的属性和操作方法。
游戏区域可以设计成一个矩形框,其中保存了方块的位置和状态。
玩家可以通过键盘输入来移动和旋转方块。
通过合理的设计和编程,我们可以实现一个功能完善的俄罗斯方块小游戏。
在游戏中,玩家可以使用键盘进行操作,控制方块的移动、旋转和下落,以达到消除行的目的并获得高分。
4. 总结俄罗斯方块小游戏是一款简单而有趣的游戏,通过编程实现它可以锻炼我们的逻辑思维和编程能力。
在本文中,我们探讨了俄罗斯方块游戏的设计要点,并提到了一些实现该游戏的编程思路。
俄罗斯方块游戏的设计与实现俄罗斯方块是一款经典的益智游戏,于1984年由俄罗斯设计师阿列克谢·帕基特诺夫(Alexey Pajitnov)创作出来。
这款游戏简单而又充满乐趣,对于游戏玩家来说是一次智力和反应的挑战。
下面是关于俄罗斯方块游戏的设计和实现的一些建议。
首先,俄罗斯方块游戏需要一个游戏界面。
这个界面应该包含一个方格矩阵,通常是10列和20行。
这个矩阵用于容纳正在下落的俄罗斯方块。
除此之外,界面还需要展示分数、等级和下一个方块的预览。
接下来,我们需要实现方块的设计。
俄罗斯方块由4个小方块组成,这些小方块可以以不同的排列方式形成不同的图案。
游戏开始时,我们随机生成一个方块,并将其放置在游戏界面的顶部中央位置。
玩家可以通过键盘的方向键控制方块的左右移动,使其下落到矩阵的底部或者叠加在其他方块上。
游戏的核心是方块的下落和消除。
方块会从顶部不断地向下移动,玩家可以按下空格键来快速下落。
当方块下落到底部或者叠加在其他方块上时,它会停止下落,然后我们需要生成一个新的方块。
如果方块叠加在其他方块上,我们需要检查是否有完整的一行,如果有,将该行消除。
玩家每消除一行将获得一定的分数,并且游戏难度会逐渐增加。
此外,俄罗斯方块还需要一个计时器来控制方块的下落速度。
随着游戏的进行,方块下落的速度会逐渐增加,增加游戏的难度。
玩家可以通过按下键盘的向下箭头键来加速方块的下落。
最后,还可以添加一些额外的功能来增加游戏的乐趣。
例如,我们可以添加一个暂停功能,使玩家可以在游戏进行过程中暂停游戏。
我们还可以添加一个排行榜功能,以便玩家可以与其他玩家进行比较。
在实现俄罗斯方块游戏时,需要选择合适的编程语言和开发环境。
常用的编程语言如C++、Java和Python都可以用来开发这款游戏。
开发环境可以使用相应的集成开发环境(IDE),如Visual Studio、Eclipse或者PyCharm。
总之,设计和实现俄罗斯方块游戏需要确定游戏界面、方块设计、方块的下落和消除机制、计时器和一些额外功能。
简易俄罗斯方块游戏机实验名称简易俄罗斯方块游戏机姓名AugJ班级信息与通信工程学院09级14班学号辅导老师张咏梅日期2011年10月18日一、设计课题的任务要求1、基本内容用一个8*8点阵做为基本显示屏,一个发光点表示一个图形,完成俄罗斯方块游戏的基本功能:下落、左右移动、消行和显示得分情况,当某一列到顶时游戏结束。
(1)在游戏开始前,请设置一个点阵像素的扫描环节,显示方式自选,以判断点阵的好坏。
(2)游戏结束时,得分保持,按“开始”键游戏重新开始。
2、提高要求(1)选作:用一个8*8点阵做为基本显示屏,用多个亮点组成各种形状的“方块”,实现俄罗斯方块游戏机的基本功能。
(2)自拟其他功能二、系统设计设计思路:由于实验中用到了64个点来完成显示功能,所以可以选用一个64位的向量STATUS(0 TO 63)来存储各点状态,再用两个整型数分别控制当前点的行列坐标,但是若采用该种控制方式会涉及到乘法运算,因此改为8个8位向量STAN (0 TO 7),每个向量代表一列点阵,这样做不仅使控制简单,而且在扫描显示的时候很方便,代码也很简洁。
设计包括2个大的元件,一个是RUSSIA,其功能是存储状态,分频,完成左右下移动以及计分等功能;另一个是RUSSIA_SCAN,主要完成点阵扫描和数码管译码。
具体设计是这样的:8个向量STA0,STA1,STA2,STA3,STA4,STA5,STA6,STA7记录游戏状态,点的坐标由COL 和ROW来控制。
设置两个指针FLAG和ROWCLEAR,如果八列中有一列都为1,表示游戏结束了,置FLAG为1,程序进入NULL并蜂鸣器发声;当最后一行全部为1时,置ROWCLEAR=1,当ROWCLEAR=1时,表示要消行,加分,并且将上一行的值赋到下一行。
游戏继续,如按下左键或右键,程序更根据下一状态决定是否左移或右移。
(BTN5为复位RESET,BTN7为左,BTN6为右,BTN5为扫描)若无键按下,则根据情况当前点是否需要自动下移。
【导语】电⼦实训在⾼职院校电⼦类专业中占据⼗分重要的地位,这也是⼀个需要理论与实践相结合的专业。
以下是整理的学⽣电⼦实训报告,仅供参考! 篇⼀ ⼀、实训任务要求 按照⾃⼰的想法和设计,实现预期的功能效果。
⼆、实训⽬的 1、培养动⼿能⼒,在实践中加强对理论知识的理解。
2、掌握对电⼦元器件识别,相应⼯具的操作,相关仪器的使⽤,电⼦设备制作、装调的全过程的⽅法。
3、掌握查找及排除电⼦电路故障的常⽤⽅法。
4、学习使⽤proteus、protel电路仿真与设计软件,动⼿绘制电路图。
5、使⽤AltiumDesigner绘制简单的PCB图,掌握印刷电路板的⼀些流程和步骤。
三、实训步骤: 1、设计⽅案的选择: ⼀开始准备不⽤锁存器,但是51单⽚机可控的IO⼝只有四组,仅仅⼀个8*16的LED点阵就耗费了三组。
为了节省IO⼝,实现其他的功能最终选择了增加三个锁存器,详细看附录⾥⾯的实物展⽰图。
2、电路原理分析: 通过51单⽚机的控制,⽤8*16的LED点阵实现⼩游戏俄罗斯⽅块。
通过51的P2⼝给8*16的LED点阵发送显⽰数据,与P2相连的是三个锁存器(74HC573),通过锁存端的控制由P2⼝分三次发送数据给LED点阵,通过扫描的⽅法实现8位IO⼝控制24位显⽰。
单⽚机处理速度是很快的,⼈眼睛能辨别的事物变化的时间1/24秒,由于视觉暂留作⽤我们看到的便是整个屏幕都是同时⼯作者的,其实同⼀时刻只有⼀个灯在亮,我们看到的都是余辉。
通过P0⼝控制⼀个七段数码管⽤于俄罗斯⽅块的得分现实,同时蜂鸣器会发出滴滴声,表⽰得分了。
P1⼝控制⼀些操作按键,主要功能是控制LED点阵显⽰的⽅块左右的移动、快速下降、以及暂停复盘等功能。
注:详细请查看附录⼀的原理图。
3、芯⽚封装及功能: 74HC573封装:20引脚双列直插 功能:数据的锁存,从⽽实现单⽚机8位数据端控制24位。
就是通过3个锁存器分别对数据的锁存和开放实现的。
;/////////////16*16俄罗斯方块//////////////////;程序编写人:付立广 QQ:446387098 email:glfabc@;程序编写日期:2009-05-01---2009-06-01;程序功能:四个8*8LED点阵接成16*16LED点阵,双色显示,模仿俄罗斯方块游戏,LCD显示分数;程序使用的单片机:AT89S52,用到了其高128RAM数据存储区单元;用到的芯片及器件:74LS154,74LS373,LCD1602,AT89S52,按键,USB接口,1/4W2K电阻,三极管8550;声明:本程序知识产权归原作者所有,如需引用请注明原作者姓名;/////////////////////////////////////////////COLUMN EQU P1ROW EQU P2EN EQU P3.5 ;P10为LCD1602使能端RW EQU P3.6 ;P11为LCD1602读写端BAI_WEI EQU 5BHORG 0000HAJMP S TART1ORG 000BHLJMP T_0ORG 0040HSTART1: MOV COUNT1,#0 ;用来产生随机的积木的形状CLR ST_BTSTART: JNB ST_BT,START0LJMP M AIN ;游戏结束了,开始键还没有按下,则不初始化,只要显示和查询暂停按键就可以了START0: LCALL INIT_LCD ;初始化LCD1602ZIXING: MOV OUT,#01000000B ;!!!!!!!别把位置放错了;写指令,设置CGRAM的自建字形存放的地址000000BLCALL ENABLE ;调用写指令时序子程序MOV DPTR,#TAB5 ;取自建字形表LCALL WRITE1 ;调用写16字节数据子程序(自建字型可以与写数据到DDRAM共用一个函数WRITE1)LCALL DISPLAY_LCD ;调用显示子程序CLR OVER_BT ;只有重新开始了,才将完标志位置0。
INC COUNT1 ;这样处理上,便于游戏结束时,新游戏开始时产生的积木也是随机的MOV SP,#60H ;将堆栈指针移开MOV R0,#30HCLR_0: MOV @R0,#0 ;移动的存储单元清零INC R0CJNE R0,#50H,CLR_0MOV R0,#70HCLR_1: MOV @R0,#0 ;背景的存储单元清零INC R0CJNE R0,#90H,CLR_1MOV COUNT0,#0MOV SCAN_CODE,#00H ;作为四-十六译码器的输入,选择行MOV GE_WEI,#0MOV SHI_WEI,#0MOV BAI_WEI,#0MOV DAT,#0MOV DAT_SEL,#80H ;O数码管片选值CLR BT0CLR ST_BT ;暂停标志位清零,不暂停,为1时暂停CLR KEY ;清按键标志位CLR GET ;按键执行标志位CLR SP_BT ;若为1,则下移加速,为0时,正常速度CLR SP_FLAG ;正常速度时才要取反此标志位,且此标志位为1时,才下移,于是就是为加速后速度的一半CLR CONF_BT ;对冲突标志位清零CLR OVER_BT ;对结束标志位清零SETB R S0CLR RS1MOV R0,#5BHCLR RS0CLR RS1LCALL CHULIMOV OUT,#8BH ;设置DDRAM地址0000000B,第一行显示的地址LCALL ENABLE ;调用写指令时序子程序MOV A,BAI_WEILCALL WRITE2MOVNOPNOPNOPMOV A,P3CPL AANL A,#1FHMOV B,A ;暂存键值JNZ DEAL ;有按键按下则去处理,获得键值CLR GET ;否则恢复到初始状态CLR KEYAJMP N EXT0 ;继续延时消抖,判断按键JUD: MOV A,P3 ;判断是否还按下CPL AANL A,#1FHJZ NEXT ;没有按下,则跳到NEXT准备继续扫描SETB K EYNEXT0: AJMP N EXTDEAL: JB GET,NEXTSETB G ET ;避免一次按键多次响应MOV A,BJB ACC.0,SPEED ;P3.0按下。
加速JB ACC.1,STOP ;P3.1按下,暂停JB ACC.2,MOV_CH ;P3.2按下,变形JB ACC.3,MOV_L ;P3.3按下,左移JB ACC.4,MOV_R ;P3.4按下,右移AJMP N EXT ;无键按下,一般情况下不会执行此语句MOV_L: INC COUNT1 ;通过按键次数来产生随机数,用来产生随机积木JB ST_BT,JMP0 ;若ST_BT为1,表示暂停了,其他的按键按下无效LCALL MOV_LEFTJMP0: AJMP N EXTMOV_CH: INC COUNT1JB ST_BT,JMP2LCALL D_CHANGE ;异地变形JMP2: AJMP N EXTMOV_R: INC COUNT1JB ST_BT,JMP1LCALL MOV_RIGHTJMP1: AJMP N EXTSPEED: INC COUNT1JB ST_BT,JMP3CPL SP_BT ;(以下两个标志位用在调用下移子程序前面作为判断);按一次加速(1),再按一次为原速(0)JMP3: AJMP N EXTSTOP: INC COUNT1CPL ST_BT ;;按一次暂停(1),再按一次开始(0)NEXT: JB OVER_BT,RETURN ;若是为1的话,游戏结束,从START重新开始开始LJMP M AINRETURN: LJMP S TART; ///////////////////////////////////////; /////// 主程序完///////; ///////////////////////////////////////;//////////////////////下移子程序玻,并判断冲突////////////////////////////////MOV_DOWN: LCALL DELIVE34TO9A ;判断是否有冲突(判断时,要借助于20H-2FH)MOV R0,#9FH ;只能用间接寻址,只判断移动显示MOV A,@R0JNZ LOD ;若不为0,则已经移到了最底端MOV R0,#0AFHMOV A,@R0JNZ LODMOV R2,#15MOV R1,#9EHMOV R0,#9FHMOV_DOWN0: MOV A,@R1 ;所有的行都向下移一行,因为已经判断了27H为0 MOV @R0,ADEC R0DEC R1DJNZ R2,MOV_DOWN0 ;还要判断是否已经冲突MOV @R0,#0 ;此时R0指向20H单元,最上一个要赋一个0,否则将会全部是原来20H中的内容MOV R2,#15MOV R1,#0AEHMOV R0,#0AFHMOV_DOWN1: MOV A,@R1 ;所有的行都向下移一行,因为已经判断了27H为0 MOV @R0,ADEC R0DJNZ R2,MOV_DOWN1 ;还要判断是否已经冲突MOV @R0,#0 ;此时R0指向20H单元,最上一个要赋一个0,否则将会全部是原来20H中的内容CLR CONF_BT ;若是已经将上次的冲突处理完后,清零冲突标志位LCALL CONFLICT ;将背景和移动拼凑起来,背景30H-37H,移动20H-27HJB CONF_BT,LOD;若是冲突,则不能往下移了,表示此积木已经移完了,将背景与移动相或,作为背景LCALL DELIVE9ATO34 ;若不冲突,则将改变后的20H-27H送到40H-47H;判断消行是在下移后才判断的INC Y ;不冲突,下移的次数加1,作为变形的路径根据LJMP R ET_DLOD: ;由于到底了,不能下移,则40H-47H移动显示不变。
不要这一语句LCALL DELIVE2TO4 ;!!!!!!!!!!小心别忘了!!!!!!!!!LCALL MERGE ;合并移动与背景,作为新的背景,并将移动40H-47H清零LCALL CLR_COL ;只有冲突下移不了或者已经到最底了,才判断是否要消行;消完行后,再判断是否满了,即游戏是否结束了LCALL LOADLCALL DELIVE34TO9A ;!!!!注意!!!因为新装的移动显示是否与背景冲突,若冲突则此轮游戏完CLR CONF_BTLCALL CONFLICTJB CONF_BT,RESTARTLJMP R ET_DRESTART: SETB S T_BT ;将暂停标志位置1,除了显示,其他操作一概无效SETB O VER_BT ;游戏结束标志位,通过判断从START开始执行LCALL LOAD_WANRET_D: RETORL A,#80HMOV COLUMN,A ;只有一个74LS373是直通的,其他的三个都被锁存。
MOV A,@R0CPL AMOV ROW,#0FFHMOV ROW,AINC R0MOV A,P1ANL A,#0FHORL A,#40HMOV COLUMN,A ;只有一个74LS373是直通的,其他的三个都被锁存。
MOV A,@R1CPL AMOV ROW,#0FFHMOV ROW,AINC R1CLR RS0LCALL DELAYDJNZ R2,DISPLAY_WAN0 ;循环16次RETDISPLAY: MOV SCAN_CODE,#0SETB R S0SETB R S1MOV R0,#30H ;背景的第一列首地址(高8位)MOV R1,#40H ;背景的第二列首地址CLR RS0CLR RS1MOV R0,#70H ;移动显示的第一列首地址(高8位)MOV R1,#80H ;移动显示的第二列首地址MOV R2,#16DIS0: MOV A,P1ANL A,#0F0HORL A,SCAN_CODEMOV COLUMN,A ;送扫描码INC SCAN_CODEDIS1:MOV A,P1ANL A,#0FHORL A,#20HMOV COLUMN,A ;只有一个74LS373是直通的,其他的三个都被锁存。
MOV A,@R0CPL A ;因为是低电平有效,所以要取反MOV ROW,#0FFHMOV ROW,AINC R0MOV A,P1ANL A,#0FHORL A,#10HMOV COLUMN,A ;只有一个74LS373是直通的,其他的三个都被锁存。
MOV A,@R1CPL AMOV ROW,#0FFHMOV ROW,AINC R1SETB R S0SETB R S1MOV A,P1ANL A,#0FHORL A,#80HMOV COLUMN,A ;只有一个74LS373是直通的,其他的三个都被锁存。