51单片机课程设计 俄罗斯方块

合集下载

基于51单片机的俄罗斯方块游戏课设

基于51单片机的俄罗斯方块游戏课设

基于51单片机实现的俄罗斯方块游戏整体设计方案 (5)2.1系统的核心部分单片机 (5)2.1.1单片机的选择 (5)2.1.2AT89S52引脚功能描述 (7)2.1.3晶振特性 (9)2.2液晶显示模块 (10)2.2.1液晶显示控制驱动器HD61202的特点 (10)2.2.2液晶显示控制驱动器HD61202的引脚功能 (10)2.2.3液晶显示控制驱动器HD61202的指令系统 (11)2.2.4HD61202的软件设计 (12)2.2.5JM12864J的电路结构特点 (15)2.2.6JM12864J的应用 (16)2.2.7键盘电路 (17)3系统程序的设计 (18)3.1俄罗斯方块驱动流程图 (18)3.2俄罗斯方块所有绘图工作流程图 (19)3.3俄罗斯方块中按下键的流程图 (20)3.4俄罗斯方块所有绘图工作流程图 (21)附录1:C语言程序 (30)附录2:电路原理图 (59)整体设计方案1.1系统的核心部分单片机1.1.1单片机的选择单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。

单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。

通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和I/O接口电路等。

因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。

单片机经过3代的发展,正朝着多功能、高性能、低电压、低功耗、低价格、大存储容量、强I/O功能及较好的结构兼容性方向发展。

其发展趋势不外乎以下几个方面:1.多功能单片机中尽可能地把所需要的存储器和I/O口都集成在一块芯片上,使得单片机可以实现更多的功能。

比如A/D、PWM、PCA(可编程计数器阵列)、WDT(监视定时器---看家狗)、高速I/O口及计数器的捕获/比较逻辑等。

有的单片机针对某一个应用领域,集成了相关的控制设备,以减少应用系统的芯片数量。

俄罗斯方块设计

俄罗斯方块设计

本科课程设计题目:基于单片机的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个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。

基于单片机的俄罗斯方块游戏机课程设计

基于单片机的俄罗斯方块游戏机课程设计
图3.4复位电路
3.
8XX51系列单片机的时钟信号通常用两种电路形式得到:内部振荡方式和外部振荡方式。在引脚XTAL1和XTAL2外接晶振,就构成了内部振荡方式。由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自激振荡器,并产生振荡时钟脉冲。晶振通常选用6MHz、12MHz或24MHz。
1.3 分工
在本次设计中,张荣俊同学主要负责软件的设计与分析,汤青红同学负责硬件电路的设计。
2.设计方案
本次设计采用STC89C52单片机控制模块,USB电源模块来提供电源,复位模块,12864LCD显示屏进行屏显,晶振与电容实现时钟电路,按键直接接入I/O口,这样可以简化电路。另外我们还采用了6个按键,分别是左移,右移,下移、方块变化键、确定按键与暂停按键。
《单斯方块游戏机
专 业:电子信息工程技术
班 级:电子B1512班
学 号:
姓 名:
指导老师:
2017-12-01
1.设计题目、要求及分工
1.1 设计题目
本课程设计题目是基于51单片机的俄罗斯方块游戏机。
1.2 设计要求
本课程设计主要器件是STC89C52单片机和液晶12864,通过单片机发生信号控制液晶屏的显示,使用按键实现游戏的开始、暂停、移动、翻转等。
本次设计中我们选用了12MHz的晶振,晶振与锁相环电路配合使用,以提供系统所需的时钟频率。设计中STC89C52使用12MHz晶体振荡器作为振荡源,由于单片机内部带有振荡电路,所以外部只要连接一个晶振和两个电容即可,电容容量一般在15pF到50pF之间,我们选用电容容量为33pF的电容,如图所示即为本设计的振荡电路。
XTAL1
振荡器反相放大器及内部时钟发生器的输入端。
XTAL2

俄罗斯方块51程序

俄罗斯方块51程序
int current_shape=0;
int t0_h=0;
int t0_l=0;
int t1_h=0;
int t1_l=0;
int show_row=0;
int show_col=0;
int started=0;
int oper_counter=0;
int score=0;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
int temp_col=current_col;
erashBlock(current_row,current_col,current_shape);
if(canInsertBlock(temp_row,temp_col,current_shape)){
insertBlock(temp_row,temp_col,current_shape);
//初始化定时器,定时器0用于扫描显示,定时器2用于控制方块下落
void initTimer();
//初始化中断系统
void initInterrupt();
//显示列元素
void showColEle(int row,int col);
//使用数码管显示获得的分数
void displayDigital();
current_row=temp_row;

基于51单片机俄罗斯方块代码

基于51单片机俄罗斯方块代码

基于51单片机的俄罗斯方块游戏代码实现主要包括以下几个方面:
1. 数据结构:使用数据结构来表示游戏中的各种元素,如方块、矩阵等。

2. 导航键控制:通过键盘扫描代码,获取用户输入的导航键(上下左右)信息,以便控制方块的移动。

3. 方块生成:随机生成新的方块,或者根据游戏规则生成特定的方块。

4. 方块移动:根据用户输入的导航键信息,移动当前方块的位置。

5. 方块旋转:根据用户输入的导航键信息,旋转当前方块的角度。

6. 碰撞检测:检测方块与游戏区域边界、其他方块之间的碰撞,以及方块自身的碰撞。

7. 游戏规则:实现游戏的基本规则,如方块消除、得分、游戏结束等。

8. 用户界面:显示游戏界面,包括方块、游戏区域边界、得分等信息。

9. 延时与中断:通过延时函数和中断函数,实现游戏的实时性,如方块自动下落、响应用户输入等。

10. 代码优化:对代码进行优化,提高游戏运行效率和用户体验。

总之,基于51单片机的俄罗斯方块游戏代码实现涉及到数据结构、键盘扫描、方块生成与移动、碰撞检测、游戏规则、用户界面、延时与中断等多个方面。

用51单片机玩俄罗斯方块

用51单片机玩俄罗斯方块

====================程序说明=================== ;程序编写:超越夢想;联系方式:; QQ: 421965311; 邮箱:liwenkuicymx@;编写时间:2010年5月05号;实现功能:俄罗斯方块;转载请注明此部分;==============按键定义接口==============zyaj bit p3.4 ;左移按键;xzaj bit p3.3 ;旋转按键;jsaj bit p3.5 ;加速按键;ztaj bit p3.6 ;暂停按键;yyaj bit p3.7 ;右移按键;;============;列值移动区;===============xian00 equ 30Hxian01 equ 31Hxian10 equ 32Hxian11 equ 33Hxian20 equ 34Hxian21 equ 35Hxian30 equ 36Hxian31 equ 37Hxian40 equ 38Hxian41 equ 39Hxian50 equ 3aHxian51 equ 3bHxian60 equ 3cHxian61 equ 3dHxian70 equ 3eHxian71 equ 3fHxian80 equ 40Hxian81 equ 41Hxian91 equ 43H;==============背景区定义=================== bei00 equ 50Hbei01 equ 51Hbei10 equ 52Hbei11 equ 53Hbei20 equ 54Hbei21 equ 55Hbei30 equ 56Hbei31 equ 57Hbei40 equ 58Hbei41 equ 59Hbei50 equ 5aHbei51 equ 5bHbei60 equ 5cHbei61 equ 5dHbei70 equ 5eHbei71 equ 5fHbei80 equ 60Hbei81 equ 61Hbei90 equ 62Hbei91 equ 63H;==========旋转时存移动区数据============ yidong00 equ 65Hyidong01 equ 66Hyidong10 equ 67Hyidong11 equ 68Hyidong20 equ 69Hyidong21 equ 6aHyidong30 equ 6bHyidong31 equ 6cHyidong40 equ 6dHyidong41 equ 6eHyidong50 equ 6fHyidong60 equ 71H yidong61 equ 72H yidong70 equ 73H yidong71 equ 74H yidong80 equ 75H yidong81 equ 76H yidong90 equ 77H yidong91 equ 78Hxianshi00 equ 10h xianshi01 equ 11h xianshi10 equ 12h xianshi11 equ 13h xianshi20 equ 14h xianshi21 equ 15h xianshi30 equ 16h xianshi31 equ 17h xianshi40 equ 18h xianshi41 equ 19h xianshi50 equ 1ah xianshi51 equ 1bh tishicun1 equ 28h tishicun2 equ 29h tishicun3 equ 2ah tishicun4 equ 2bh yycishuzc equ 44h xuancun1 equ 45h xuancun2 equ 46h xuancun3 equ 47h xuancun4 equ 48h zycishu equ 49h yycishu equ 4ah zycishuzc equ 4bh zhancun equ 4ch xiayijishu equ 4dhxiayishuzc equ 4ehhang equ 4fhfeishu equ 08hfeishuge equ 09hfeishushi equ 0ahguanshu equ 0bhflag bit 20h.0ztf bit 20h.1ykbf bit 20h.2 ;右靠边标志位; zkbf bit 20h.3 ;左靠边标志位; xiacixyf bit 20h.4hechen bit 20h.5changfanf bit 20h.6ctuf bit 20h.7jiasu bit 25h.0jiasudu bit 25h.1anjian3 bit 25h.2jiashuf bit 25h.3 ;加速标志位; xuan0 bit 25h.4 ;xuan1 bit 25h.5cdf bit 25h.6xiaxiaof bit 25h.7yyf bit 26h.0 ;右移标志位; zyf bit 26h.1 ;左移标志位yiyou bit 26h.2 ;已右移标志位; yizuo bit 26h.3 ;已左移标志位; yiz bit 26h.4 ;已旋转标志位; xzf bit 26h.5 ;旋转标志位; ztkf bit 26h.6changtiaof bit 26h.7zfxingf bit 27h.0zting bit 27h.1anjian4 bit 27h.2diyici bit 27h.3suijishuf bit 27h.4tif bit 27h.5 shenglif bit 27h.6 tingzhif bit 27h.7date equ P0 weixuan equ p1latch_h equ p3.0latch_l equ p3.1 jiepaicshu equ 1chshijian equ 1dh zhancun0 equ 1fh zhancun1 equ 1ehorg 00hjmp startorg 0bhjmp time0org 30hstart:mov sp,#79hmov r0,#7fhkkk: mov @r0,#00djnz r0,kkkmov tmod,#01hmov th0, #0b1hmov tl0,,#0e0hsetb tr0setb et0setb easetb diyicisetb suijishufmov xian30,#07Hmov xian40,#04Hmov xian50,#00H mov xianshi00,#0ffhmov xianshi01,#0ffhmov xuancun1,xian30mov xuancun2,xian40mov xuancun3,xian50mov 1dh,#20mov jiepaicshu,1dhmov guanshu,#01hmov 0dh,#0mov 0eh,#0setb xuan0mov p0,#00mov p2,#00main: jnb flag,mainclr flagjnb xuan0,m60mov dptr,#tab5call xianshihanzi ;显示开机画面“俄罗斯方块”;jmp mainm60: jnb tingzhif,m26mov dptr,#tab4call xianshihanzi;显示"再来一次"jmp mainm26: jnb shenglif,m22mov dptr,#tab3call xianshihanzi; 显示"你通关啦!"jmp mainm22: call jiasuchuli ;加速判断子程序;jnb jiasu,mm10 ;jmp mm8mm10: call zantingchuli ;暂停判断子程序;jnb ztf,mm9jb ztkf,abcmm9: djnz jiepaicshu,abcmov jiepaicshu,shijianmm8: call xiayi ;下移子程序;abc: call xianshi ;显示子程序;call jianpan ;调用按键判断子程序;call jianzichuli;调用键值处理子程序;call suijishuchengxu;调用随机数产生子程序;jmp mainxianshihanzi:inc 0dhmov 0eh,r0mov a,0dhcjne a,#02,k1mov 0dh,#0inc 0ehinc 0ehmov a,0ehk1: cjne a,#0a0h,k5mov 0eh,#00jnb tingzhif,k0clr tingzhifmov feishu,#00hmov guanshu,#01hk0: jnb xuan0,k5clr xuan0k5: call xhcall xianshifenshuretxh:LOOP01: mov p2,#0mov date,#00Hclr latch_h ;下面的两个点阵不亮setb latch_l ;开上面的两个点阵mov weixuan,0cHmov a,r0movc a,@a+dptrmov date,acall delaymov date,#00clr latch_lsetb latch_hinc r0mov weixuan,0cHmov a,r0movc a,@a+dptrmov date,acall delaymov date,#00inc r0inc 0cHmov a,0cHcjne a,#16,LOOP01mov 0cH,#0mov r0,0ehret;=========随机数调用子程序============= suijishuchengxu:jnb suijishuf,c28clr suijishufjnb diyici,c28clr diyicicall suijishucall tishizcdjmp c26c28: jnb tif,c26clr tifmov xuancun1,tishicun1mov xuancun2,tishicun2mov xuancun3,tishicun3mov xuancun4,tishicun4mov xian30,tishicun1mov xian40,tishicun2mov xian50,tishicun3mov xian60,tishicun4mov a,xian40cjne a,#0fh,c32setb changtiaofjmp c34c32: mov a,xian30cjne a,#03,c34mov a,xian40cjne a,#03,c34setb zfxingfc34: mov tishicun4,#00hcall suijishucall tishizcdc26: rettishizcd:mov a,tishicun1rl amov xianshi20,amov a,tishicun2rl amov xianshi30,amov a,tishicun3rl amov xianshi40,aretjianpan:mov p3,#0ffhjb yyaj,di2setb yyf ;右移标志位置1;jmp tiaodi2: jb zyaj,di3setb zyf ;左移标志位置1;jmp tiaodi3: jb xzaj,tiaosetb xzfjmp tiaotiao: ret;============加速处理子程序================ jiasuchuli:jnb anjian3,panduan3;有按键按下,积木加速下移jnb jsaj,jiasuxiayiclr anjian3clr jiasudujmp haopanduan3:jb jsaj,haosetb anjian3jmp haojiasuxiayi:jb jiasudu,haosetb jiasudusetb jiasujnb ztkf,haoclr jiasuhao: retzantingchuli:jnb anjian4,panduan4;jnb ztaj,zantingclr anjian4clr ztingjmp hao1panduan4:jb ztaj,hao1setb anjian4jmp hao1zanting:jb zting,hao1setb ztingsetb ztfcpl ztkfhao1: retjianzichuli:jnb yyf,g0jmp g1g0: jnb zyf,g4jmp g3g4: jnb xzf,sdfjnb xzaj,f1clr xzfclr yizjmp sdfg1: jnb yyaj,ccclr yyfclr yiyoujmp sdfg3: jnb zyaj,g2clr zyfclr yizuojmp sdfg2: call zychenxujmp sdfcc: call yychenxujmp sdff1: call zhuang sdf: retzhuang:jnb yiz,f3jmp m0f3:call shifouchudijnb cdf,dmjmp m0dm: jnb zfxingf,fzfx zfx: jmp m0fzfx: call cunxiansetb yizcall qingpingmov 21h,xuancun1mov 22h,xuancun2mov 23h,xuancun3mov 24h,xuancun4jb changtiaof,ct call xuanzhuangjxct: cpl changfanfcall ctxzjxsf:mov xian30,21hmov xian40,22hmov xian50,23hmov xian60,24hcall zychuli ;左移处理;call yychuli ;右移处理;mov xuancun1,21hmov xuancun2,22hmov xuancun3,23hmov xuancun4,24hcall xiayichulicall shifoucbjcall shifouchubianm0:retctxzjx:jnb changfanf,cccmov 21h,#02hmov 22h,#02hmov 23h,#02hmov 24h,#02hjmp m20ccc: mov 21h,#00hmov 22h,#0fhmov 23h,#00hmov 24h,#00hm20: retshifouchudi:mov a,xiayijishusetb ccjne a,#13,dfdf: jc dcsetb cdfjmp dtdt: retshifouchubian:mov r0,#xian00mov a,@r0anl a,xian90cjne a,#0,fhmov r0,#xian01mov a,@r0anl a,xian91cjne a,#0,fhjmp wifh: call fangxianwi: retxiayichuli:mov xiayishuzc,xiayijishumov r0,xiayijishucjne r0,#0,loop2jmp m7loop2: call xydjnz xiayijishu,loop2 mov xiayijishu,xiayishuzc m7: retzychuli:mov zycishuzc,zycishu mov r5,zycishucjne r5,#00h,loop4retloop4: call zydjnz zycishu,loop4mov zycishu,zycishuzcretyychuli:mov yycishuzc,yycishumov r5,yycishucjne r5,#00h,loop5retloop5: call yydjnz yycishu,loop5m15: mov yycishu,yycishuzcretxuanzhuangjx:mov c,21h.2mov xuan0,cmov c,21h.0mov 21h.2,cmov c,23h.0mov 21h.0,cmov c,23h.2mov 23h.0,cmov c,xuan0mov 23h.2,cmov c,21h.1mov xuan1,cmov c,22h.0mov 21h.1,cmov c,23h.1mov 22h.0,cmov c,22h.2mov 23h.1,cmov c,xuan1mov 22h.2,cclr xuan0clr xuan1ret;===============左移子程序=============== zychenxu:jnb yizuo,ssretss: setb yizuocall kaozbiaojnb zkbf,d1retd1: call cunxiancall zyinc zycishucall shifoucbjjnb ctuf,d2dec zycishuclr ctufd2: retzy: mov zhancun0,xian00mov zhancun1,xian01mov r0,#xian00call zydongmov r0,#xian01call zydongmov xian90,zhancun0mov xian91,zhancun1retkaozbiao:mov a,xian00cjne a,#00,qwmov a,xian01cjne a,#00,qwclr zkbfjmp bbqw: setb zkbf ;置左靠边标志位; bb: retzydong:mov r3,#9loop44:inc r0inc r0mov a,@r0dec r0dec r0mov @r0,ainc r0inc r0djnz r3,loop44ret;=================右移子程序================ yychenxu:jnb yiyou,mmretmm: setb yiyoucall kaoybiao ;调用靠右边判断子程序;jnb ykbf,d0retd0: call cunxiancall yyinc yycishucall shifoucbjjnb ctuf,d4dec yycishuclr ctufd4: retyy: mov zhancun0,xian90mov zhancun1,xian91mov r0,#xian90call yydongmov r0,#xian91call yydongmov xian00,zhancun0mov xian01,zhancun1retkaoybiao:mov a,xian90cjne a,#00,qemov a,xian91clr ykbfjmp bcqe: setb ykbf ;置左靠边标志位;bc: retyydong:mov r3,#9loop45:dec r0dec r0mov a,@r0inc r0inc r0mov @r0,adec r0dec r0djnz r3,loop45retshifoucbj:mov r0,#xian00mov r1,#bei00mov r3,#20loop47:mov a,@r0anl a,@r1cjne a,#0,fhuiinc r0inc r1djnz r3,loop47clr ctufretfhui: setb ctufcall fangxianret;=================显示子程序===================== xianshi:mov r2,#10mov r0,#xian00mov r1,#bei00loop61: mov date,#00clr latch_l ;下面的两个点阵不亮setb latch_h ;开上面的两个点阵mov a,r3anl a,#0xffmov r3,amov weixuan,r3 ;片选mov a,@r1orl a,@r0 ;数据mov date,acall delay ;延时mov date,#00 ;关屏幕inc r0inc r1clr latch_hsetb latch_lmov a,r3anl a,#0xffmov r3,amov weixuan,r3mov a,@r1orl a,@r0mov date,a ;数据call delay ;延时mov date,#00 ;关屏幕inc r3inc r0inc r1djnz r2,loop61mov date,#00 ;显示左边10列;mov r3,#10mov r2,#6mov r0,#xianshi00loop3: mov date,#00clr latch_l ;下面的两个点阵不亮setb latch_h ;开上面的两个点阵mov weixuan,r3 ;片选mov date,@r0dst: call delay ;延时mov date,#00 ;关屏幕inc r0clr latch_hsetb latch_lmov weixuan,r3mov date,@r0 ;数据dsd: call delay ;延时mov date,#00 ;关屏幕inc r0inc r3djnz r2,loop3call xianshifenshucall cdguanshuretxianshifenshu:mov a,feishu ;显示分数;mov b,#10div abmov feishushi,amov feishuge,bmov a,feishushimov dptr,#tab1movc a,@a+dptrmov p2,#00mov p2,aclr p1.4setb p1.5call delaymov a,feishugemovc a,@a+dptrmov p2,#0mov p2,aclr p1.5setb p1.4call delaymov p2,#0ret;=================下移子程序================== xiayi:call cunxianjb xiacixyf,hccall xycall xiacinfouxyinc xiayijishucall shifoucbjjnb ctuf,wtddec xiayijishuclr ctufhc: call beijinghechenwtd: retcunxian:mov r0,#xian00mov r1,#YIDONG00mov r2,#20loop42:mov a,@r0mov @r1,ainc r0inc r1djnz r2,loop42retxiacinfouxy:mov r0,#xian01mov r1,#10loop41:mov a,@r0anl a,#80h ;判断是否触底;cjne a,#0,wtinc r0inc r0djnz r1,loop41clr xiacixyfjmp wywt: setb xiacixyfwy: retbeijinghechen: ; 背景合成;mov r0,#xian00mov r1,#bei00mov r2,#20loop21:mov a,@r1mov zhancun,@r0orl a,zhancunmov @r1,ainc r1inc r0djnz r2,loop21call xiaohang ;调用消行子程序;call qingping ;调用清屏子程序;call rst ;调用复位子程序;setb suijishufsetb tifretqingping:mov r0,#xian00mov r3,#20loop46:mov @r0,#0inc r0djnz r3,loop46retfangxian:mov r0,#xian00mov r1,#yidong00mov r2,#20loop43:mov a,@r1mov @r0,ainc r0inc r1djnz r2,loop43ret;***********复位子程序*************rst:mov xiayijishu,#0mov yycishu,#00mov zycishu,#00mov xuancun4,#0clr xiacixyfclr jiasuclr zfxingfclr ctufclr changfanfclr changtiaofsetb suijishufsetb tifretxiaohang:mov r4,#08mov r3,#01hk3: mov r1,#0mov r0,#bei00mov r2,#8call xh0 ;先判断左八列是否达到消行的要求1 d01: cjne r3,#01,afg ;判断第一行;cjne r1,#0,tzcmov a,@r0anl a,r3cjne a,#0,fghjmp abdfgh: inc r0inc r0mov a,@r0anl a,r3cjne a,#0,d01jmp abdafg: cjne r1,#0ffh,abdmov r2,#10inc hangmov r0,#bei00call xhxymov r3,zhancun0abd: mov a,r3rl amov r3,amov zhancun0,r3djnz r4,k3jmp ttytzc: setb tingzhif ;停止处;call qingbjrettty: mov r4,#08mov r3,#01hfor2:mov r1,#0mov r0,#bei01mov r2,#8call xh0mov a,@r0anl a,r3cjne a,#0,fgtjmp abtfgt: inc r0inc r0mov a,@r0anl a,r3cjne a,#0,aftjmp abtaft: cjne r1,#0ffh,abtinc hangsetb xiaxiaofmov r2,#10mov r0,#bei01call xhxycall shangmiaoxiyimov r3,zhancun0abt: mov a,r3rl amov r3,amov zhancun0,r3djnz r4,for2call jsfshgs ;计算所加的分数和处于的级别数;retxh0:for3:mov a,@r0anl a,r3orl a,r1mov r1,amov a,r1rl amov r1,ainc r0inc r0djnz r2,for3retxhxy:for4:mov r5,#0ffht2: clr cmov a,r5rlc amov r5,amov a,r5anl a,r3cjne a,#0,t2mov a,@r0mov zhancun,a ;最原始数据保存;mov 2eh,aanl a,r5mov 2dh,a ;最高有效位;clr cmov a,zhancunrlc amov zhancun1,a ;左移一次之后的数据;mov a,r5cpl aanl a,zhancun1mov 2ch,amov a,2chorl a,2dhmov @r0,ainc r0inc r0mov r3,zhancun0djnz r2,for4retcdguanshu:mov a,guanshucjne a,#01,g20mov xianshi21,#44hmov xianshi31,#7ehmov xianshi41,#40hjmp xw1g20: cjne a,#02,g30mov xianshi21,#64hmov xianshi31,#52hmov xianshi41,#4chjmp xw1g30: mov xianshi21,#49h mov xianshi31,#49h mov xianshi41,#36h xw1: retjsfshgs:mov r0,hangcjne r0,#00,u0mov hang,#0jmp sw2u0: cjne r0,#01,u1mov a,feishuadd a,#01mov feishu,ajmp sw2u1: cjne r0,#02,u2mov a,feishuadd a,#04mov feishu,ajmp sw2u2: cjne r0,#03,u3mov a,feishuadd a,#08mov feishu,ajmp sw2u3: cjne r0,#04,sw2mov a,feishuadd a,#16mov feishu,asw2: mov hang,#0sw3: mov a,feishusetb cycjne a,#5,s0s0: jnc gs2mov guanshu,#01mov shijian,#20jmp xwgs2: setb cycjne a,#10,s1s1: jnc gs3mov guanshu,#02mov shijian,#10 jmp xwgs3: setb cycjne a,#15,s3s3: jnc sl1mov guanshu,#03mov guanshu,#5 jmp xwsl1: setb shenglifcall qingbjxw: retqingbj:mov r0,#bei00mov r2,#20d8: mov @r0,#0inc r0djnz r2,d8mov r0,#xianshi10 mov r2,#11d9: mov @r0,#0inc r0djnz r2,d9retshangmiaoxiyi:mov r0,#bei00mov r1,#10for6:clr cmov a,@r0rlc amov @r0,ainc r0jmp kdkm: mov a,@r0orl a,#01hmov @r0,akd: inc r0djnz r1,for6ret;============================================= xy:mov r0,#xian00mov r1,#10for7:clr cmov a,@r0rlc amov @r0,ainc r0mov a,@r0rlc amov @r0,ainc r0djnz r1,for7ret;=============产生随机数=============suijishu:mov a,tl0anl a,#07Hrl amov dptr,#tabjmp @a+dptrtab: ajmp sub1ajmp sub2ajmp sub3ajmp sub4ajmp sub5ajmp sub6ajmp sub1sub1:mov tishicun1,#00H mov tishicun2,#07H mov tishicun3,#02Hretsub2:mov tishicun1,#03Hmov tishicun2,#06Hmov tishicun3,#00Hretsub3:mov tishicun1,#06Hmov tishicun2,#03Hmov tishicun3,#00Hretsub4:mov tishicun1,#07Hmov tishicun2,#04Hmov tishicun3,#00Hretsub5:mov tishicun1,#04Hmov tishicun2,#07Hmov tishicun3,#00Hretsub6:mov tishicun1,#00Hmov tishicun2,#0fHmov tishicun3,#00H mov tishicun4,#00hretsub7:mov tishicun1,#03Hmov tishicun2,#03Hmov tishicun3,#00Hretdelay:mov r6,#10mov r7,#50djnz r7,$djnz r6,$-4time0:mov th0,#0b1hmov tl0,#0e0hsetb flagretitab3:db 00h,00h,00h,00h,00h,00h,00h,00hdb 00h,00h,00h,00h,00h,00h,00h,00hdb 00h,00h,00h,00h,00h,00h,00h,00hdb 00h,00h,00h,00h,00h,00h,00h,00h;你db 00H,40H,00H,20H,0FFH,0F8H,00H,07H db 00H,40H,08H,20H,04H,18H,43H,0FHdb 80H,08H,7FH,0C8H,00H,08H,01H,08Hdb 06H,28H,0CH,18H,00H,00H,00H,00H;通db 00H,40H,40H,42H,20H,44H,1FH,0CCHdb 20H,00H,40H,00H,0BFH,0F1H,84H,91H db 84H,95H,0BFH,0F9H,94H,95H,0A4H,93H db 9FH,0F9H,0C0H,10H,40H,00H,00H,00H;关db 81H,00H,81H,10H,41H,10H,41H,11Hdb 21H,12H,11H,1CH,0DH,10H,03H,0F0Hdb 0DH,10H,11H,18H,21H,14H,21H,13Hdb 41H,1AH,0C1H,90H,41H,00H,00H,00H;啦db 00H,00H,01FH,0FCH,08H,04H, 1FH,0FCH db 42H,08H,82H, 08H, 7FH,0FFH,40H,88H db 40H,48H,43H, 0E8H,5CH,09H, 40H,0EH db 5EH,08H,41H, 0ECH,40H,08H, 00H,00Hdb 00H,00H,00H,00H,00H,00H,00H,00Hdb 00H,00H,00H,00H,30H,38H,33H,0FCH db 33H,0F8H,30H,18H,00H,00H,00H,00H db 00H,00H,00H,00H,00H,00H,00H,00Htab4:db 00h,00h,00h,00h,00h,00h,00h,00hdb 00h,00h,00h,00h,00h,00h,00h,00hdb 00h,00h,00h,00h,00h,00h,00h,00hdb 00h,00h,00h,00h,00h,00h,00h,00h;再db 04H,00H,04H,02H,04H,02H,0FFH,0F2H db 04H,92H,04H,92H,04H,92H,07H,0FEH db 04H,92H,44H,92H,84H,92H,7FH,0FAH db 04H,13H,06H,02H,04H,00H,00H,00H;玩db 10H,02H,30H,42H,10H,42H,1FH,0FEH db 08H,43H,88H,42H,40H,20H,30H,22Hdb 0FH,0E2H,00H,22H,00H,22H,3FH,0E2H db 40H,23H,40H,32H,70H,20H,00H,00H;一db 00H,80H,00H,80H,00H,80H,00H,80Hdb 00H,80H,00H,80H,00H,80H,00H,80Hdb 00H,80H,00H,80H,00H,80H,00H,80Hdb 00H,80H,00H,0C0H,00H,80H,00H,00H;次db 02H,00H,02H,02H,0FFH,04H,00H,8CH db 080H,40H,40H,00H,20H,20H,00H,18H db 0CH,17H,03H,0D0H,0CH,10H,10H,50Hdb 60H,38H,0C0H,10H,40H,00H,00H,00Hdb 00h,00h,00h,00h,00h,00h,00h,00hdb 00h,00h,00h,00h,00h,00h,00h,00hdb 00h,00h,00h,00h,00h,00h,00h,00hdb 00h,00h,00h,00h,00h,00h,00h,00htab5:db 00h,00h,00h,00h,00h,00h,00h,00hdb 00h,00h,00h,00h,00h,00h,00h,00hdb 00h,00h,00h,00h,00h,00h,00h,00hdb 00h,00h,00h,00h,00h,00h,00h,00h;俄db 00H,80H,00H,40H,00H,20H,0FFH,0F8H db 04H,27H,44H,24H,82H,24H,7FH,0FEH db 21H,22H,10H,20H,09H,0FFH,0EH,20H db 32H,22H,41H,34H,0E0H,20H,00H,00H;罗db 80H,00H,88H,7EH,88H,22H,44H,22H db 42H,22H,25H,3EH,29H,0E2H,11H,22H db 09H,22H,09H,3EH,05H,22H,03H,22H db 00H,22H,00H,7FH,00H,02H,00H,00H;斯db 08H,00H,88H,04H,4FH,0FFH,29H,24H db 09H,24H,29H,24H,4FH,0FFH,28H,04H db 10H,00H,0FH,0FCH,00H,44H,00H,42H db 0FFH,0C3H,00H,42H,00H,40H,00H,00H;方db 00H,10H,80H,10H,40H,10H,20H,10H db 18H,10H,07H,0F1H,00H,92H,00H,96H db 40H,90H,80H,90H,40H,90H,3FH,0D0H db 00H,90H,00H,18H,00H,10H,00H,00H;db 08H,20H,18H,20H,08H,20H,0FH,0FFH db 84H,20H,46H,20H,22H,10H,1AH,10H db 07H,0FFH,0AH,10H,12H,10H,22H,10H db 43H,0F8H,0C2H,10H,42H,00H,00H,00Htab1:db 3fh,06h,5bh,4fh,66hdb 6dh,7dh,07h,7fh,6fhend。

C51单片机12864液晶带按键制作俄罗斯方块C源码

C51单片机12864液晶带按键制作俄罗斯方块C源码

************说明******************************此程序包含一个俄罗斯方块.c 文件和一个12864.h 文件********************俄罗斯方块.c文件**************************#include "reg51.h"#include "12864.h"#define uchar unsigned char#define uint unsigned intstatic unsigned long Seed = 1;#define A 48271L#define M 2147483647L#define Q (M / A)#define R (M % A)sbit K1=P3^4;sbit K2=P3^5;sbit K3=P3^6;sbit K4=P3^7;unsigned int idata num[19+2]={0xfff,//第1行,最下面0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,//第2行到第20行共19行0xfff//第21行,最上面};//定义共21行,其中num[0]为下墙壁行,num[20]为上墙壁行,每行12格,最左一格为左墙壁列,最右一格为右墙壁列unsigned char code Block[28][2]={/** 口口口口口口* 口口口口* 口口口口口口*/{0x88,0xc0},{0xe8,0x00},{0x62,0x20},{0x02,0xe0},/** 口口口口口口* 口口口口* 口口口口口口*/{0x22,0x60},{0x08,0xe0},{0xc8,0x80},{0xe2,0x00},/** 口* 口口口口* 口口口*/{0x8c,0x40},{0x6c,0x00},{0x8c,0x40},{0x6c,0x00},/** 口口口* 口口口口* 口*/{0x4c,0x80},{0xc6,0x00},{0x4c,0x80},{0xc6,0x00},/** 口口* 口口口口口口口口* 口口口口口口*/{0x04,0xe0},{0x8c,0x80},{0xe4,0x00},{0x26,0x20},/*口* 口* 口口口口口* 口*/{0x44,0x44},{0x0f,0x00},{0x44,0x44},{0x0f,0x00},/** 口口* 口口*/{0x06,0x60},{0x06,0x60},{0x06,0x60},{0x06,0x60}};#define PASSSCORE 20struct Jimu{unsigned int dat;char x;unsigned char y;unsigned char type;unsigned char change;}Sign[3];//积木结构体unsigned char SysFlag=0;#define NEWSIGNFLAG 0#define DEADFLAG 1#define PAUSEFLAG 2unsigned char Score=0;unsigned char Level=1;unsigned char DelayCnt=5;/*********************************************************/#define N 25/************************************伪随机数发生器*************************************/ double Random(void){long TmpSeed;TmpSeed=A*(Seed%Q)-R*(Seed/Q);if(TmpSeed>=0)Seed=TmpSeed;elseSeed=TmpSeed+M;return (double)Seed/M;}/************************************** 为伪随机数发生器播种***************************************/ void InitRandom(unsigned long InitVal){Seed=InitVal;}//延时子程序void Delay(unsigned int t){unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}/*********************************初始化MPU**********************************/void InitCpu(void){TMOD=0x0;TH0=0;TL0=0;TR0=1;ET0=1;EX1=1;EA=1;TCON|=0x04;}/**************************** welcome 游戏选择界面/**********************/void welcome(){Lcd_WriteStr(0,0,"欢迎来玩");Lcd_WriteStr(0,1,"俄罗斯方块");Lcd_WriteStr(0,2,"设置按K1");Lcd_WriteStr(0,2,"开玩按K2");}/*************俄罗斯方块部分/******************************画墙壁,初始化界面*******************************/void DrawBoard(void){unsigned char n;for(n=0;n<12;n++){Lcd_Rectangle(3*n,0,3*n+2,2,1);Lcd_Rectangle(3*n,60,3*n+2,62,1);}for(n=0;n<20;n++){Lcd_Rectangle(0,3*n,2,3*n+2,1);Lcd_Rectangle(33,3*n,35,3*n+2,1);}Lcd_WriteStr(4,0,"经典游戏");Lcd_WriteStr(3,2,"Score:");Lcd_WriteStr(3,3,"Level:");}/*********************************** 游戏结束处理************************************/ void GameOver(void){if((SysFlag&(1<<DEADFLAG))!=0)Lcd_WriteStr(3,1,"You Fail");elseLcd_WriteStr(3,1,"You Pass");}unsigned int code MaskTab[16]={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000};/**********************************根据积木图标左下坐标X,Y来画出积木图标***********************************/void DrawSign(struct Jimu Temp,unsigned char DrawMode){unsigned char m,n;for(m=0;m<4;m++)for(n=0;n<4;n++){if((Temp.dat&MaskTab[4*m+n])!=0)Lcd_Rectangle(Temp.x+n*3,Temp.y-2-3*m,Temp.x+n*3+2,Temp.y-3*m,DrawMode);}}/********************************将积木图标值融入num数据中也即把积木图标固定,无法再下降*********************************/FixSign(void){unsigned char m,n;for(m=0;m<4;m++)//行循环for(n=0;n<4;n++)//列循环{if((Sign[0].dat&MaskTab[4*m+n])!=0){num[20-(Sign[0].y-2)/3+m]|=MaskTab[11-Sign[0].x/3-n];}}}/********************************判断积木图标中方块是否与障碍方块重合*********************************/unsigned char CheckIf(void){unsigned char m,n;for(m=0;m<4;m++)//行循环for(n=0;n<4;n++)//列循环{if((Sign[1].dat&MaskTab[4*m+n])!=0){if((num[20-(Sign[1].y-2)/3+m]&MaskTab[11-Sign[1].x/3-n])!=0)return 0;}}return 1;}/********************************判断积木图标是否可以继续下降一格********************************/unsigned char CheckIfDown(void){Sign[1]=Sign[0];//Sign[1].y+=3;//假设下降一格return CheckIf();}/********************************判断积木图标是否可以向左移动*********************************/unsigned char CheckIfLeft(void){Sign[1]=Sign[0];Sign[1].x-=3;return CheckIf();}/********************************判断积木图标是否可以向右移动*********************************/unsigned char CheckIfRight(void){Sign[1]=Sign[0];Sign[1].x+=3;return CheckIf();}/********************************判断是否可以旋转*********************************/unsigned char CheckIfRoll(void){unsigned char i;unsigned int Temp;Sign[1]=Sign[0];if(++Sign[1].change>3)Sign[1].change=0;i=Sign[1].type*4+Sign[1].change;Temp=(unsigned int)Block[i][0]<<8;Temp=Temp|Block[i][1];Sign[1].dat=Temp;return CheckIf();}/********************************寻找满格的行并做消除处理最多寻找4个满行并做消除*********************************/void DelFull(void){unsigned char m,n;unsigned char Temp;unsigned char Flag=0;Temp=(Sign[0].y-2)/3;if(Temp>=20)//防止越过了下边界Temp=1;elseTemp=20-Temp;for(n=Temp+3;n>=Temp;n--)//积木图标的最顶行开始寻找满行比较有利于运算{if(num[n]==0xfff){Flag=1;for(m=n+1;m<=19;m++){num[m-1]=num[m];}num[m]=0x801;Score++;//每找到一个满行,则分数加1}}if(Flag)//为加速而设置并判断的标志,有已固定的积木有满格消行变化则重画积木界面{for(m=Temp;m<=19;m++)//为加速,不必要重第一行重画起,只需要从积木图标最下行开始往上的重画for(n=1;n<=10;n++){if((num[m]&MaskTab[n])==0){if(Lcd_ReadPixel(30-(n-1)*3,57-(m-1)*3)!=0)//为加速而做的读象素操作{Lcd_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,0);}}else{if(Lcd_ReadPixel(30-(n-1)*3,57-(m-1)*3)==0)//为加速而做的读象素操作{Lcd_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,1);}}}}}/*******************************随机产生一个积木图标放到预产生区域并显示出来********************************/void CreatSign(void){unsigned char n;unsigned int Temp;DrawSign(Sign[2],0);//先清除n=Random()*28;Temp=(unsigned int)Block[n][0]<<8;Temp=Temp|Block[n][1];Sign[2].dat=Temp;Sign[2].x=45;Sign[2].y=4*3+2;Sign[2].type=n/4;Sign[2].change=n%4;DrawSign(Sign[2],1);//后画出}void PrintScore(void){unsigned char Str[3];Str[0]=(Score/10)|0x30;Str[1]=(Score%10)|0x30;Str[2]=0;Lcd_WriteStr(6,2,Str);}void PrintLevel(void){unsigned char Str[3];Str[0]=(Level/10)|0x30;Str[1]=(Level%10)|0x30;Str[2]=0;Lcd_WriteStr(6,3,Str);}/********************************游戏的具体过程,也是俄罗斯方块算法的关键部分*********************************/void GamePlay(void){unsigned char m,n;unsigned int Temp;SysFlag|=1<<NEWSIGNFLAG;//刚开始初始化为需要产生新的积木图标InitRandom(TL0);Lcd_WriteStr(3,1,"Playing");PrintScore();PrintLevel();CreatSign();while(1){if((SysFlag&(1<<NEWSIGNFLAG))==1)//判是否需要产生新的积木图标{SysFlag&=~(1<<NEWSIGNFLAG);Sign[0]=Sign[2];CreatSign();Sign[0].x=12;Sign[0].y=14;for(m=0;m<4;m++)//行循环{for(n=0;n<4;n++)//列循环{if((Sign[0].dat&MaskTab[15-m*4-n])==0)break;}if(n==4)Sign[0].y-=3;}//将积木图标出现置顶for(m=0;m<4;m++)//行循环for(n=0;n<4;n++)//列循环{if((Sign[0].dat&MaskTab[4*m+n])!=0){if((num[20-(Sign[0].y-2)/3+m]&MaskTab[11-Sign[0].x/3-n])!=0)SysFlag|=1<<DEADFLAG;}}if((SysFlag&(1<<DEADFLAG))!=0)break;//如果产生新的积木图标中的方块与已固定好的方块重合,则死亡。

基于51单片机的俄罗斯方块游戏毕业设计论文

基于51单片机的俄罗斯方块游戏毕业设计论文
本文探讨基于8051单片机硬件平台和RTX51 Tiny多任务实时操作系统的俄罗斯方块游戏的设计与实现,将理论与实践相结合。其主要目标是再现经典的俄罗斯方块游戏,并在此基础上实现双人单机对战游戏模式,以丰富产品功能,增强游戏的趣味性。
2
2.1 STC12C5A60S2单片机概述
STC12C5A60S2系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、超强抗干扰的新一代8051系列单片机,指令代码完全兼容传统8051,但速度快8~12倍。用户程序空间为60KB,片上集成1280字节RAM,具有EEPROM功能,能够额外储蓄1KB的数据。该单片机共有4个16位定时器,两个与传统8051兼容的定时器/计数器,即16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器,再加上2路PCA模块可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟,此两路可编程计数器阵列(PCA)可用来再实现2个定时器。此外,STC12C5A60S2内部还集成MAX810专用复位电路,2路PWM,8路高速度10位A/D转换(250K/S),针对电机控制,强干扰场地合。
2.5复位系统
MCS51单片机通常采用上电自动复位和按钮复位两种方式。通常因为系统运行等需要,常常需要人工复位,本设计采用按钮复位的方式,即按下开关一定时间就能使RTS引脚端为高电平,从而使单片机复位。同时,简单复位电路中,干扰信号易串入复位端,由此可能会引起内部某些寄存器错误复位,这时可在RST引脚上接去耦电容。在STC12C5A60S2单片机中有两个复位端口,即RST/P4.7、RST2/P4.6,当晶振频率小于或等于12MHz时,使用RST端口。由于本设计使用外接12MHz的晶振作为振荡时钟,所以采用如图2-4所示的复位系统。

基于51单片机俄罗斯方块程序设计

基于51单片机俄罗斯方块程序设计

基于51单片机俄罗斯方块游戏设计作者:左厚臣前言闲得无事,想用单片机和LCD12864写一个俄罗斯方块游戏,培养培养兴趣,丰富一下业余生活,同时也熟练熟练单片机应用。

然后整理一下过程,本文没有什么专业的流程图,系统框图,随手画的。

希望各位大神勿喷,本菜鸟就献丑了。

关键字:51单片机LCD12864 俄罗斯方块游戏设计一、实物写真1、先展示一下实物效果呗,看能不能吸引到各位大神的眼球!!!!2、单片机选型IO口占用:7个程序存储器占用:6459Byte内部RAM:117.0Byte内部扩展RAM:1016ByteFosc = 24Mhz(也可选择12Mhz)中断使用状况:16位定时器溢出中断1个手头有一块STC12C5A60S2 51系列单片机,本实验也采用的此款单片机,或许有大神能用很节省资源的方法写出这款游戏,本菜鸟甘拜下风。

二、游戏算法整个游戏的算法也就是这样子的吧!下面就对每个步骤进说明吧!三、算法说明算法就捡重点的说吧,省得各位大神都闲啰嗦。

1、当前随机方块获取和下一回合游戏方块生成并显示此步骤拆解成如下流程图所示:(1)随机数生成51单片机需要调用库函数来产生随机数,如下:#include <stdlib.h>//调用库函数的头文件函数rand ()会生成一个int型的随机数,int型变量范围为-32768~32767占用2 字节。

我们使用时其实是可以把它当做一个unsigned int型变量的,取值范围0-65535 这个应该是很好理解的。

但是如果我们需要一个0-7的随机数怎么处理呢,没关系有办法,程序如下:u8 Random(u8 max){u16 temp;u8 a;max = max +1;temp=rand();//获取随机种子a = temp%max;return a;}其实也就是把得到随机数与想要得到数范围的最大数求余运算就可以了,即:a = temp%max;我们的游戏方块可以描述成2个要素:A、形状比如说形状有:■■■■■■■■■等,可用0-n来表示B、姿态比如说形状■■■姿态有4种如下:■■■■■■■■■■■■它们从左往右看可以看出规律分别旋转了0°,90°,180°,270°,也分别相对旋转了90°,可以用0-3来表示。

基于51单片机俄罗斯方块设计

基于51单片机俄罗斯方块设计

基于51单片机俄罗斯方块设计AbstractThis paper presents the design and implementation of a Tetris game on 51 microcontroller. The game was implemented using C language and was designed to run on a 16x16 LED matrix. The game involved the use of multiple technologies such as buttons, LEDs, and timers. The design of the game was successful and it provided a platform for users to interact with the game in a fun and engaging way.IntroductionTetris is a popular video game that has been played by millions of people around the world. The game was first developed in Russia in 1984 by Alexey Pajitnov. It has since become a widely popular game across multiple platforms including desktops, smartphones, and consoles. The objective of the game is to fit different shaped blocks onto a grid, clearing lines as they are filled. The game is timed, and the player with the highest score at the end of the game is declared the winner.The use of microcontrollers in designing games has become increasingly popular due to the ease of use and cost-effectiveness. The 51 microcontroller is a popular microcontroller that is widely used in designing and developing games. This microcontroller is exceptionally versatile and can be used to control a variety of devices, including motors, relays, LCDs, and LEDs. Its cost-effectiveness makes it an ideal choice for game developers who are looking to design games at a lower cost.MethodologyThe Tetris game was implemented using a 51 microcontroller, specifically the AT89C2051. The game controller was connected to a 16x16 LED matrix for visualization, as well as multiple buttons for user input. The game engine was written in C language and utilized timers to update the screen display, and to manage the speed of the falling blocks. An interrupt timer was also used to update the screen at a specified interval, to ensure that the screen animation was smooth.The game involved the use of multiple buttons, including start, pause, reset, and a directional button. Thedirectional button was used to maneuver the blocks into the desired position. The buttons were connected to thecontroller using a shift register and were scanned at a specified interval to ensure that the inputs were detected in real-time. The feedback from the buttons was provided to the player through the LED matrix display.ResultsThe implementation of the Tetris game on the 51 microcontroller was successful, and the game provided a fun and engaging experience for the player. The game wasintuitive and easy to play, with simple instructions that were displayed on the LED matrix. The game provided a challenge to the player, with increasing speed as the game progressed, resulting in more challenging gameplay.The game also provided a platform for further development, with the possibility of adding additional features such as high scores, sound effects, and multiplayer capabilities. The game design could also be ported to other microcontrollers, providing a wide audience for the game.ConclusionThe implementation of the Tetris game on the 51 microcontroller was a success, providing a fun and engaging platform for users to interact with the game. The use of C language, LEDs, buttons, and timers, in the game engine, made it possible to create a game that was intuitive and easy to play, with progressively increasing difficulty as the game progressed.Overall, the design of this game offers an exciting platform for the development of fun and engaging games that can be easily incorporated into different devices. With the continued improvements in technology and the increasing demand for games, the application of microcontrollers for designing games offers a promising future.。

基于单片机俄罗斯方块游戏设计报告

基于单片机俄罗斯方块游戏设计报告

基于单片机俄罗斯方块游戏设计报告一、研究意义俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,作为最经典的游戏之一,它曾造成的轰动与经济价值可以说是游戏史上的一件大事。

这款游戏最初是由苏联的游戏制作人 Alex Pajitnov 制作的,它看似简单但却变化无穷,令人上瘾。

相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。

虽然用单片机来设计一个简单的俄罗斯方块游戏程序似乎有点大材小用了,但这仅仅是一个单片机在嵌入式游戏方面的简单应用,正因为他的前景无可预计,所以才有这个设计,此次设计仅仅是为了举一个单片机在游戏上应用的一个简单例子,他可以很好的说明单片机功能的强大,更高的可控性和高集成度的好处,因此它可以在电子游戏方面成为一个不可计量的明日之星。

二、研究内容本设计要实现的基本功能是:应用按键来控制方块的变换与移动;消除一行并计分;消除多行额外奖励记分,方块堆满时结束游戏等俄罗斯方块的基本功能。

单片机在手持娱乐设备上的应用具有非常大的潜力,它能将其带入到一个新的阶段。

为了解决外部电路图,必须充分了解所用液晶的显示方法和单片机的外部接口功能,和所需要处理的逻辑关系;还要理解LCD液晶的控制原理,来通过数据端口和控制端口来实现画面在液晶上面的显示。

仿真图如下:三、系统程序设计1)俄罗斯方块驱动流程图:2)俄罗斯方块所有绘图工作流程图:3)俄罗斯方块中按下键的流程图:结束4)俄罗斯方块所有绘图工作流程图:四、分析及结论本文对单片机制作的俄罗斯方块游戏的运行原理进行了分析,全面、详细地阐述了俄罗斯方块游戏的设计过程。

本游戏机已经达到了掌上娱乐的要求,但在设计上还留有进一步改善的余地,如可以美化游戏界面、加入背景和动作音乐、力回馈系统等。

毕业设计的整个开发过程是曲折的,首先在硬件设计上,由于开始对LCD液晶屏不熟悉,加之其程序量较多,所以,在设计的过程中,不免有些困难,通过我多方面的查找资料,并不断的向老师和同学请教,结合网络资源,最终找出比较完善的方案,在理论上能够实现功能要求。

基于单片机实现的俄罗斯方块游戏

基于单片机实现的俄罗斯方块游戏

基于单片机实现的俄罗斯方块游戏俄罗斯方块游戏是一款经典的益智游戏,其简单的操作和不断增加的难度吸引了许多玩家。

在本文中,我们将介绍如何使用单片机实现一个简单的俄罗斯方块游戏。

为了实现这个项目,我们需要以下材料:1. 单片机:例如STM32F103C8T6或Arduino UNO;2.LCD显示屏:用于显示游戏界面;3.按键:用于控制方块的移动和旋转;4.蜂鸣器:用于播放游戏音效。

首先,我们需要连接LCD显示屏和单片机。

根据LCD显示屏和单片机的引脚定义,将它们正确地连接起来。

接下来,我们需要编写单片机的程序。

首先,我们需要初始化LCD显示屏和按键等外设。

接下来,我们需要实现方块的绘制和移动功能。

为了实现这些功能,我们需要使用几个基本的数据结构,例如数组和变量来表示方块的位置和状态。

我们可以使用一个二维数组来表示游戏区域。

每个单元格可以是一个数字,表示该位置有方块或者空白。

使用一个变量来表示当前方块的位置和状态,包括方块的类型、位置和旋转角度。

游戏的逻辑如下:首先,我们需要生成一个新的方块,并将其放置在游戏区域的顶部。

接下来,玩家可以使用按键来控制方块的移动和旋转。

当方块到达底部或者无法继续移动时,它将固定在游戏区域中,并生成一个新的方块。

玩家可以通过移动和旋转方块来填满游戏区域的行,当一行填满时,它将被清除,并且玩家将得分。

游戏的目标是尽可能地填满更多的行,得到更高的分数。

在我们的程序中,我们需要实现方块的绘制和移动功能。

我们可以使用LCD显示屏来绘制方块,使用按键来控制方块的移动和旋转。

在每次移动方块之后,我们需要检查游戏区域是否存在被填满的行,并进行相应的清除和得分操作。

另外,我们可以在游戏中加入一些音效,例如当方块固定在游戏区域中或者当一行被清除时,播放相应的音效。

我们可以使用蜂鸣器来实现这些音效。

在编写完程序后,我们可以将程序烧录到单片机中,并将LCD显示屏和按键等外设连接好。

最后,我们可以开始游戏了!。

基于单片机的俄罗斯方块游戏系统的设计

基于单片机的俄罗斯方块游戏系统的设计

基于单片机的俄罗斯方块游戏系统的设计概述:俄罗斯方块是一款经典的益智游戏,玩家需要通过控制不同形状的方块,使其在游戏区域内堆叠成完整的水平行,一旦一行被填满,就会被消除,并获得分数。

本文将介绍一种基于单片机的俄罗斯方块游戏系统的设计方案。

硬件设计:1.单片机选择:选择合适的单片机作为游戏系统的核心控制器。

可以选用8051、STM32等单片机进行设计,并根据具体需求选择相应的型号。

2.显示屏幕:使用LCD显示屏或OLED屏幕作为游戏界面的显示设备。

屏幕大小可以根据实际需求确定,一般选择2.3英寸至3.5英寸之间的屏幕尺寸。

3.控制按钮:设计合适的按键布局,包括方向控制键(上、下、左、右)、旋转键和暂停键等。

4.音频装置:可以选择蜂鸣器或扬声器作为游戏中的音效设备,用于播放游戏中的音效和音乐。

软件设计:1.初始化设置:系统上电后,进行相关的初始化设置,包括显示屏的初始化、按键的设置、计分初始化等。

2.游戏界面设计:设计游戏界面,包括显示下一个方块、显示当前游戏区域、显示计分、显示游戏状态等。

3.方块的生成和掉落:设计方块的生成算法,并通过时间控制方块的自动下落。

4.方块的移动和旋转:根据玩家的控制信号,移动或旋转当前方块的位置。

设计合适的算法,判断玩家的操作是否合法。

5.碰撞检测:使用适当的算法,实现方块与游戏区域、已落下的方块之间的碰撞检测,判断方块是否可以继续下落或进行旋转。

6.行消除:判断游戏区域的每一行是否被填满,如果是,则将该行消除,并计分。

7.游戏结束判定:当方块堆叠到游戏区域的顶部时,游戏结束。

停止方块的下落,并显示游戏结束信息。

8.游戏暂停和继续:设计游戏暂停和继续的功能,玩家可以通过按下暂停键暂停游戏,并通过再次按下继续键继续游戏。

9.音效和音乐播放:设计合适的算法,实现游戏中的音效和音乐的播放功能。

总结:以上介绍了基于单片机的俄罗斯方块游戏系统的设计方案,包括硬件设计和软件设计两个方面。

(完整word版)基于单片机的俄罗斯方块游戏机课程设计

(完整word版)基于单片机的俄罗斯方块游戏机课程设计
手动按钮复位需要人为在复位输入端RST上加入高电平(图1)。一般采用的办法是在RST端和正电源Vcc之间接一个按钮。当人为按下按钮时,则Vcc的+5V电平就会直接加到RST端。手动按钮复位的电路如所示。由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求.复位电路连接如图所示:
RST
复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
ALE/PROG
当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲.对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
P2口
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路.对端口P2写"1",通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存储器或16位地数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口输出P2锁存器的内容。Flash编程或校验时,P2亦接收高位地址和一些控制信号.
P3口
P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入”1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。

大学单片机毕业设计课程设计 - 俄罗斯方块

大学单片机毕业设计课程设计 - 俄罗斯方块

信息与电子工程学院题目:俄罗斯方块班级: 12应用电子技术3班材料包括仿真图、PCB、软件、制作图片等学习可留言时间: 2014-6-25目录一摘要 (1)二设计内容与要求 (1)2.1 内容 (1)2.2 要求 (1)三硬件设计说明 (1)3.1 STC89C52芯片 (1)3.1.1芯片简介 (1)3.1.2 电路应用 (2)3.1.3 主要性能参数 (2)3.1.4 功能概述 (2)3.1.5 引脚功能 (2)3.2 74HC573芯片 (4)3.2.1 芯片简介 (4)3.2.2 电路应用 (4)3.2.3 主要性能参数 (4)3.2.4 功能概述 (4)3.2.5 引脚功能 (4)3.3 74HC154芯片 (6)3.3.1 芯片简介 (6)3.3.2 电路应用 (6)3.3.3 主要性能参数 (6)3.3.4 功能概述 (6)3.3.5 引脚功能 (6)四工作原理 (8)4.1系统总体框图 (8)4.2端口去向表 (8)4.3硬件工作原理 (9)4.3.1最小系统模块工作原理 (9)4.3.2数码显示模块 (9)4.3.3点阵驱动模块 (10)4.3.4按键控制模块 (11)4.4软件工作原理 (11)五调试过程 (14)六总结 (15)附录Ⅰ原理图 (16)附录ⅡPCB图 (17)附录Ⅲ实物图 (18)附录ⅣBOM表 (20)附录Ⅴ仪器型号 (21)参考文献 (22)一摘要在这个信息时代,计算机已经离不开我们的生活,适当的游戏可以带来愉快的心情和健康,俄罗斯方块这个小游戏已经风靡全球,是一款老少皆宜的游戏。

二设计内容与要求2.1 内容我组俄罗斯方块共使用了STC89C52、74HC154和74HC573,三个芯片的共同使用,加上两个8*8的点阵屏来完成硬件的操作。

其中共使用6个按键进行功能的操作,每个按键的功能依程序而定分别有:复位、向上、向下、向左、向右和暂停/开始。

2.2 要求1.了解集成芯片的作用STC89C52、74HC154和74HC573及引脚功能;掌握电路的接线方式,记下每个按键的功能。

单片机俄罗斯方块程序

单片机俄罗斯方块程序
}
void delayms(uint count)
{
int i,j;
for(i=0;i<count;i++)
{
for(j=0;j<260;j++);
}
}
void Write_Cmd(uchar DH,uchar DL)
{
CS=0;
RS=0;
P0=DH;
RW=0;
RW=1;
P0=DL;
RW=0;
RW=1;
{
uchar k;
P1=0xff;
k=P1;
if(k!=0xff)
{
delay(100);
if(k!=0xff)
{
k=P1;
if(k==0xfd) return 1;
if(k==0xfb)return 2;
if(k==0xf7) return 3;
if(k==0xef) return 4;
}
}
return 8;
Write_Cmd_Data(0x000A,0x0000);
Write_Cmd_Data(0x000C,0x0000);
Write_Cmd_Data(0x000D,0x0000);
Write_Cmd_Data(0x000F,0x0000);
#include"reg52.h"
#define WINDOW_XADDR_START0x0050 // Horizontal Start Address Set
#define WINDOW_XADDR_END0x0051 // Horizontal End Address Set
#define WINDOW_YADDR_START0x0052 // Vertical Start Address Set

51单片机的俄罗斯方块(可打印修改)

51单片机的俄罗斯方块(可打印修改)

C语言程序#include <AT89X51.H>#define uchar unsigned char#define uint unsigned int#define DOWNTIME 30#define MAXHANG 20#define MAXLIE 16#define MAXPIX 3#define PUSHON 50#define LCD P2#define EN P3_0#define RW P3_1#define RS P3_2#define CS1 P3_3#define CS2 P3_4#define KEYLEFT P3_5#define KEYDOWN P3_6#define KEYRIGH P3_7#define KEYROTATION P1_0uchar gkey=0xff,keystate=0,t0ms1=0,t0ms=0,downtimegap=0; uchar miao=0,fen=0;uchar downok;bit keyflag,timeupdate,fashionupdate;uchar idata cubeMap[MAXHANG][2];typedef struct{uchar code * box;uchar cube : 4;uchar state : 4;char row;char column;} block;block this;uint score=0;uchar speed=1;uchar code bittable[8]={1,2,4,8,0x10,0x20,0x40,0x80}; uchar code cube[]={/* ■■■■*/0,4,0xe,0, 0,2,6,2, 0,7,2,0, 4,6,4,0,/*■■■■*/0,8,0xe,0, 0,4,4,0xc, 0,0,0xe,2, 0,6,4,4, /*■■■■*/0,0xe,8,0, 0,4,4,6, 0,1,7,0, 6,2,2,0, /*■■■■*/0,0xc,6,0, 0,2,6,4, 0,6,3,0, 2,6,4,0, /* ■■■■*/0,6,0xc,0, 0,4,6,2, 0,3,6,0, 4,6,2,0, /*■■■■*/0,0xf,0,0, 4,4,4,4, 0,0,0xf,0, 2,2,2,2, /*■■■■*/0,6,6,0, 0,6,6,0, 0,6,6,0, 0,6,6,0 };uchar code asii[]={0x3E,0x51,0x49,0x45,0x3E, // -0-0x00,0x42,0x7F,0x40,0x00, // -1-0x62,0x51,0x49,0x49,0x46, // -2-0x21,0x41,0x49,0x4D,0x33, // -3-0x18,0x14,0x12,0x7F,0x10, // -4-0x27,0x45,0x45,0x45,0x39, // -5-0x3C,0x4A,0x49,0x49,0x31, // -6-0x01,0x71,0x09,0x05,0x03, // -7-0x36,0x49,0x49,0x49,0x36, // -8-0x46,0x49,0x49,0x29,0x1E, // -9-0x00,0x36,0x36,0x00,0x00, // -:-10//next0x7F,0x04,0x08,0x10,0x7F, // -N-110x7F,0x49,0x49,0x49,0x41, // -E-120x63,0x14,0x08,0x14,0x63, // -X-130x01,0x01,0x7F,0x01,0x01, // -T-14//speed0x26,0x49,0x49,0x49,0x32, // -S-150x7F,0x09,0x09,0x09,0x06, // -P-160x7F,0x49,0x49,0x49,0x41, // -E-170x7F,0x41,0x41,0x41,0x3E, // -D-18//score0x3E,0x41,0x41,0x41,0x22, // -C-190x3E,0x41,0x41,0x41,0x3E, // -O-200x7F,0x09,0x19,0x29,0x46, // -R-210x00,0x00,0x00,0x00,0x00, // - -22//GAME OVER0x3E,0x41,0x51,0x51,0x72, // -G-230x7C,0x12,0x11,0x12,0x7C, // -A-240x7F,0x02,0x0C,0x02,0x7F, // -M-250x1F,0x20,0x40,0x20,0x1F, // -V-26//TIME// 0x00,0x41,0x7F,0x41,0x00 // -I-27};//////////////////////////////////////////////////////////////////////////////// void lcdCmd(uchar cmd){bit ea;ea=EA;EA=0;EN=0;RW=0;RS=0;LCD=cmd;EN=1;EN=1;EN=0;EA=ea;}//-------------------------------------------------------------------------------void lcdWriteByte(uchar ch){EN=0;RS=1;RW=0;LCD=ch;EN=1;EN=1;EN=0;}//--------------------------------------------------------------------------------void lcdSetPage(uchar page){page &=0x7;page +=0xb8;lcdCmd(page);}//--------------------------------------------------------------------------------void lcdSetColumn(uchar column){column &=0x3f;column +=0x40;lcdCmd(column);}//--------------------------------------------------------------------------------//character fron=5*8void lcdPlayChar(uchar index,uchar page,uchar colume){uchar i,temp;uint p;p=5*index;for(i=colume;i<colume+5;i++){if(i<64){CS1=1;CS2=0;temp=i;}else{CS1=0;CS2=1;temp=i-64;}lcdSetPage(page);lcdSetColumn(temp);lcdWriteByte(asii[p++]);}}//---------------------------------------------------------------------------------//rectangle(3,0,50,60)void rectangle(void){uchar i,page;CS1=1;CS2=0;lcdSetPage(0); lcdSetColumn(2);EN=0;RS=1;RW=0;LCD=0xff;EN=1;EN=1;EN=0;for(i=3;i<51;i++){EN=0;RS=1;RW=0;LCD=0x1;EN=1;EN=1;EN=0;}EN=0;RS=1;RW=0;LCD=0xff;EN=1;EN=1;EN=0;//---------------------------for(page=1;page<7;page++) {lcdSetPage(page); lcdSetColumn(2);EN=0;RS=1;RW=0;LCD=0xff;EN=1;EN=1;EN=0;for(i=3;i<51;i++){EN=0;RS=1;RW=0;LCD=0x0;EN=1;EN=1;EN=0;}EN=0;RS=1;RW=0;LCD=0xff;EN=1;EN=1;EN=0;}//---------------------------lcdSetPage(7);lcdSetColumn(2);EN=0;RS=1;RW=0;LCD=0x1f;EN=1;EN=1;EN=0;for(i=3;i<51;i++){EN=0;RS=1;RW=0;LCD=0x10;EN=1;EN=1;EN=0;}EN=0;RS=1;RW=0;LCD=0x1f;EN=1;EN=1;EN=0;}//--------------------------------------------------------------------//x:列;y行,页3*3void lcdPutPix(uchar x, uchar y,uchar flag) {uchar i,dat,bitmask,nextbit;bit bflag,pflag,ea;x=x*MAXPIX;y=y*MAXPIX;bflag=0;pflag=0;i=y%8;if(i==0)bitmask=0x7;else if(i==1)bitmask=0xe;else if(i==2)bitmask=0x1c;else if(i==3)bitmask=0x38;else if(i==4)bitmask=0x70;else if(i==5)bitmask=0xe0;else if(i==6){bflag=1;bitmask=0xc0;nextbit=1;}else if(i==7){bflag=1;bitmask=0x80;nextbit=3;}if(x<62){CS1=1;CS2=0;}else if(x>63){x-=64;CS1=0;CS2=1;}elsepflag=1;lcdSetPage(y/8);for(i=x;i<x+MAXPIX;i++){if(pflag){if(i==62 || i==63){CS1=1;CS2=0;lcdSetPage(y/8);}else if(pflag && i==64){CS1=0;CS2=1;lcdSetPage(y/8);}}lcdSetColumn(i);ea=EA;EA=0;EN=0;LCD=0xff;RS=1;RW=1;EN=1;EN=0;EN=1;dat=LCD;EN=0;if(flag==1)dat|=bitmask;elsedat&=~bitmask;lcdSetColumn(i);EN=0;RW=0;RS=1;LCD=dat;EN=1;EN=0;EA=ea;}if(bflag){lcdSetPage(y/8+1);for(i=x;i<x+MAXPIX;i++) {if(pflag){if(i==62 || i==63){CS1=1;CS2=0;lcdSetPage(y/8+1);}else if(pflag && i==64){CS1=0;CS2=1;lcdSetPage(y/8+1);}}lcdSetColumn(i);ea=EA;EA=0;EN=0;LCD=0xff;RS=1;RW=1;EN=1;EN=0;EN=1;dat=LCD;EN=0;if(flag==1)dat|=nextbit;elsedat&=~nextbit;lcdSetColumn(i);EN=0;RS=1;LCD=dat;EN=1;EN=1;EN=0;EA=ea;}}}//------------------------------------------------------------------void lcdClear(void){uchar i,page;CS1=1;CS2=0;for(page=0;page<8;page++){lcdSetPage(page);lcdSetColumn(0);for(i=0;i<64;i++)lcdWriteByte(0);}CS1=0;CS2=1;for(page=0;page<8;page++){lcdSetPage(page);lcdSetColumn(0);for(i=0;i<64;i++)lcdWriteByte(0);}}//-----------------------------------------------------------------#define STAR 53#define WIDE 6void lcdIni(void){lcdCmd(0x3f);lcdCmd(0xc0);lcdClear();rectangle();//NEXTlcdPlayChar(11,0,STAR);lcdPlayChar(12,0,STAR+1*WIDE); lcdPlayChar(13,0,STAR+2*WIDE); lcdPlayChar(14,0,STAR+3*WIDE);//SPEEDlcdPlayChar(15,3,STAR);lcdPlayChar(16,3,STAR+1*WIDE); lcdPlayChar(17,3,STAR+2*WIDE); lcdPlayChar(17,3,STAR+3*WIDE); lcdPlayChar(18,3,STAR+4*WIDE);//01lcdPlayChar(0,4,STAR+2*WIDE); lcdPlayChar(1,4,STAR+3*WIDE);//SCORElcdPlayChar(15,5,STAR);lcdPlayChar(19,5,STAR+1*WIDE); lcdPlayChar(20,5,STAR+2*WIDE); lcdPlayChar(21,5,STAR+3*WIDE); lcdPlayChar(12,5,STAR+4*WIDE); lcdPlayChar(0,6,STAR+1*WIDE); lcdPlayChar(0,6,STAR+2*WIDE); lcdPlayChar(0,6,STAR+3*WIDE); lcdPlayChar(0,6,STAR+4*WIDE);//TIMElcdPlayChar(0,7,STAR);lcdPlayChar(0,7,STAR+1*WIDE); lcdPlayChar(10,7,STAR+2*WIDE); lcdPlayChar(0,7,STAR+3*WIDE); lcdPlayChar(0,7,STAR+4*WIDE);}//-----------------------------------------------------------------void showScoreSpeed(void){uchar num[5];char i;uint temp;temp=score;for(i=0;i<5;i++){num[i]=temp%10;temp=temp/10;}for(i=4;i>0;i--)if(num[i]==0)num[i]=22;elsebreak;}for(i=4;i>-1;i--)lcdPlayChar(num[i],6,STAR+(4-i)*WIDE);lcdPlayChar(speed/10,4,STAR+2*WIDE);lcdPlayChar(speed%10,4,STAR+3*WIDE);}//-------------------------------------------------------------------void timeServer(void){if(timeupdate){timeupdate=0;lcdPlayChar(fen/10,7,STAR);lcdPlayChar(fen%10,7,STAR+1*WIDE);lcdPlayChar(10,7,STAR+2*WIDE);lcdPlayChar(miao/10,7,STAR+3*WIDE);lcdPlayChar(miao%10,7,STAR+4*WIDE);}if(fashionupdate){fashionupdate=0;lcdPlayChar(22,7,STAR+2*WIDE);}}//=================================================================== void t0isr(void) interrupt 1{uchar key;TH0=(65536-10000)/256;TL0=(65536-10000)%256;downtimegap++;t0ms=++t0ms%100;if(t0ms==0){timeupdate=1;miao=++miao%60;if(miao==0)fen=++fen%60;if(t0ms==50)fashionupdate=1;//----------------------------key=0xff;KEYLEFT=1;KEYRIGH=1; KEYROTATION=1;KEYDOWN=1;if(!KEYLEFT)key=0;if(!KEYRIGH)key=1;if(!KEYROTATION)key=2;if(!KEYDOWN)key=3;switch(keystate){case 0: if(key!=gkey){gkey=key;keystate=1;}break;case 1: if(key==gkey){t0ms1=0;keystate=2;if(key!=0xff)keyflag=1;}elsekeystate=0;break;case 2: if(key==gkey){if(t0ms1<PUSHON)t0ms1++;}else{keystate=0;keyflag=0;gkey=0xff;}break;}}//=================================================================== void showNextCube(uchar code * p,uchar x,uchar y){uchar i,j,temp;for(i=0;i<4;i++){temp=1;for(j=0;j<4;j++){if(p[i] & temp)lcdPutPix(x+j,y+i,1);elselcdPutPix(x+j,y+i,0);temp<<=1;}}}//------------------------------------------------------------------void createCube(void){static uchar next;this.cube=next;next=TL0%7;this.row=0;this.column=6;this.state=0;this.box=cube+16*this.cube;showNextCube(cube+16*next,19,3);}//------------------------------------------------------------------void showCubeMap(void){unsigned char hang,lie,temp;for(hang=MAXHANG-1;hang>0;hang--){if(cubeMap[hang][0]==0 && cubeMap[hang][1]==0)break;for(lie=0;lie<(MAXLIE/8);lie++){temp=8*lie;if(cubeMap[hang][lie]&0x01)lcdPutPix(temp+1,hang,1);if(cubeMap[hang][lie]&0x02)lcdPutPix(temp+2,hang,1);if(cubeMap[hang][lie]&0x04)lcdPutPix(temp+3,hang,1);if(cubeMap[hang][lie]&0x08)lcdPutPix(temp+4,hang,1);if(cubeMap[hang][lie]&0x10)lcdPutPix(temp+5,hang,1);if(cubeMap[hang][lie]&0x20)lcdPutPix(temp+6,hang,1);if(cubeMap[hang][lie]&0x40)lcdPutPix(temp+7,hang,1);if(cubeMap[hang][lie]&0x80)lcdPutPix(temp+8,hang,1);}}}//-------------------------------------------------------------------void writeCubeToMap(void){uchar row,column,temp;uchar hang,lie;for(row=0;row<4;row++){temp=1;for(column=0;column<4;column++){if(this.box[row] & temp){hang=this.row+row;lie=this.column+column;cubeMap[hang][lie/8] |=bittable[lie%8];lcdPutPix(lie+1,hang,1);}temp<<=1;}}}//-------------------------------------------------------------------void clearCubeFromMap(void){uchar row,column,temp;uchar hang,lie;for(row=0;row<4;row++){temp=1;for(column=0;column<4;column++){if(this.box[row] & temp){hang=this.row+row;lie=this.column+column;cubeMap[hang][lie/8] &=~bittable[lie%8];lcdPutPix(lie+1,hang,0);}temp<<=1;}}}//-------------------------------------------------------------------uchar checkBorder(void){if(this.box[3]!=0 && this.row>(MAXHANG-4))return 1;else if(this.box[2]!=0 && this.row>(MAXHANG-3))return 1;else if(this.box[1]!=0 && this.row>(MAXHANG-2))return 1;else if(this.box[0]!=0 && this.row>(MAXHANG-1))return 1;//---------------------if((this.box[0] & 0x01) || (this.box[1] & 0x01) || (this.box[2] & 0x01) ||(this.box[3] & 0x01) ) {if(this.column<0)return 1;}else if((this.box[0] & 0x02) || (this.box[1] & 0x02) || (this.box[2] & 0x02) ||(this.box[3] & 0x02) ) {if(this.column<-1)return 1;}else if((this.box[0] & 0x04) || (this.box[1] & 0x04) || (this.box[2] & 0x04) ||(this.box[3] & 0x04) ) {if(this.column<-2)return 1;}else if((this.box[0] & 0x08) || (this.box[1] & 0x08) || (this.box[2] & 0x08) ||(this.box[3] & 0x08) ){if(this.column<-3)return 1;}//---------------------if((this.box[0] & 0x08) || (this.box[1] & 0x08) || (this.box[2] & 0x08) ||(this.box[3] & 0x08) ) {if(this.column>(MAXLIE-4))return 1;}else if((this.box[0] & 0x04) || (this.box[1] & 0x04) || (this.box[2] & 0x04) ||(this.box[3] & 0x04) ) {if(this.column>(MAXLIE-3))return 1;}else if((this.box[0] & 0x02) || (this.box[1] & 0x02) || (this.box[2] & 0x02) ||(this.box[3] & 0x02) ) {if(this.column>(MAXLIE-2))return 1;}else if((this.box[0] & 0x08) || (this.box[1] & 0x08) || (this.box[2] & 0x08) ||(this.box[3] & 0x08) ) {if(this.column>(MAXLIE-1))return 1;}//--------------------return 0;}//------------------------------------------------------------------uchar checkClask(void){uchar row,column,temp;uchar hang,lie;for(row=0;row<4;row++){temp=1;for(column=0;column<4;column++){if(this.box[row] & temp){hang=this.row+row;lie=this.column+column;if(cubeMap[hang][lie/8] & bittable[lie%8])return 1;}temp<<=1;}}return 0;}//-------------------------------------------------------------------void checkMap(void){uchar i,j,delete;bit full;full=0;delete=0;for(i=MAXHANG-1;i>0;i--){if(cubeMap[i][0]==0 && cubeMap[i][1]==0)break;if(cubeMap[i][0]==0xff && cubeMap[i][1]==0xff) {delete++;full=1;for(j=i;j>0;j--){cubeMap[j][0]=cubeMap[j-1][0];cubeMap[j][1]=cubeMap[j-1][1];}i++;cubeMap[0][0]=0;cubeMap[0][1]=0;}}if(full){if(delete==1)score++;else if(delete==2)score+=4;else if(delete==3)score+=9;else if(delete==4)score+=16;rectangle();showCubeMap();if(score<50)speed=1;else if(score<100)speed=2;else if(score<500)speed=3;else if(score<1000)speed=4;else if(score<5000)speed=5;else if(score<10000)speed=6;else if(score<20000)speed=7;else if(score<30000)speed=8;else if(score<40000)speed=9;else if(score<50000)speed=10;else if(score<60000)speed=11;elsespeed=12;showScoreSpeed();}}//-------------------------------------------------------------------void moveLeft(void){clearCubeFromMap();this.column--;if(checkBorder() || checkClask())this.column++;writeCubeToMap();}//-------------------------------------------------------------------void moveRigh(void){clearCubeFromMap();this.column++;if(checkBorder() || checkClask())this.column--;writeCubeToMap();}//-------------------------------------------------------------------void moveDown(void){clearCubeFromMap();this.row++;if(checkBorder() || checkClask()){this.row--;downok=1;}elsedownok=0;writeCubeToMap();if(downok)checkMap();}//------------------------------------------------------------------void cubeRotation(void){uchar temp;temp=this.state;clearCubeFromMap();this.state=++this.state%4;this.box=cube+16*this.cube+4*this.state;if(checkBorder() || checkClask()){this.state=temp;this.box=cube+16*this.cube+4*this.state;}writeCubeToMap();}///////////////////////////////////////////////////////////////////// void main(void){TMOD=0x1;TH0=(65536-10000)/256;TL0=(65536-10000)%256;EA=1;ET0=1;TR0=1;lcdIni();for(t0ms=0;t0ms<MAXHANG;t0ms++){cubeMap[t0ms][0]=0;cubeMap[t0ms][1]=0;}while(1){createCube();if(checkClask()){rectangle();#define SHOWSTAR 12#define GAP 8lcdPlayChar(23,2,SHOWSTAR); //GAMElcdPlayChar(24,2,SHOWSTAR+GAP);lcdPlayChar(25,2,SHOWSTAR+2*GAP);lcdPlayChar(12,2,SHOWSTAR+3*GAP);lcdPlayChar(20,4,SHOWSTAR); //OVERlcdPlayChar(26,4,SHOWSTAR+GAP);lcdPlayChar(12,4,SHOWSTAR+2*GAP);lcdPlayChar(21,4,SHOWSTAR+3*GAP);t0ms=0;while(t0ms<95);//延时2秒t0ms=0;while(t0ms<95);((void (code *) (void)) 0x0000) ( );}while(1){timeServer();if(keyflag){keyflag=0;t0ms1=0;if(gkey==0)moveLeft();if(gkey==1)moveRigh();if(gkey==2)cubeRotation();if(gkey==3)moveDown();}if(gkey==0 && t0ms1==PUSHON){t0ms1-=10;moveLeft();}if(gkey==1 && t0ms1==PUSHON){t0ms1-=10;moveRigh();}if(gkey==3 && t0ms1==PUSHON){t0ms1-=10;moveDown();}if(downtimegap>(DOWNTIME-speed)){moveDown();downtimegap=0;}if(downok){downok=0;break;}}}}电路图:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机课程设计俄罗斯方块学院:工程技术学院专业:08级电子科学与技术小组成员:何冠羲,马志祥,李洋,张世刚,叶彪,郑先安,洪之目录摘要引言1.程序整体思路2.8X8LED模块显示原理3.硬件电路仿真图4.图形显示5.消层算法6.旋转算法7.实物焊接8.心得体会附录程序代码摘要记得在很小的时候,有一种掌上游戏机,里面有一款游戏叫做俄罗斯方块,那时的我们只是简单的按照游戏规则进行“堆积木”,而其中的原理却很少有人去思考,毕竟当时的我们都还很年幼。

基于单片机课程设计的机会,我们这个小组将使用51单片机和8x8led的组合,来实现比较简单的俄罗斯方块设计。

此次设计初期是在keil和proteus联合仿真中进行,编程语言为51汇编,后期是进行实物焊接。

论文描述了俄罗斯方块的主要功能函数的实现,算法分析和实物焊接过程中遇到的问题。

关键词:俄罗斯方块;算法; 8X8led;引言游戏是人们活动中一项非常重要的内容,有人认为如果哪一天人类对所有的游戏都失去兴趣,恐怕世界的末日就要到了。

电脑对游戏的贡献有目共睹,现在摸过电脑的人很少有没玩过电脑游戏的,喜欢游戏的人也很少有不玩电脑的。

俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。

这款游戏最初是由苏联的游戏制作人Alex Pajitnov制作的,它看似简单但却变化无穷,令人上瘾。

相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。

究其历史,俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。

现在联众又将重新掀起这股让人沉迷的俄罗斯方块风潮。

对一般用户来说,它的规则简单,容易上手,且游戏过程变化无穷,而在"联众俄罗斯方块"中,更有一些联众网络游戏所独有的魅力――有单机作战与两人在线对战两种模式,用户可任选一种进行游戏。

网络模式还增加了积分制,使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所。

俄罗斯方块游戏可以说是随计算机的发展而发展,并不断推陈出新演变出各种类似游戏, 深受广大玩家喜爱。

这个游戏有的简单, 有的复杂, 但其根本原理是一样的都是对运动的方块进行组合, 来训练玩家的反应能力。

本文利用单片机进行俄罗斯方块设计,采用51汇编语言进行编程,基于汇编语言的原因是在编写程序的过程中,对于程序的执行会有一个比较直观的表现。

1.程序整体思路单片机上的程序设计一般是一个大循环结构,对于俄罗斯方块的程序设计,首先产生一个伪随机数,其范围是0-6,然后程序根据此数值所对应的图形模块装入ram的固定区域内,紧接着将此图像写入led所对应的显示缓冲区中,显示程序将缓冲区内的内容显示在led上,如果没有控制键按下,图形将自动向下移动。

如果有键按下,程序将根据按下的键来改变图形存储区的值,同时程序将判断图形是否已到达边界,当图形最上层到达显示区顶部,则游戏结束,此时将清楚显示缓冲的内容,游戏重新开始。

2.8x8led显示原理8x8led显示屏的原理图如下由于人眼的视觉暂留现象,通过逐行扫描显示的方式来显示要显示的内容,当每一行扫描的时间很小时人眼观察的将是一幅完整的图像。

3.硬件电路仿真图.4.图形显示8x8led一共有64个led,可以从下至上一次对其编号,对于显示类的基本操作是任意点亮一个点,熄灭一个点,任意点亮n(0<n<=64)个点,灭掉n个点,如此一来游戏的第一个关键点就完成了。

我们将ram中从21h单元到28h单元作为led的显示缓冲区,这里面的每一位对应led 的一个点,led将实时显示缓冲区的内容,也就是当此缓冲区内容一改变,led上看到的也会做出相应的改变。

同时在俄罗斯方块中那些方块被存放在一个类似于一维的数组之中,每一个方块对应四个小方块,根据伪随机数将这四个小方块对应的值装入ram固定的区域内。

如果要显示方块只需将这些方块所对应的点写入缓冲区。

5.消层算法设置循环变量数R2=8,即总共至少要扫描8次,每一次循环过程中检测此行是否已满,也就是检测这一行所对应的存储单元是否全为一,如果全为一则将消去此行,即将此行对应的ram清零。

同时将此行上面ram的内容按每列依次下移,下移完之后重新将R2=0,又从第一行开始检测。

此行不全为零时只需将R2=R2+1。

直到R2=9消层过程结束。

6.旋转算法首先要确定一个旋转中心,假如旋转中心的编号是34,将34除以8,商是4存入R1余数是2存入R2,及时用商和余数建立坐标系。

此时若以此为旋转中心的图形需要旋转,则将每一个小方块对应编号除以8,商减去R1,余数减去R2,而每一个方块一次将旋转90度,所以有公式x1,y1,x2,y2 x2= - y1,y2= x1其中x1,y1为旋转之前的坐标,x2,y2为旋转之后的坐标。

旋转完之后将x2加上R1将y2加上R2,然后将x2乘以8再加上y2。

执行四次此过程旋转结束。

7.实物焊接器件:stc51单片机一块,8x8led显示模块一块,电阻10k10个,开关5个,与门,12m 晶振一个,电容3个。

首先按照目的进行进行元器件布局,然后按照电路图里的导线的连接次序将元器件焊在电路板上,焊好之后进行调试。

8.心得体会写程序的过程中,首先应该把程序思路理清,然后再写代码,否则写到一半感觉行不通时是很令人心烦的。

还有就是焊接是一个技术活,因为在电子工艺实习之后大家便没有碰过电烙铁,所以焊的过程还是很辛苦的。

附录:程序代码ORG 0000HAJMP STARTORG 0003HAJMP INTERRUPTAA EQU 10000000BBB EQU 11111111BHANG EQU 32HLIE EQU 33HCOUNT EQU 34HREMOVEROW EQU 35HSTEPS EQU 36HXUNHUAN EQU 37HBIANLIANG EQU 38HGRAPHRAM1 EQU 39HGRAPHRAM2 EQU 40HGRAPHRAM3 EQU 41HGRAPHRAM4 EQU 42HXXX EQU 43HYYY EQU 44HKEY EQU 45HLEDHEAD EQU 21HTEST BIT 100BITS BIT 99RIGHT BIT 98LEFT BIT 97DOWN BIT 96HARD BIT 95TURN BIT 94KEYDOWN BIT 93TESTING BIT 92BOTTOM BIT 91 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;程序由此处开始执行;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;START:MOV TCON,#00000001B;;;;;;;;;;;;;设置外部中断0响应方式为下降沿触发SETB EX0SETB EAMOV SP,#60H;;;;;;;;;;;;;;;;;;;;;将堆栈指针SP设置在RAM的高地址处MOV R7,#6;;;;;;;;;;;;;;;;;;;;;;R7作为存放0-6这7个随机数的变量MOV P0,#11111111B;;;;;;;;;;;;;;;;;;;;;;将P0口最为输入口LCALL WRITEGRAPHTORAMCLR TESTINGGAMELOOP:;CLR EALCALL SHOWGRAPHMOV R6,#30TIMING:LCALL SHOWLEDRAMLCALL DELAYDJNZ R6,TIMINGLCALL DOWNTESTJNB DOWN,NEXT1ABCD:MOV A,28HCJNE A,#0,GAMEOVERLCALL REMOVEBLOCKLCALL WRITEGRAPHTORAMJMP GAMELOOPNEXT1:;JB KEYDOWN,KEY1JMP KEY4KEY1:CLR TESTINGCLR KEYDOWNMOV A,KEYCJNE A,#1,KEY2;1-LEFTLCALL LEFTTESTJB LEFT, KEY4LCALL CLEANGRAPHLCALL MOVELEFTLCALL GAMELOOPKEY2:CJNE A,#2,KEY3;2-RIGHTLCALL RIGHTTESTJB RIGHT, KEY4LCALL CLEANGRAPHLCALL MOVERIGHTLCALL GAMELOOPKEY3:CJNE A,#4,KEY4;4-ROTATE;LCALL ROTATIONTEST;JNB TURN, KEY4LCALL CLEANGRAPH LCALL ROTA TIONJMP GAMELOOPKEY4:CJNE A,#8,KEY5 SWEAT:LCALL DOWNTESTJB DOWN,GAMELOOP LCALL CLEANGRAPH LCALL MOVEDOWNJMP SWEATKEY5:LCALL CLEANGRAPH LCALL MOVEDOWNINC R7CJNE R7,#7,NEXT5MOV R7,#0NEXT5:JMP GAMELOOP GAMEOVER:MOV R0,#8MOV R1,#LEDHEAD CLEAR:LCALL CLEANGRAPH MOV @R1,#0INC R1DJNZ R0,CLEARMOV R0,#4MOV R1,#GRAPHRAM1 ASDF:MOV A,@R1ADD A,#16MOV @R1,AINC R1DJNZ R0,ASDFJMP GAMELOOP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;测试图形是否能向下移动;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DOWNTEST:PUSH 0PUSH 1PUSH 2PUSH 3PUSH BPUSH ACCMOV R2,#4MOV R0,#GRAPHRAM1DOWN0:MOV A,@R0SUBB A,#8MOV B,AMOV R3,#4CLR CMOV R1,#GRAPHRAM1DOWN2:CLR CSUBB A,@R1JZ DOWN1INC R1MOV A,BDJNZ R3,DOWN2LCALL TESTBITJB BITS,DOWN3DOWN1:INC R0DJNZ R2,DOWN0CLR DOWNJMP HOPEDOWN3:SETB DOWN;DOWN WEI YI BIAO SHI BU NENG W ANG XIA YI DONG CPL P3.4JMP DOWN4HOPE:MOV R2,#4MOV R0,#GRAPHRAM1YOUQIANG2:MOV R3,#1CCC2:MOV A,R3MOV B,ACLR CSUBB A,@R0JNZ CCC1SETB DOWNSETB BOTTOMJMP DOWN4CCC1:MOV A,BINC R3CJNE R3,#9,CCC2INC R0DJNZ R2,YOUQIANG2 DOWN4:POP ACCPOP BPOP 3POP 2POP 1POP 0RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;外部中断0中断处理程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; INTERRUPT:PUSH 0PUSH 1PUSH ACCINC R7CJNE R7,#7,INTT MOV R7,#0 INTT:SETB TESTING SETB KEYDOWN MOV A,P0CPL AMOV KEY,APOP ACCPOP 1POP 0RETI ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;测试能否旋转;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;向下移动;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MOVEDOWN:PUSH 0PUSH 1PUSH ACCMOV R0,#GRAPHRAM1 MOV R1,#4MOVE1:MOV A,@R0CLR CSUBB A,#8MOV @R0,AINC R0DJNZ R1,MOVE1POP ACCPOP 1POP 0RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;向左移动;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MOVELEFT:PUSH 0PUSH 1PUSH ACCMOV R0,#GRAPHRAM1 MOV R1,#4MOVE2:MOV A,@R0CLR CSUBB A,#1MOV @R0,AINC R0DJNZ R1,MOVE2POP ACCPOP 1POP 0RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;向右移动;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MOVERIGHT:PUSH 0PUSH 1PUSH ACCMOV R0,#GRAPHRAM1 MOV R1,#4MOVE3:MOV A,@R0CLR CINC AMOV @R0,AINC R0DJNZ R1,MOVE3 POP ACCPOP 1POP 0RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;将图形写入RAM缓存中;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WRITEGRAPHTORAM:PUSH ACCPUSH BPUSH 0PUSH 1PUSH 2PUSH 7MOV R1,#4MOV A,R7MOV B,#4MUL ABMOV R2,AMOV R0,#GRAPHRAM1 MOV DPTR,#GRAPH WRITEGRAPH:MOV A,R2MOVC A,@A+DPTR;SUBB A,#16MOV @R0,AINC R2INC R0DJNZ R1,WRITEGRAPH POP 7POP 2POP 1POP 0POP BPOP ACCRET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;测试某一个二进制位是否为1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TESTBIT:PUSH 0PUSH 1PUSH BPUSH ACCMOV B,#8DIV ABMOV R0,AMOV A,BCJNE A,#0,TEST3 MOV A,R0DEC AJMP TEST4TEST3:MOV A,R0TEST4:MOV DPTR,#TAB1MOV R1,#LEDHEAD ADD A,R1MOV R1,AMOV A,BMOVC A,@A+DPTR ANL A,@R1CJNE A,#0,TEST1 CLR BITSJMP TEST2TEST1:SETB BITSTEST2:POP ACCPOP BPOP 1POP 0RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;测试图形是否能向左移动;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;LEFTTEST:PUSH 0PUSH 1PUSH 2PUSH 3PUSH BPUSH ACCMOV R2,#4MOV R0,#GRAPHRAM1LEFT0:MOV A,@R0CLR CSUBB A,#1MOV B,AMOV R3,#4;CLR CMOV R1,#GRAPHRAM1LEFT2:CLR CSUBB A,@R1JZ LEFT1INC R1MOV A,BDJNZ R3,LEFT2LCALL TESTBITJB BITS,LEFT3LEFT1:INC R0DJNZ R2,LEFT0CLR LEFTJMP LEFT4LEFT3:SETB LEFT;DOWN WEI YI BIAO SHI BU NENG W ANG XIA YI DONG CPL P3.4JMP LEFT5LEFT4:MOV R2,#4MOV R0,#GRAPHRAM1YOUQIANG:MOV R3,#9MOV A,#1HHH2:MOV B,ACLR CSUBB A,@R0JNZ HHH1SETB LEFTJMP LEFT5HHH1:MOV A,BADD A,#8DJNZ R3,HHH2INC R0DJNZ R2,YOUQIANG LEFT5:POP ACCPOP BPOP 3POP 2POP 1POP 0RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;测试图形是否能向右移动;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RIGHTTEST:PUSH 0PUSH 1PUSH 2PUSH 3PUSH BPUSH ACCMOV R2,#4MOV R0,#GRAPHRAM1 RIGHT0:MOV A,@R0ADD A,#1MOV B,AMOV R3,#4;CLR CMOV R1,#GRAPHRAM1 RIGHT2:SUBB A,@R1JZ RIGHT1INC R1MOV A,BDJNZ R3,RIGHT2LCALL TESTBITJB BITS,RIGHT3RIGHT1:INC R0DJNZ R2,RIGHT0CLR RIGHTJMP RIGHT4RIGHT3:SETB RIGHT;DOWN WEI YI BIAO SHI BU NENG W ANG XIA YI DONG CPL P3.4JMP RIGHT5RIGHT4:MOV R2,#4MOV R0,#GRAPHRAM1YOUQIANG1:MOV R3,#8MOV A,#8III2:MOV B,ACLR CSUBB A,@R0JNZ III1SETB RIGHTJMP RIGHT5III1:MOV A,BADD A,#8DJNZ R3,III2INC R0DJNZ R2,YOUQIANG1RIGHT5:POP ACCPOP BPOP 3POP 2POP 1POP 0RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;图形旋转;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ROTA TION:PUSH 0PUSH 1PUSH 2PUSH 3PUSH BPUSH ACCMOV A,GRAPHRAM1 ;A=50 MOV B,#8DIV AB ;A=6 B= 2 MOV HANG,A ;HANG = 6 MOV LIE,B ;LIE = 2 MOV R3,#4MOV R0,#GRAPHRAM1 ROTA TESTART:MOV A,@R0MOV B,#8DIV ABCLR CSUBB A,HANGMOV R1,AMOV A,BCLR CSUBB A,LIEMOV R2,A ;;;;;;;;;;;;;;;;;;X2=-Y1 Y2=X1MOV A,#0CLR CSUBB A,R2 ;-Y1MOV B,R1 ;X1MOV R1,A ;X2=-Y1MOV R2,B ;Y2=X1MOV A,R1ADD A,HANGMOV R1,AMOV A,R2ADD A,LIEMOV R2,AMOV A,R1MOV B,#8MUL ABADD A,R2MOV @R0,AINC R0DJNZ R3,ROTA TESTART POP ACCPOP BPOP 3POP 2POP 1POP 0RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;显示LEDRAM中的内容;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SHOWLEDRAM:PUSH 0PUSH 1PUSH BPUSH ACCMOV R0,#LEDHEAD MOV R1,#8MOV A,#AASHOW1:MOV P1,AMOV P2,@R0LCALL DELAYINC R0RL ADJNZ R1,SHOW1POP ACCPOP BPOP 1POP 0RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;软件延时;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DELAY:PUSH 1PUSH 2MOV R1,#5FQFQ:MOV R2,#200DJNZ R2,FWFWDJNZ R1,FQFQPOP 2POP 1RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;清楚图形在LEDRAM中的内容;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CLEANGRAPH:PUSH ACCPUSH 1MOV A,#GRAPHRAM1 MOV XUNHUAN,#4 MOV R1,ADADA1:MOV A,@R1;SUBB A,#16LCALL WRITEPOINT0 INC R1DJNZ XUNHUAN,DADA1 POP 1POP ACCRET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;显示图形在LEDRAM中的内容;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SHOWGRAPH:PUSH ACCPUSH 1MOV A,#GRAPHRAM1 MOV XUNHUAN,#4 MOV R1,ADADA2:MOV A,@R1;SUBB A,#16LCALL WRITEPOINT1 INC R1DJNZ XUNHUAN,DADA2 POP 1POP ACC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;消除已经填满的行;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; REMOVEBLOCK:PUSH 0PUSH 1PUSH BPUSH ACC REMOVESTART:MOV R0,#1MOV R1,#LEDHEAD REMOVE2:MOV A,@R1CJNE A,#11111111B,REMOVE1MOV @R1,#00000000BMOV REMOVEROW,R0 LCALL DOWNBLOCKJMP REMOVESTART REMOVE1:INC R0INC R1MOV A,R0CJNE A,#9,REMOVE2POP ACCPOP BPOP 1POP 0RETDOWNBLOCK:PUSH 0PUSH 1PUSH BPUSH ACCMOV R0,#1DOWN11:MOV A,REMOVEROWMOV B,#8MUL ABADD A,R0LCALL DOWNSTEPLCALL JUSTMOVEINC R0MOV A,R0CJNE A,#9,DOWN11 POP ACCPOP BPOP 1POP 0RETDOWNSTEP:PUSH 0PUSH 1PUSH BPUSH ACCMOV R0,#0MOV R1,REMOVEROW STEP2:CLR CSUBB A,#8LCALL TESTBITJB BITS,STEP1INC R0DJNZ R1,STEP2STEP1:MOV STEPS,R0POP ACCPOP BPOP 1POP 0RETJUSTMOVE:PUSH 0PUSH 1PUSH 2PUSH BPUSH ACCMOV R0,AMOV A,STEPSMOV B,#8MUL ABMOV B,AMOV A,R0CLR CSUBB A,BMOV R1,AMOV R2,REMOVEROWMOV A,#8CLR CSUBB A,R2MOV R2,AJUST3:MOV A,R0LCALL TESTBITJB BITS,JUST1MOV A,R1LCALL WRITEPOINT0 JMP JUST2JUST1:MOV A,R1LCALL WRITEPOINT1 JUST2:MOV A,R0ADD A,#8MOV R0,AMOV A,R1ADD A,#8MOV R1,ADJNZ R2,JUST3MOV R2,REMOVEROW DDD:MOV A,R1LCALL WRITEPOINT0 MOV A,R1ADD A,#8MOV R1,ADJNZ R2,DDD JUSTEND:POP ACCPOP BPOP 2POP 1POP 0RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;将某个二进制位写1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WRITEPOINT1:PUSH 0PUSH 1PUSH 2PUSH 3PUSH BPUSH ACCPUSH DPHPUSH DPLCLR CMOV R0,ASUBB A,#65JNC END1MOV A,R0MOV R1,#LEDHEAD MOV B,#8DIV ABMOV R0,AMOV A,BCJNE A,#0,WRITE11 MOV A,R0DEC AJMP WRITE12 WRITE11:MOV A,R0WRITE12:ADD A,R1MOV R1,AMOV A,@R1MOV R2,AMOV DPTR,#TAB1 MOV A,BMOVC A,@A+DPTR ORL A,R2MOV @R1,AEND1:POP DPLPOP DPHPOP ACCPOP BPOP 3POP 1POP 0RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;将某个二进制位写0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WRITEPOINT0:PUSH 0PUSH 1PUSH 2PUSH BPUSH ACCPUSH DPHPUSH DPLMOV R0,ACLR CSUBB A,#65JNC END2MOV A,R0MOV R1,#LEDHEAD MOV B,#8DIV ABMOV R0,AMOV A,BCJNE A,#0,WRITE01 MOV A,R0DEC AJMP WRITE02 WRITE01:MOV A,R0WRITE02:ADD A,R1MOV R1,AMOV A,@R1MOV R2,AMOV DPTR,#TAB2 MOV A,BMOVC A,@A+DPTR ANL A,R2MOV @R1,AEND2:POP DPHPOP ACCPOP BPOP 2POP 1POP 0RETGRAPH: DB 69,60,61,62,69,68,61,62,69,70,60,61,69,70,61,62,69,77,61,62,69,77,61,60,69,69,61,77TAB1: DB 00000001B,10000000B,01000000B,00100000B,00010000B,00001000B,00000100B,00000010B TAB2: DB 11111110B,01111111B,10111111B,11011111B,11101111B,11110111B,11111011B,11111101BEND。

相关文档
最新文档