汇编俄罗斯方块8.8点阵
- 格式:docx
- 大小:37.21 KB
- 文档页数:52
本科课程设计题目:基于单片机的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个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。
俄罗斯方块游戏是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种颜色(红,绿,蓝,黄,黑,白,浅绿和紫红)。
51单片机8x8点阵显示程序参考本程序用的是51单片机控制8*8点阵显示I(心形)U#include#define uint unsigned int#define uchar unsigned char//使用的IO口要根据自己接在单片机里的情况来更改sbit RCK = P3^6; //声明串行输出存储锁存线RCKsbit SCK = P3^5; //声明串行数据输入时钟线SCKsbit SER = P3^4; //声明串行数据输入线SERsbit HC = P0^0; //声明C信号接口sbit HB = P0^1; //声明B信号接口sbit HA = P0^2; //声明A信号接口#define ROW1 HC = 0; HB = 0; HA = 0; //定义使能第1行#define ROW2 HC = 0; HB = 0; HA = 1; //定义使能第2行#define ROW3 HC = 0; HB = 1; HA = 0; //定义使能第3行#define ROW4 HC = 0; HB = 1; HA = 1; //定义使能第4行#define ROW5 HC = 1; HB = 0; HA = 0; //定义使能第5行#define ROW6 HC = 1; HB = 0; HA = 1; //定义使能第6行#define ROW7 HC = 1; HB = 1; HA = 0; //定义使能第7行#define ROW8 HC = 1; HB = 1; HA = 1; //定义使能第8行uchar h;//显示数据,可以用取模软件来获取uchar iloveu[] = {0x00,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x36,0x7F,0x7F,0x3E,0x1C,0x08,0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x1C,0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x7C,0x08,0x10,0x08,0x04,0x44,0x38,0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x00};void delay(uint z) //延时函数,单位ms{uint i, j;for(i = z; i > 0; i--)for(j = 110; j > 0; j--);}void ROW() //行驱动函数switch(h){case 0: ROW1;break;case 1: ROW2;break;case 2: ROW3;break;case 3: ROW4;break;case 4: ROW5;break;case 5: ROW6;break;case 6: ROW7;break;case 7: ROW8;break;}RCK = 1; //595输出存储器锁存移位寄存器中的状态值RCK = 0; //595输出存储器状态保持}void in_data(uchar n) //数据打入74HC595函数{uchar x,y;y = n;for(x = 8; x > 0; x--){if(y&0x01)//特别注意先打入的是高位对应第8列,最后打入低位对应第1列SER = 1;elseSER = 0;y = y>>1;//对应先高位后对位应往右移位数据SCK = 0; //时钟接低,准备下一次读取数据SCK = 1; //595芯片读取数据}}void main(void){uchar m, in[56], n;RCK = 0; //清零锁存线SCK = 0; //清零时钟线for(h = 0; h < 56; h++)in[h] = iloveu[h]; //赋值运算,保护原始数据while(1) {for(m = 18; m> 0; m--){for(h = 0; h < 8; h++){in_data(in[h]);ROW();delay(1);}}//左移for(h = 0; h < 8; h++){if(in[h]&0x80)m = 1; //预先保存第一位数据elsem = 0;for(n = 0; n < 6; n++){if(in[h+8*n+8]&0x80) //没有改变in[h+8]的值in[h+8*n] = (in[h+8*n]<<1) + 1; //循环左移思想elsein[h+8*n] <<= 1; //第一位数据丢失了}if(m)in[h+8*n] = (in[h+8*n]<<1) + 1; //循环左移思想elsein[h+8*n] <<= 1;}}}。
;/////////////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。
51单片机8X8点阵滚动显示- C51源代码51单片机8X8点阵滚动显示- C51源代码/*--------------------------------------------------------------*///LED8*8滚动显示//列扫描,低电平有效/*--------------------------------------------------------------*///包含头文件#include <reg52.h>#include "74HC595.H"/*--------------------------------------------------------------*///全局变量定义unsigned char i;unsigned int m,n;/*--------------------------------------------------------------*///代码库#define num sizeof(table) //代码长度unsigned char codeaa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char code table[]= {//取模方式阴码列扫描逆向0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/0x00,0x7F,0x7F,0x39,0x6F,0x46,0x00,0x00,/*"R",1 */0x00,0x41,0x7F,0x7F,0x41,0x00,0x00,0x00,/*"I",2 */0x00,0x3E,0x7F,0x41,0x63,0x22,0x00,0x00,/*"C",3 */0x00,0x7F,0x7F,0x08,0x7F,0x7F,0x00,0x00,/*"H",4 */0x00,0x7F,0x7F,0x06,0x7F,0x7F,0x00,0x00,/*"M",5 */0x00,0x3E,0x7F,0x41,0x63,0x22,0x00,0x00,/*"C",6 */0x00,0x3F,0x7F,0x40,0x7F,0x3F,0x00,0x00,/*"U",7 */0x00,0x36,0x7F,0x49,0x7F,0x36,0x00,0x00,/*"8",9 */0x00,0x63,0x7F,0x1C,0x7F,0x63,0x00,0x00,/*"X",1 0*/1*/0x00,0x01,0x7F,0x7F,0x01,0x01,0x00,0x00,/*"T",1 3*/0x00,0x7F,0x7F,0x49,0x49,0x41,0x00,0x00,/*"E",1 4*/0x00,0x26,0x6F,0x49,0x7B,0x32,0x00,0x00,/*"S",1 5*/0x00,0x01,0x7F,0x7F,0x01,0x01,0x00,0x00,/*"T",1 6*/0x00,0x7F,0x7F,0x39,0x6F,0x46,0x00,0x00,/*"R",1 8*/0x00,0x61,0x79,0x5D,0x4F,0x43,0x00,0x00,/*"Z",1 9*/0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00,/*"-",2 0*/0x00,0x62,0x73,0x59,0x4F,0x46,0x00,0x00,/*"2",2 1*/0x00,0x3E,0x7F,0x41,0x7F,0x3E,0x00,0x00,/*"0",2 2*/0x00,0x3E,0x7F,0x41,0x7F,0x3E,0x00,0x00,/*"0",2 3*/4*/0x00,0x7F,0x7F,0x41,0x7F,0x3E,0x00,0x00,/*"D",2 6*/0x00,0x7F,0x7F,0x49,0x49,0x41,0x00,0x00,/*"E",2 7*/0x00,0x7F,0x7F,0x06,0x7F,0x7F,0x00,0x00,/*"M",2 8*/0x00,0x7F,0x7F,0x41,0x7F,0x7F,0x00,0x00,/*"O",2 9*/0x00,0x26,0x6F,0x49,0x7B,0x32,0x00,0x00,/*"S",3 1*/0x03,0x07,0x7C,0x7C,0x07,0x03,0x00,0x00,/*"Y",3 2*/0x00,0x26,0x6F,0x49,0x7B,0x32,0x00,0x00,/*"S",3 3*/0x00,0x01,0x7F,0x7F,0x01,0x01,0x00,0x00,/*"T",3 4*/0x00,0x7F,0x7F,0x49,0x49,0x41,0x00,0x00,/*"E",3 5*/0x00,0x7F,0x7F,0x06,0x7F,0x7F,0x00,0x00,/*"M",3 6*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",37*/};/*--------------------------------------------------------------*///显示函数void Display(void){Ser_IN((aa[i])); //列扫描数据Ser_IN(table[i + n]); //查表取出行扫描数据Par_OUT(); //输出显示i++; if(i == 8) i = 0; //循环扫描m++; if(m == 500) {m = 0; n++;} //滚动速度控制if(n == num-7) n = 0; //循环显示}/*--------------------------------------------------------------*///定时器初始化void T0_init(void){TMOD = 0xf8;TH0 = 0xcc; //5000usTL0 = 0x00;IE = 0x82;TR0 = 1;}/*--------------------------------------------------------------*///定时器中断服务void T0_intservice(void) interrupt 1 using 0 {TH0 = 0xf8;TL0 = 0xcc;Display();}/*--------------------------------------------------------------*///主函数void main (void){T0_init();while(1);}74HC595.H//Note: 74HC595驱动// __ __//Note: MR 主复位接电源正极, OE 使能端,输出有效接电源负极/*--------------------------------------------* /#ifndef __74HC595_H__#define __74HC595_H__/*--------------------------------------------* /sbit SD = P1^4; //串行数据输入sbit ST_CK = P1^5; //存储寄存器时钟输入sbit SH_CK = P1^6; //移位寄存器时钟输入/*--------------------------------------------*///数码管断码和位码的定义//unsigned char codeseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00,0x ff};//0 1 2 3 4 5 6 7 8 9 a b c d e f 8 无//unsigned char codepos[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//1 2 3 4 5 6 7 8/*--------------------------------------------* ///函数声明void Ser_IN(unsigned char Data); //串行数据输入void Par_OUT(void); //串行数据输出//void Ser_Par(unsigned char Data); //串行输入,并行输出/*--------------------------------------------* ///串行数据输入void Ser_IN(unsigned char Data)unsigned char i;for(i = 0; i < 8; i++){SH_CK = 0; //CLOCK_MAX=100MHzSD = Data & 0x80;Data <<= 1;SH_CK = 1;}}/*--------------------------------------------* ///并行数据输出void Par_OUT(void){ST_CK = 0;ST_CK = 1;}/*--------------------------------------------* ///串行输入,并行输出/*void Ser_Par(unsigned char Data){Ser_IN(Data);Par_OUT();}*//*--------------------------------------------* /#endif网站统计Powered by Tiki Wiki CMS Groupware | Theme: Fivealive - Lemon。
简易俄罗斯方块游戏机实验名称简易俄罗斯方块游戏机姓名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为扫描)若无键按下,则根据情况当前点是否需要自动下移。
8*8点阵显示程序(汇编)//8*8 点阵LED 显示,用单片机AT89C51 驱动8*8 点阵LED 显示屏//轮流显示0-9 的数字,显示的方式采用自右向左拉幕式显示//源程序和proteus 仿真我一打包,地址:proteus.5d6d/thread-9031-1-1.htmlR_CNTEQU31HNUMBEQU32HTCOUNTEQU33H ORG0000H LJMPSTART ORG0BH ;定时器中断入口地址LJMPINT_T0 ORG0030HSTART:MOVR0,#00H ;显示的幕次(即每一幕显示的:行码起始序号)值0MOVR_CNT,#00H;列码序列号置0MOVTCOUNT,#00H ;行码序列号置0 MOVTMOD,#01H MOVTH0,#(65536-5000)/256 MOVTL0,#(65536-5000)MOD 256SETB TR0 MOVIE,#82HSJMP$//定时器中断处理函数INT_T0:MOVTH0,#(65536-5000)/256MOVTL0,#(65536-5000)MOD 256 MOVDPTR,#TAB ;取列码表首地址MOVA,R_CNTMOVCA,@A+DPTR MOVP3,AMOVDPTR,#NUB ;取行码表首地址MOVA,NUMB MOVCA,@A+DPTR MOVP0,A ;输出行号INCNUMBNEXT1: INCR_CNT MOVA,R_CNT CJNEA,#8,NEXT2 MOVR_CNT,#0 MOVNUMB,R0NEXT2: INCTCOUNT MOVA,TCOUNT CJNEA,#40,NEXT4 ;每个数字显示200msMOVTCOUNT,#00H INC R0 ;上一幕显示行码的起始序列号+1 CJNER0,#88,NEXT3MOVR0,#00HNEXT3:MOVNUMB,R0 ;送新一幕显示行码的起始序列号NEXT4:RETITAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH;列值NUB: DB 00H,00H,00H,00H,00H,00H,00H,00H;空DB00H,00H,3EH,41H,41H,41H,3EH,00H;0 DB00H,00H,00H,00H,21H,7FH,01H,00H;1 DB。
纯为个人思路,无特殊,惊人语句…•初学完的;程序功能:最原始简单版俄罗斯方块;硬件连接:接双色点阵;晶振型号: 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) / 256MOV 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,ZhantMOV R0,#08HCLR HZSETB HZCALL DelayCALL Delay Qing:SETB HANGCLR HWSETB HWDJNZ R0,QingMOV R0,#08H Qing1:SETB HANGCLR HWSETB HWDJNZ R0,Qing1MOV R0,#08HCLR HZDJNZ R4,ZhantiMOV R4,#08HCLR CYMOV A,38HSUBB A,#08HMOV 38H,A// MOV 38H,#00HMOV A,44HMOV 34H,#00HCJNE A,#10,ZhantingINC 38HMOV 44H,#00HMOV A,38HCJNE A,#31,ZhantingMOV 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 HANGCLR 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 QingpingCJNE R1,#59H,Xianshi0MOV 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 Xuanz1A,#2,S3 Xuanz2A,#3,S4 Xuanz3A,#4,S5 Xuanz4A,#5,S6 Xuanz5Xuanz6A,41HRETXu1:CJNE A,#2,Zhuan1MOV DPTR,#TAB1RETZhuan1:MOV DPTR,#TAB1_1RETXuanz2:MOV A,41HCJNE A,#0,Zhuan2_1MOV DPTR,#TAB2RETZhuan2_1:CJNE A,#1,Zhuan2_2MOV DPTR,#TAB2_1RETZhuan2_2:CJNE A,#2,Zhuan2_3MOV DPTR,#TAB2_2MOV DPTR,#TAB2_3RETXuanz3:MOV A,41HCJNE A,#0,Zhuan3_1MOV DPTR,#TAB3RETZhuan3_1:CJNE A,#1,Zhuan3_2MOV DPTR,#TAB3_1RETZhuan3_2:CJNE A,#2,Zhuan3_3MOV DPTR,#TAB3_2RETZhuan3_3:MOV DPTR,#TAB3_3RETXuanz4:MOV A,41HCJNE A,#0,Zhuan4_1MOV DPTR,#TAB4RETZhuan4_1:CJNE A,#1,Zhuan4_2MOV DPTR,#TAB4_1RETZhuan4_2:CJNE A,#2,Zhuan4_3MOV DPTR,#TAB4_2RETZhuan4_3:MOV DPTR,#TAB4_3RETXuanz5:MOV A,41HCJNE A,#0,Zhuan5_1MOV DPTR,#TAB5RETZhuan5_1:CJNE A,#2,Zhuan5_2MOV DPTR,#TAB5MOV DPTR,#TAB5_1RETXuanz6:MOV A,41HCJNE A,#0,Zhuan6_1MOV DPTR,#TAB6RETZhuan6_CJNE A,#2,Zhuan6_2MOV DPTR,#TAB6RETZhuan6_2:MOV DPTR,#TAB6_1RET・确认左右移动Hengyi:CJNE R3,#03H,H1RETH1: MOV A,32HRL ACJNE R3,#02H,H2AJMP OUT1H2: RLCJNEAJMP H3: RLCJNEAJMP H4: MOVRRCJNEAJMP H5: RRCJNEAJMP H6: RRCJNEAJMP 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・***************************** JCMkey_x:JB KEY_x,Loopx0JB Dou_x,Loopx2SETB Dou_xRETLoopx2:INC 42HJB Ying_x,OutxSETB Ying_xSETB Biao_xLoopx0:CLR Dou_xCLR Ying_xOutx:RET・***************************** JPanduan_z:JBC Biao_z,ZuoyiRETZuoyi:SETB Biao_ZYCALL HangyiMOV A,36HJB ACC.7,YesZuoCALL HangerMOV A,36HJB ACC.7,YesZuoCALL HangsanMOV A,36HJBACC.7,YesZuo ;已到边上,不用移动MOV 45H,R3 DEC R3CJNE A,#0,Zuo_0 ;防移动冲突背景AJMP YesZuoZuo_CJNE A,#1,Zuo_1AJMP YesZuoZuo_CJNE A,#2,Zuo_2CALL Xuan_1AJMP YesZuoZuo_2:CJNE A,#3,Zuo_3CALL Xuan_2AJMP YesZuoZuo_CJNE A,#4,Zuo_4CALL Xuan_3AJMP YesZuoZuo_4:CJNE A,#5,Zuo_5CALL Xuan_4AJMP YesZuoZuo_5:CALL Xuan_5YesZuo:RET・***************************** JPanduan_y:JBC Biao_y,YouyiRETYouyi:SETB Biao_ZYCALL HangyiMOV A,36HJB ACC.0,YesyouCALL HangerMOV A,36HJB ACC.0,YesyouCALL HangsiMOV A,36HJBACC.0,Yesyou ;已到边上MOV 45H,R3 INCR3MOV A,35HAJMP Yesyou You_0:CJNE A,#1,You_1 AJMP Yesyou You_1:CJNE A,#2,You_2 CALL Xuan_1 AJMP Yesyou You_2:CJNE A,#3,You_3 CALL Xuan_2 AJMP Yesyou You_3:CJNE A,#4,You_4 CALL Xuan_3 AJMP Yesyou You_4:CJNE A,#5,You_5 CALL Xuan_4 AJMP Yesyou You_5:CJNE A,#0,You_0;防右移冲突背景CALL Xuan_5 Yesyou:RETPanduan_x:JBC Biao_x,Xuanzhuan RETXuanzhuan:MOV A,40HCJNE A,#0,Bie RETBie:MOV A,35HCJNE A,#0,Panyi RETPanyi:MOV 43H,41H INC 41HMOV A,40H CJNE A,#1,NoyiMOV A,35H ・***************************** 旋转防冲突 ;方形不用旋转MOV 41H,43HRETXuanyi:MOV A,41H ;一字型防出边界CJNE A,#1,Yi_1AJMP Yi_hYi_1:CJNE A,#3,Yi_sAJMP Yi_hYi_s: ;一字型防冲突背景CALL HangyiMOV A,36HANL A,#83HCJNE A,#0,NoxuanYi_h:MOV A,35HCJNE A,#2,Yi_h2CALL Xuan_1CALL YesxuanRETYi_h2:MOV A,35HCJNE A,#3,Yi_h3 CALL Xuan_2 CALL Yesxuan RET_h3:MOV A,35H CJNE A,#4,Yi_h4 CALL Xuan_3 CALL Yesxuan RET_h4:MOV A,35H CJNE A,#5,Yi_h5 CALL Xuan_4 CALL Hangsi MOV A,36H ANL A,54HCJNEA,#0,Noxua nCALL Yesxuan RETYi_h5:CALL Xuan_5CALL HangsiMOV A,36HANL A,55HCJNE A,#0,NoxuanCALL YesxuanRETNoyi: ;另外五种变形防出边界冲突背景CALL YouchuMOV A,35HCJNE A,#1,Xuanzh1CALL YesxuanRETXuanzh1: ;防冲突背景CJNE A,#2,Xuanzh2CALL Xuan_1CALL YesxuanRETXuanzh2:CJNE A,#3,Xuanzh3CALL Xuan_2CALL YesxuanXuanzh3:CJNE A,#4,Xuanzh4CALL Xuan_3CALL YesxuanRETXuanzh4:CJNE A,#5,Xuanzh5CALL Xuan_4CALL YesxuanRETXuanzh5:CALL Xuan_5 Yesxuan:MOV A,41HCJNE A,#4,OutqMOV 41H,#00H Outq:RETNoxuan:MOV 41H,43H;防右出边界子程序Youchu:CALL HangyiMOV A,36HJB ACC.0,NoxuanCALL HangerMOV A,36HJB ACC.0,NoxuanCALL HangsanMOV A,36HJB ACC.0,NoxuanRETXuan_1: ;防冲突子程序CALL HangyiMOV A,36HANL A,54HCJNE A,#0,No_zyxRETXuan_2:CALL HangyiMOV A,36HANL A,55HCJNE A,#0,No_zyx CALL Hanger MOV A,36H ANL A,54HCJNEA,#0,No_zy xRETXuan_3:CALL HangyiMOV A,36HANL A,56HCJNEA,#0,No_zy xCALL Hanger MOV A,36H ANL A,55HCJNEA,#0,No_zy xCALL Hanger MOV A,36H ANL A,54HCJNEA,#0,No_zy xRET Xuan_4:MOV A,36H ANL A,57HCJNEA,#0,No_zy xCALL Hanger MOV A,36H ANL A,56HCJNEA,#0,No_zy xCALL Hanger MOV A,36H ANL A,55HCJNEA,#0,No_zy xRETXuan_5:CALL HangyiMOV A,36HANL A,58HCJNEA,#0,No_zy xCALL Hanger MOV A,36H ANL A,57HCJNEA,#0,No_zy xANL A,56HCJNE A,#0,No_zyxRETNo_zyx:JBC Biao_ZY,No_zNo_x:AJMP Noxuan ;旋转冲突背景No_z:MOV R3,45HRETPanduan_xia:MOV A,34HCJNE A,#100,Out_xMOV 34H,#00HMOV A,30HRL AMOV 30H,AINC 35HOut_x:;左、右冲突背景・***************************** 一秒下移子程序Panduan_xh:MOVCJNERETX1: CJNECALLRETX2: CJNECALLRETX3: CJNECALLRETX4: CJNECALLRETX5: CJNECALLRETA,35H A,#00H,X1A,#01H,X2 XH1A,#02H,X3 XH2A,#03H,X4 XH3A,#04H,X5 XH4A,#05,X6 XH5・************XH1:CALL HangyiMOV A,36HANL A,54HCJNE A,#0,WanRETXH2:CALL HangyiMOV A,36HANL A,55HCJNE A,#0,WanCALL HangerMOV A,36HANL A,54HCJNE A,#0,WanRETWan: ;游戏结束$AJMPXH3: ;防下移冲突背景子程序CALL HangyiMOV A,36HANL A,56HCJNEA,#0,Noxia 3CALL Hanger MOV A,36H ANL A,55HCJNEA,#0,Noxia 3CALL HangsanMOV A,36HANL A,54HCJNE A,#0,WanRETNoxia3:CALL HangsanMOV A,36HCJNE A,#0,WanCALL HangyiMOV A,36HORL A,55HMOV 55H,ACALL HangerMOV A,36HORL A,54HMOV 54H,ACALL SMHang ; 扫描行RETXH4:CALL HangyiMOV A,36HANL A,57HCJNE A,#0,Noxia4CALL HangerMOV A,36HANL A,56HCJNE A,#0,Noxia4CALL HangsanMOV A,36HANL A,55HCJNE A,#0,Noxia4RETNoxia4:CALL HangsiMOV A,36HCJNE A,#0,WanCALL HangyiORL A,56H MOV 56H,A CALL Hanger MOV A,36H ORL A,55H MOV 55H,A CALL Hangsan MOV A,36H ORL A,54H MOV 54H,ACALLSMHang ;扫描行RETXH5:CALL HangyiMOV A,36HANL A,58HCJNE A,#0,Noxia5CALL HangerMOV A,36HANL A,57HCJNE A,#0,Noxia5CALL HangsanMOV A,36HANL A,56HCJNE A,#0,NoxiaRETNoxia5:CALL HangyiMOV A,36HORL A,57HMOV 57H,ACALL HangerMOV A,36HORL A,56HMOV 56H,ACALL HangsanMOV A,36HORL A,55HMOV 55H,ACALL HangsiMOV A,36HORL A,54HRETXH6:CALL HangyiMOV A,36HORL A,58HMOV 58H,ACALL HangerMOV A,36HORL A,57HMOV 57H,ACALL HangsanMOV A,36HORL A,56HMOV 56H,ACALL HangsiMOV A,36HORL A,55HMOV 55H,ACALLSMHang ;扫描行;积木停止,出新积木SMHang:SETB BiaoXMOV 30H,#0FEHMOV 31H,#00HMOV 34H,#00HMOV 35H,#00HRET・************JHangyi:CALL XingzMOV A,#01HMOVC A,@A+DPTRMOV 32H,ACALL HengyiMOV 36H,32HRETHanger:CALL XingzMOV A,#00HMOVC A,@A+DPTRMOV 32H,ACALL HengyiMOV 36H,32HRETHangsan:CALL XingzMOV A,#07HMOVC A,@A+DPTRMOV 32H,ACALL HengyiMOV 36H,32HRETHangsi:CALL XingzMOV A,#06HMOVC A,@A+DPTRMOV 32H,ACALL HengyiMOV 36H,32HRET・***************************** JSaomiao_xh:JBC BiaoX,SaomiaoSaomiao:CJNE A,#0FFH,Sao2MOV55H,54H MOV54H,#00HINC R5Sao2:MOV A,56H CJNE A,#0FFH,Sao3MOV 56H,55H MOV 41H,#00H MOV R3,#03H MOV A,42H MOV B,#07H DIV AB MOV 40H,BMOV A,54HCJNE A,#0FFH,Sao1MOV 54H,#00HINC R5Sao1:MOV A,55H;消行MOV 54H,#00HR5INCSao3:MOV A,57HCJNE A,#0FFH,Sao4MOV 57H,56HMOV 56H,55HMOV 55H,54HMOV 54H,#00HINC R5Sao4:MOV A,58HCJNE A,#0FFH,Sao5MOV 58H,57HMOV 57H,56HMOV 56H,55HMOV 55H,54HMOV 54H,#00HINC R5Sao5:Jifen:CJNE R5,#0,Jia1RETJia1:MOV A,R5MOV R5,#00HCJNE A,#1,Jia2INC 46HRETJia2:CJNE A,#2,Jia3MOV A,#3ADD A,46HMOV 46H,ARETJia3:CJNE A,#3,Jia4MOV A,#7ADD A,46HMOV 46H,A Jia4:A,#10MOVADD A,46HMOV 46H,ARET・***************************** JJifenXianshi:MOV XIAN,#0BFHSETB WEICLR WEIMOV A,46HMOV B,#10DIV ABMOV DPTR,#TABMOVC A,@A+DPTRMOV XIAN,ASETB DUANCLR DUANCALL DelayMOV XIAN,#7FHSETB WEICLR WEIMOVC A,@A+DPTRMOVXIAN,A SETBDUAN CLRDUAN CALLDelay MOVXIAN,#0FFHSETBWEI CLRWEI RET・***************************** JInt0_ser:CPL Biao_ztRETI・***************************** JT0_ser: MOVTH0,#(65536-10000) / 256 MOVTL0,#(65536-10000) MOD 256 INC 34H INC42H INC 44H暂停标志位 定时计数,并出随机数RETIQingping:CLR LIECLR LWSETB LWDJNZ R0,QingpingMOV R0,#08HCLR LZSETB LZRET・*****************************JDelay:MOV R6,#10D1: MOV R7,#10DJNZ R7,$DJNZ R6,D1RETTAB0:DB 18H, 18H, 00H, 00H, 00H, 00H, 00H, 00HTAB1:・*****************************随机积木 7 类型 ;田字型。