




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
沈阳航空航天大学北方科技学院毕业设计(论文)通过半个学期地全心投入和辛苦努力,终于完成了基于单片机的俄罗斯方块游戏的设计,设计的过程就是综合运用所学知识和学习新知识的过程。由于经验不足,难免出现一些小的失误,但无论怎样,本次毕业设计对于我来说都是一次难得的锻炼机会,使我积累了许多宝贵的经验。
本文对单片机制作的俄罗斯方块游戏的运行原理进行了分析,全面、详细地阐述了俄罗斯方块游戏的设计过程。本游戏机已经达到了掌上娱乐的要求,但在设计上还留有进一步改善的余地,如可以美化游戏界面、加入背景和动作音乐、力回馈系统等。
毕业设计的整个开发过程是曲折的,首先在硬件设计上,由于开始对LCD液晶屏不熟悉,加之其程序量较多,所以,在设计的过程中,不免有些困难,通过我多方面的查找资料,并不断的向老师和同学请教,结合网络资源,最终找出比较完善的方案,在理论上能够实现功能要求。经过几个月的前期学习,我积累了很多的关于液晶显示方面和C语言设计方面的资料,并对电路的整合有了一个基本的概念,最后设计出总的电路图,经过不断的测试与修改,最终完善了硬件电路的设计。
对于软件设计,因为以前的编程经验不够,再加上对STC89C52这一芯片的了解不是很彻底,因此,在这方面花费了很多的精力和时间。当然这个过程不乏有同学的帮助,我要非常感谢同学的帮助在我的软件调试过程中给了我至关重要的帮助,并给了我很多非常好的建议。
四年的大学生活就快走入尾声,我的校园生活就要划上句号,心中是无尽的难舍与眷恋。从这里走出,对我的人生来说,将是踏上一个新的征程,要把所学的知识应用到实际工作中去。回首四年,取得了些许成绩,生活中有快乐也有艰辛。感谢老师四年来对我孜孜不倦的教诲,对我成长的关心和爱护。在我的十几年求学历程里,离不开父母的鼓励和支持,是他们辛勤的劳作,无私的付出,为我创造良好的学习条件,我才能顺利完成学业,感激他们一直以来对我的抚养与培育。最后,我要特别感谢我的导师,许谨老师。是他在我毕业的最后关头给了我巨大的帮助与鼓励,使我能够顺利完成毕业设计,在此表示衷心的感激。老师认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我收益匪浅。他无论在理论上还是在实践中,都给与我很大的帮助,使我得到不少的提高这对于我以后的工作和学习都有一种巨大的帮助,感谢他耐心的辅导。
历时将近两个月的时间终于将这篇论文写完,在论文的写作过程中遇到了无数的困难和障碍,都在同学和老师的帮助下度过了。尤其要强烈感谢我的论文指导老师—许谨老师,他对我进行了无私的指导和帮助,不厌其烦的帮助进行论文的修改和改进。另外,在校图书馆查找资料的时候,图书馆的老师也给我提供了很多方面的支持与帮助。在此向帮助和指导过我的各位老师表示最中心的感谢!
感谢这篇论文所涉及到的各位学者。本文引用了数位学者的研究文献,如果没有各位学者的研究成果的帮助和启发,我将很难完成本篇论文的写作。
感谢我的同学和朋友,在我写论文的过程中给予我了很多素材,还在论文的撰写和排版过程中提供热情的帮助。
参考文献[1]马忠梅,籍顺心,张凯,马岩.单片机的C语言应用程序设计.北京航空航天大学出版社,2003 [2]谭浩强.C程序设计.北京:清华大学出版社,1999[3]周新华.单片机智能化产品C语言设计实例详解.北京航空航天大学出版社,2006[4]林伸茂.8051单片机彻底研究实习篇.中国电力出版社,2007[5]清源科技.Protel99SE电路原理图与PCB设计与仿真.机械工业出社,2005[6]王志慧.单片机控制的设计与实现:[硕士学位论文].内蒙古:内蒙古大学学报,2002[7]张桂红.单片机原理与应用.福建科学技术出版社,2007.[8]刘文涛.单片机语言C51典型应用设计.人民邮电出版社,2005[9]何立民.单片机应用文集.北京:航空航天大学出版社,2000[10]高凌琴,陈青华.俄罗斯方块游戏关键技术探讨[J].信息技术与信化,2008.[11]徐金增.单片机编程仿真实验系统的设计与实现[D].山东师范大学,2009[12]胡汉才.单片机原理及其接口技术[M].清华大学出版社,2000[13]王彦朝.二维数组在俄罗斯方块游戏编程中的应用[J].信息与电脑(理论版),2010[14]王晓威,唐叔进,邢瑞.基于单片机和液晶显示器的游戏开发[J].电子世界,2005[15]杨元强.酷比杯获奖作品选登《LEGO
俄罗斯》[J].“酷比杯”游戏策划大赛,2007
元器件名称型号个数电容C1'10uF1电容C2,C3'20pF2电源接口P1'Header21电阻R110K1'可变电阻RV110k2按键S1,S2,S3,S4,S5,S6,S7'SW-PB7电源开关SW1'sw-灰色1液晶U1'LCD128641单片机U2STC89C52RC1晶振Y1'12M1#include<REGX52.H>#include"pic.c"#include<intrins.h>#defineLCD_DATAP2#definebutton_delay150//按键延时#definebutton_acceleration65//按键加速度阈值#defineGAME_LOCATION30sbitbutton_a=P3^3;sbitbutton_b=P3^0;sbitup=P3^1;sbitdown=P3^4;sbitleft=P3^2;sbitright=P3^5;sbitspeaker=P3^6;sbitLCD_CS2=P1^1; //右屏选择(左右屏有时候相反)sbitLCD_CS1=P1^0; //左屏选择sbitLCD_E=P1^2;sbitLCD_RW=P1^3;sbitLCD_RS=P1^4;sbitLCD_RST=P3^7;unsignedintup_reg=button_delay;//按键up累加器unsignedintdown_reg=button_delay;//按键down累加器unsignedintleft_reg=button_delay;//按键left累加器unsignedintright_reg=button_delay;//按键right累加器unsignedintbutton_a_reg=button_delay;//按键button_a累加器unsignedintbutton_b_reg=button_delay;//按键button_b累加器unsignedintright_acceleration=0; //按键right加速度寄存器unsignedintleft_acceleration=0; //按键left加速度寄存器unsignedintidataBox_Ram[19];//定义游戏点阵缓存10*16unsignedcharbox_down_reg;//定义方块下落累加寄存器unsignedchartime0_reg;//定义定时器0累加寄存器unsignedcharnext_mode;//定义下一个方块的类型unsignedcharnext_shape;//定义下一个方块的形状unsignedintdestroy_row_num=0;//定义所消的行数unsignedcharspeed_num=0;//定义游戏速度等级unsignedcharlevel_num;//定义游戏难度等级bitgame_over_flag;//游戏结束标志位置0表示游戏未结束bitpause_game_flag;//游戏暂停标志位置0表示游戏未暂停struct{ unsignedcharmode;//类型 unsignedcharshape;//形状 unsignedcharx;//x坐标 unsignedchary;//y坐标 unsignedintbox;//定义方块缓存}s_box; //定义方块结构体//LCD检测忙状态函数voidLCD_check_busy(){ unsignedchartemp; LCD_RS=0; LCD_RW=1; do { LCD_DATA=0xff; LCD_E=1; temp=LCD_DATA; LCD_E=0; }while((temp&0x80)==0x80); }//写指令代码(cs为0选左屏,cs为1选右屏)voidLCD_W_code(unsignedchartpcode,bitcs){ LCD_RS=0; LCD_RW=0; LCD_CS2=~cs; LCD_CS1=cs; LCD_DATA=tpcode; LCD_E=0; _nop_(); LCD_E=1;}//写显示数据(cs为0选左屏,cs为1选右屏)voidLCD_W_data(unsignedchartpdata,bitcs){ LCD_check_busy(); LCD_RS=1; LCD_RW=1; LCD_CS2=~cs; LCD_CS1=cs; LCD_DATA=tpdata; LCD_E=1; _nop_(); LCD_E=0;}//LCD初始化函数voidLCD_initialize(){ LCD_RST=0; _nop_(); _nop_(); LCD_RST=1; LCD_W_code(0x3f,0); //开显示设置 LCD_W_code(0xc0,0); //设置显示起始行为第一行 LCD_W_code(0xb8,0); //页面地址设置 LCD_W_code(0x40,0); //列地址设为0 LCD_W_code(0x3f,1); LCD_W_code(0xc0,1); LCD_W_code(0xb8,1); LCD_W_code(0x40,1);}//LCD清屏函数voidLCD_clear(){ unsignedchari,j; for(j=0;j<8;j++) { LCD_W_code(0xb8+j,0); LCD_W_code(0x40,0); LCD_W_code(0xb8+j,1); LCD_W_code(0x40,1); for(i=0;i<64;i++) { LCD_W_data(0x00,0); LCD_W_data(0x00,1); } }}//LCD显示字符串函数(word表示要显示的字符串,//length表示要显示的字符串宽度,//x表示首字符所在行数,//y表示首字符所在列数)voidLCD_display_word(unsignedcharword[],unsignedintlength, unsignedcharx, unsignedchary){ unsignedchari; for(i=0;i<length;i++) { LCD_W_code(0xb8+x,0); LCD_W_code(0xb8+x,1); if(y+i<64) { LCD_W_code(0x40+y+i,0); LCD_W_data(word[i],0); } else { LCD_W_code(y+i,1); LCD_W_data(word[i],1); } }}//LCD画全屏函数voidLCD_full_draw(unsignedcharword[]){ unsignedchari,j; for(i=0;i<8;i++) { LCD_W_code(0xb8+i,0); LCD_W_code(0x40,0); for(j=0;j<64;j++) { LCD_W_data(word[i*128+j],0); } LCD_W_code(0xb8+i,1); LCD_W_code(0x40,1); for(j=0;j<64;j++) { LCD_W_data(word[i*128+64+j],1); } }}//LCD显示一个字节函数(//x表示x坐标,//y表示y坐标,//tpdata表示要显示的数据)voidLCD_display_byte(unsignedcharx, unsignedchary, unsignedchartpdata){ if(x<64) { LCD_W_code(0xb8+y,0); LCD_W_code(0x40+x,0); LCD_W_data(tpdata,0); } else { LCD_W_code(0xb8+y,1); LCD_W_code(x,1); LCD_W_data(tpdata,1); }}voidLCD_draw(unsignedcharword[]){unsignedchari,j;for(i=0;i<8;i++){LCD_W_code(0xb8+i,1); LCD_W_code(0x40+20,1); for(j=0;j<44;j++) { LCD_W_data(word[i*44+j],1); }}}//基本界面显示函数voiddisplay_basic(){ unsignedchari; for(i=0;i<8;i++) { LCD_display_byte(GAME_LOCATION,i,0xff); LCD_display_byte(GAME_LOCATION+41,i,0xff); }}//刷新游戏区域函数voidrefurbish_display(){ unsignedchari,j,tpdata; for(i=0;i<8;i++) { for(j=0;j<10;j++) { tpdata=0x00; if((Box_Ram[2*i]>>(12-j))&0x0001==1) { tpdata=0x0f; } if((Box_Ram[2*i+1]>>(12-j))&0x0001==1) { tpdata|=0xf0; } LCD_display_byte(GAME_LOCATION+1+j*4,i,tpdata); LCD_display_byte(GAME_LOCATION+2+j*4,i,0xbb&tpdata); LCD_display_byte(GAME_LOCATION+3+j*4,i,0xdd&tpdata); LCD_display_byte(GAME_LOCATION+4+j*4,i,tpdata); } }}//基本按键程序(返回0表示没按键被按下,返回1表示down被按下,返回2表示up被按下,返回3表示button_a被按下,返回4表示left被按下,返回5表示right被按下)//游戏中按键识别程序(有优先级,从高到低依次是button_a_reg>down>left>right>up)unsignedcharbasic_button(){ unsignedchartpflag=0; if(button_b==0) { if(button_b_reg<button_delay*8) { button_b_reg++; } else { button_b_reg=0; tpflag=6; } } else { button_b_reg=button_delay*8; } if(down==0) { if(down_reg<button_delay)//按键一直被按下时设置时间间隔触发 { down_reg++; } else { down_reg=0; tpflag=1;//返回1表示down被按下 } } else { down_reg=button_delay;//释放按键时置按键缓存为button_delay,以便在下次按键时及时响应 } if(up==0) { if(up_reg<button_delay)//按键一直被按下时设置时间间隔触发 { up_reg++; } else { up_reg=0; tpflag=2;//返回2表示up被按下 } } else { up_reg=button_delay;//释放按键时置按键缓存为button_delay,以便在下次按键时及时响应 } if(button_a==0) { if(button_a_reg<button_delay*8)//按键一直被按下时设置时间间隔触发 { button_a_reg++; } else { button_a_reg=0; tpflag=3;//返回3表示button_a被按下 } } else { button_a_reg=button_delay*8;//释放按键时置按键缓存为button_delay,以便在下次按键时及时响应 } if(left==0) { if(left_reg<(button_delay))//按键一直被按下时设置时间间隔触发 { left_reg++; } else { left_reg=left_acceleration*button_acceleration; if(left_acceleration<2)left_acceleration++; tpflag=4;//返回4表示left被按下 } } else { left_acceleration=0; left_reg=button_delay;//释放按键时置按键缓存为button_delay,以便在下次按键时及时响应 } if(right==0) { if(right_reg<(button_delay))//按键一直被按下时设置时间间隔触发 { right_reg++; } else { right_reg=right_acceleration*button_acceleration; if(right_acceleration<2)right_acceleration++; tpflag=5;//返回5表示right被按下 } } else { right_acceleration=0; right_reg=button_delay;//释放按键时置按键缓存为button_delay,以便在下次按键时及时响应 } return(tpflag);}//检查覆盖函数(检查此时带入的参数所确定的方块是否会覆盖原有图形,不会覆盖返回1,覆盖返回0)bitcheck_cover(unsignedchartpx,unsignedchartpy,unsignedinttpbox){ unsignedchari; bittpflag=1; unsignedinttemp; temp=s_box.box; for(i=0;i<4;i++) { Box_Ram[3-i+s_box.y]&=(~((temp&0x000f)<<(9-s_box.x))); temp=temp>>4; }//先将现有的方块从游戏点阵缓存中删除 temp=tpbox; for(i=0;i<4;i++) { if((((temp&0x000f)<<(9-tpx))&Box_Ram[3-i+tpy])!=0x0000) { tpflag=0; } temp=temp>>4; }//检查方块是否和原有图形重叠,重叠置标志位tpflag为0,不重叠不置标志位,即tpflag为1 temp=s_box.box; for(i=0;i<4;i++) { Box_Ram[3-i+s_box.y]|=((temp&0x000f)<<(9-s_box.x)); temp=temp>>4; }//在游戏点阵缓存中恢复原有方块 return(tpflag);}//方块缓存数据函数(输入方块类型和形状即可获得方块缓存数据)unsignedintbox_read_data(unsignedchartpmode,unsignedchartpshape){ unsignedinttpbox; switch(tpmode) { case0:switch(tpshape) { case0:tpbox=0xf000;break; case1:tpbox=0x4444;break; case2:tpbox=0xf000;break; case3:tpbox=0x4444;break; default:; }break; case1:switch(tpshape) { case0:tpbox=0xe800;break; case1:tpbox=0xc440;break; case2:tpbox=0x2e00;break; case3:tpbox=0x88c0;break; default:; }break; case2:switch(tpshape) { case0:tpbox=0xe200;break; case1:tpbox=0x44c0;break; case2:tpbox=0x8e00;break; case3:tpbox=0xc880;break; default:; }break; case3:switch(tpshape) { case0:tpbox=0xcc00;break; case1:tpbox=0xcc00;break; case2:tpbox=0xcc00;break; case3:tpbox=0xcc00;break; default:; }break; case4:switch(tpshape) { case0:tpbox=0xc600;break; case1:tpbox=0x4c80;break; case2:tpbox=0xc600;break; case3:tpbox=0x4c80;break; default:; }break; case5:switch(tpshape) { case0:tpbox=0x6c00;break; case1:tpbox=0x8c40;break; case2:tpbox=0x6c00;break; case3:tpbox=0x8c40;break; default:; }break; case6:switch(tpshape) { case0:tpbox=0x4e00;break; case1:tpbox=0x8c80;break; case2:tpbox=0xe400;break; case3:tpbox=0x4c40;break; default:; }break; default:; } return(tpbox);}//方块载入函数voidbox_load(){ s_box.box=box_read_data(s_box.mode,s_box.shape);}//方块映射游戏点阵缓存函数(参数是原来方块的位置、缓存,先消去原有位置的方块)voidbox_to_Box_Ram(unsignedchartpx,unsignedchartpy,unsignedinttpbox){ unsignedchari; unsignedinttemp; temp=tpbox; for(i=0;i<4;i++) { Box_Ram[3-i+tpy]=Box_Ram[3-i+tpy]&(~((temp&0x000f)<<(9-tpx))); temp=temp>>4; }//从游戏点阵缓存中删除以前的方块 temp=s_box.box; for(i=0;i<4;i++) { Box_Ram[3-i+s_box.y]=((temp&0x000f)<<(9-s_box.x))|Box_Ram[3-i+s_box.y]; temp=temp>>4; }//在游戏点阵缓存中加入新的方块}//显示数字函数(//x表示x坐标,//y表示y坐标,//tpdata表示要显示的数字)//显示速度函数voidshow_num(unsignedcharx, unsignedchary, unsignedchartpdata){ unsignedchari; for(i=0;i<4;i++) { LCD_display_byte(x+i,y,num_data[tpdata*4+i]); }}voidshow_speed_num(unsignedcharx,unsignedchary){ show_num(x,y,speed_num);}//显示得分函数voidshow_score_num(unsignedcharx,unsignedchary){ show_num(x,y,destroy_row_num/10000); show_num(x+=5,y,(destroy_row_num%10000)/1000); show_num(x+=5,y,(destroy_row_num%1000)/100); show_num(x+=5,y,(destroy_row_num%100)/10); show_num(x+=5,y,destroy_row_num%10);}//消行函数voiddestroy_row(){ unsignedchari,j=0; unsignedchartpflag[4]={0,0,0,0};//最多一次只能消四行,所以设置四个标志位即可,初值为0 for(i=0;i<16;i++) { if((Box_Ram[i]&0x3ffc)==0x3ffc) { tpflag[j]=i+1;//tpflag为0表示不标志,1表示第0行缓存为0xffff,n表示第n+1行缓存为0xffff destroy_row_num++;//消除的行数加一 /*如不把Box_Ram[19]定义成idata类型的话加入这段代码显示数据区就溢出了*/ if(destroy_row_num%30==0&&speed_num!=9) { speed_num++;//消够三十行游戏速度加一 show_speed_num(13,4);//调用显示游戏速度函数 } /*如不把Box_Ram[19]定义成idata类型的话加入这段代码显示数据区就溢出了*/ j++; if(j==4) { break; }//检查完有四行要消除则退出检查循环 } }//依次检测是否有行缓存为0xffff,如果是则标志tpflag为此行的行号 for(j=0;j<4;j++) { if(tpflag[j]!=0) { for(i=tpflag[j]-1;i>0;i--) { Box_Ram[i]=Box_Ram[i-1]; Box_Ram[0]=0x2004; } } }//被标志的行依次被上一行所取代,即被消去 show_score_num(3,1);}//显示下一个方块函数voidshow_next_box(){ unsignedchari,tpdata; unsignedinttemp; temp=box_read_data(next_mode,next_shape); for(i=0;i<4;i++) { tpdata=0x00; if(((temp>>(15-i))&0x0001)==1) { tpdata=0x0f; } if(((temp>>(11-i))&0x0001)==1) { tpdata|=0xf0; } LCD_display_byte(7+i*4,6,tpdata); LCD_display_byte(8+i*4,6,0xbb&tpdata); LCD_display_byte(9+i*4,6,0xdd&tpdata); LCD_display_byte(10+i*4,6,tpdata); tpdata=0x00; if(((temp>>(7-i))&0x0001)==1) { tpdata=0x0f; } if(((temp>>(3-i))&0x0001)==1) { tpdata|=0xf0; } LCD_display_byte(7+i*4,7,tpdata); LCD_display_byte(8+i*4,7,0xbb&tpdata); LCD_display_byte(9+i*4,7,0xdd&tpdata); LCD_display_byte(10+i*4,7,tpdata); }}//方块生成函数voidbox_build(){ s_box.mode=next_mode; s_box.shape=next_shape; s_box.x=3; s_box.y=0; next_mode=TL0%7;//产生随机数,但是是伪随机的 next_shape=TL0%4;//产生随机数,但是是伪随机的 show_next_box();//放到game_execute()函数中不知道为什么就是不正常显示}voidgame_button(){ switch(basic_button()){case3:if(s_box.y!=0)//3表示button_a被按下{EA=0;//关中断,如果不关的话可能引起游戏显示混乱speaker=0;if(s_box.shape==3&&check_cover(s_box.x,s_box.y,box_read_data(s_box.mode,0))){ s_box.shape=0;box_load();box_to_Box_Ram(s_box.x,s_box.y,box_read_data(s_box.mode,3));}elseif(check_cover(s_box.x,s_box.y,box_read_data(s_box.mode,0))){ if(check_cover(s_box.x,s_box.y,box_read_data(s_box.mode,s_box.shape+1))) { s_box.shape++; box_load(); box_to_Box_Ram(s_box.x,s_box.y,box_read_data(s_box.mode,s_box.shape-1)); }}EA=1;//开中断speaker=1; }break;case1:if(s_box.y!=0)//1表示down被按下{EA=0;//关中断,如果不关的话可能引起游戏显示混乱speaker=0;while(check_cover(s_box.x,s_box.y+1,s_box.box))//检测是否能下降,指导不能再下降为止{s_box.y++;box_to_Box_Ram(s_box.x,s_box.y-1,s_box.box);}destroy_row();box_build();box_load(); // game_over_flag=check_game_over();//游戏结束标志位置1表示游戏结束 // next_box();box_to_Box_Ram(s_box.x,s_box.y,s_box.box);EA=1;//开中断speaker=1;}break;case4:if(s_box.y!=0)//4表示left被按下{EA=0;//关中断,如果不关的话可能引起游戏显示混乱speaker=0;if(check_cover(s_box.x-1,s_box.y,s_box.box)){s_box.x--;box_to_Box_Ram(s_box.x+1,s_box.y,s_box.box);}EA=1;//开中断speaker=1;}break;case5:if(s_box.y!=1)//5表示right被按下{EA=0;//关中断,如果不关的话可能引起游戏显示混乱speaker=1;if(check_cover(s_box.x+1,s_box.y,s_box.box)){s_box.x++;box_to_Box_Ram(s_box.x-1,s_box.y,s_box.box);} EA=1;//开中断 speaker=1; }break;case2://2表示up被按下speaker=0;pause_game_flag=~pause_game_flag;//游戏暂停标志取反while(up==0);speaker=1;break;default:;} }//检查游戏结束函数(游戏结束返回1,游戏没有结束返回0)bitcheck_game_over(){ unsignedchari; bittpflag=0; unsignedinttemp; temp=s_box.box; for(i=0;i<4;i++) { if((((temp&0x000f)<<(9-s_box.x))&Box_Ram[3-i+s_box.y])!=0x0000) { tpflag=1; } temp=temp>>4; }//检查新建方块是否和原有图形重叠,重叠置标志位tpflag为1,不重叠不置标志位,即tpflag为0 return(tpflag);}//游戏执行函数(控制方块下落,检测是否到底,如果到底调用消行函数)voidgame_execute(){ if(box_down_reg<20-(speed_num<<1)) { box_down_reg++; } else { box_down_reg=0; if(check_cover(s_box.x,s_box.y+1,s_box.box)) { s_box.y++; box_to_Box_Ram(s_box.x,s_box.y-1,s_box.box); }//检测是否还可以下降,如果还能下降则继续下降 else { destroy_row(); box_build(); box_load(); game_over_flag=check_game_over();//游戏结束标志位置1表示游戏结束 box_to_Box_Ram(s_box.x,s_box.y,s_box.box); box_down_reg=(20-(speed_num<<1)-1);//为了使方块一出现就能变换形状,所以需要尽快使得方块下降一行,不知道为什么最高行不能变换形状 }//如果不能下降则调用消行函数检查是否可以消行,之后重新建立方块 } }//选择游戏速度函数voidselect_speed(){ unsignedchari; bittpflag=1;//置循环标志位为1 LCD_clear(); for(i=0;i<128;i++) { LCD_display_byte(i,0,0xff); LCD_display_byte(i,7,0xff); } LCD_display_byte(60,4,0x7f); LCD_display_byte(59,4,0x3e); LCD_display_byte(58,4,0x1c); LCD_display_byte(57,4,0x08); LCD_display_byte(67,4,0x7f); LCD_display_byte(68,4,0x3e); LCD_display_byte(69,4,0x1c); LCD_display_byte(70,4,0x08); LCD_display_word(speed_data,24,3,52); show_speed_num(62,4); while(tpflag) { switch(basic_button()) { case4:if(speed_num!=0) { speaker=0; speed_num--; show_speed_num(62,4); speaker=1; } while(left==0); break; case5:if(speed_num!=9) { speaker=0; speed_num++; show_speed_num(62,4); speaker=1; } while(right==0); break; case6:tpflag=0; speaker=0; while(button_b==0); speaker=1; break; default:; } }//选择游戏速度循环}//游戏开始显示画面voidgame_start_show(){ bittpflag=1;//置循环标志位为1 LCD_full_draw(start_pic); while(tpflag) { switch(basic_button()) { case6:tpflag=0; speaker=0; while(button_b==0); sp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025YL合同管理宝石CD卷
- 2025制造工人劳动合同
- 钢筋班组施工合同
- 婚前以婚后财产归个人所有协议
- 2025租房合同补充协议范本
- 2025年小型产权公寓买卖合同
- 《2025年劳动合同续签通知函》
- 2025合作协议及合同书范文
- 2025年广州市办公室租赁合同模板
- 婚介协议书范本模板
- 2025年高考英语二轮复习测试04 从句综合+语法填空(测试)(原卷版)
- 春季肝胆排毒课件
- 造口患者自我护理
- 第12课 辽宋夏金元时期经济的繁荣 教案2024-2025学年七年级历史下册新课标
- 《安全生产治本攻坚三年行动方案》培训
- 警车安全驾驶课件大全
- 《形象塑造与职场妆容》课件
- 2025年高考作文备考之7个顶级人物素材
- 2024年09月2024年中国工商银行校园招聘笔试历年参考题库附带答案详解
- 低血糖的识别及处理课件
- 骨折病人的中医饮食护理
评论
0/150
提交评论