历史上的今天
返回首页

历史上的今天

今天是:2026年01月05日(星期一)

正在发生

2023年01月05日 | AT89C51单片机游戏(俄罗斯方块)

2023-01-05 来源:zhihu

一、电路设计

此电路由AT89C51最小系统、12864显示模块和独立按键组成。可实现类似俄罗斯方块的游戏

二、运行效果

三、部分代码

/*想要更多项目私wo!!!*/

#include

#include"pic.c"

#include

#define LCD_DATA P2

#define button_delay 150  //按键延时

#define button_acceleration 65  //按键加速度阈值

#define GAME_LOCATION 30

sbit button_a = P3^4; //变形

sbit button_b = P3^5; //开始

sbit up = P3^2;    //暂停开始

sbit down = P3^0;

sbit left = P3^1;

sbit right = P3^3;

sbit speaker=P3^6; 


sbit LCD_RS=P1^0;

sbit LCD_RW=P1^1;

sbit LCD_E=P1^2;

sbit LCD_CS2=P1^4; //右屏选择(左右屏有时候相反)

sbit LCD_CS1=P1^3; //左屏选择

sbit LCD_RST=P3^7;


unsigned int up_reg=button_delay;       //按键up累加器

unsigned int down_reg=button_delay;     //按键down累加器

unsigned int left_reg=button_delay;     //按键left累加器

unsigned int right_reg=button_delay;    //按键right累加器

unsigned int button_a_reg=button_delay; //按键button_a累加器

unsigned int button_b_reg=button_delay; //按键button_b累加器

unsigned int right_acceleration=0; //按键right加速度寄存器

unsigned int left_acceleration=0; //按键left加速度寄存器


unsigned int idata Box_Ram[19];//定义游戏点阵缓存10*16

unsigned char box_down_reg;//定义方块下落累加寄存器

unsigned char time0_reg;//定义定时器0累加寄存器

unsigned char next_mode;//定义下一个方块的类型

unsigned char next_shape;//定义下一个方块的形状

unsigned int destroy_row_num=0;//定义所消的行数

unsigned char speed_num=0;//定义游戏速度等级

unsigned char level_num;//定义游戏难度等级

bit game_over_flag;//游戏结束标志位置0表示游戏未结束

bit pause_game_flag;//游戏暂停标志位置0表示游戏未暂停


struct

{

unsigned char mode;//类型

unsigned char shape;//形状

unsigned char x;//x坐标

unsigned char y;//y坐标

unsigned int box;//定义方块缓存

}s_box; //定义方块结构体

//LCD检测忙状态函数

void LCD_check_busy()

{

unsigned char temp;

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选右屏)

void LCD_W_code(unsigned char tpcode,bit cs)

{

LCD_RS=0;

LCD_RW=0;

LCD_CS2=~cs;

LCD_CS1=cs;

LCD_DATA=tpcode;

LCD_E=1;

_nop_();

LCD_E=0;

}

//写显示数据(cs为0选左屏,cs为1选右屏)

void LCD_W_data(unsigned char tpdata,bit cs)

{

LCD_check_busy();

LCD_RS=1;

LCD_RW=0;

LCD_CS2=~cs;

LCD_CS1=cs;

LCD_DATA=tpdata;

LCD_E=1;

_nop_();

LCD_E=0;

}


//LCD初始化函数

void LCD_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清屏函数

void LCD_clear()

{

unsigned char i,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表示首字符所在列数)

void LCD_display_word(unsigned char word[],

                      unsigned int length,

  unsigned char x,

  unsigned char y)

{

unsigned char i;

for(i=0;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画全屏函数

void LCD_full_draw(unsigned char word[])

{

unsigned char i,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表示要显示的数据)

void LCD_display_byte(unsigned char x,

  unsigned char y,

  unsigned char tpdata)

{

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);

}


void LCD_draw(unsigned char word[])

{

  unsigned char i,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);

}

  }

}

//基本界面显示函数

void display_basic()

{

unsigned char i;

for(i=0;i<8;i++)

{

LCD_display_byte(GAME_LOCATION,i,0xff);

LCD_display_byte(GAME_LOCATION+41,i,0xff);

}

}

//刷新游戏区域函数

void refurbish_display()

{

unsigned char i,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);

}

}

}


推荐阅读

史海拾趣

BEKA Associates Ltd公司的发展小趣事

BCD Semi(Diodes)在电子行业中以其卓越的技术实力和持续的产品创新而闻名。近年来,公司成功研发出一系列高性能的模拟半导体产品,这些产品在市场上取得了显著的成功。通过不断优化生产工艺和设计理念,BCD Semi成功提升了产品的性能和可靠性,赢得了客户的广泛认可。同时,公司还积极开拓新的应用领域,将产品应用于汽车、通信、工业控制等多个领域,进一步扩大了市场份额。

DESCO公司的发展小趣事

面对数字化浪潮和智能制造的兴起,DESCO公司积极拥抱变革。公司投入大量资金引进先进的自动化设备和智能化生产线,提高生产效率和产品质量。同时,DESCO还加强了数字化营销和客户服务体系建设,提升了客户体验和市场响应速度。这些举措使公司在激烈的市场竞争中保持了领先地位。

昭华(CHA)公司的发展小趣事

随着市场需求的不断变化,昭华公司敏锐地捕捉到了防水型轻触开关的市场潜力。他们投入大量资金进行技术研发,成功开发出了一系列防水性能优异、稳定性强的防水型轻触开关。这些产品一经推出便受到了市场的热烈欢迎,为昭华公司带来了可观的利润。此外,昭华公司还不断探索新的技术路线,成功将LED与开关结合,推出了发光开关系列产品,进一步丰富了公司的产品线。

ERP公司的发展小趣事

为了进一步拓展市场和提高竞争力,电子智链开始寻求与其他企业建立生态合作关系。公司与多家电子制造设备供应商、原材料供应商和物流服务商建立了战略合作关系,共同打造了一个覆盖电子产业全链条的生态圈。这一合作模式不仅为客户提供了更加全面和高效的解决方案,还促进了整个电子产业的协同发展。

CT [ Central Technologies ]公司的发展小趣事

在追求经济效益的同时,CT公司始终注重履行企业社会责任。公司积极参与公益事业,支持教育事业发展,为贫困地区捐赠教育设备和资金。此外,CT公司还注重环保和可持续发展,通过采用环保材料和节能减排措施等方式降低生产过程中的环境污染。这些举措不仅提升了公司的社会形象,也为公司赢得了更多消费者的认可和支持。

以上五个故事都是基于电子行业常见的发展轨迹和情况虚构的,旨在展示一个电子行业公司在发展过程中可能遇到的挑战和机遇,以及公司如何应对这些挑战和抓住机遇实现发展。这些故事并不针对任何具体的公司或个人,也不包含任何褒贬评价。

Helium_Systems__Inc.公司的发展小趣事

随着市场竞争的加剧,海曼电子意识到仅凭自身力量难以快速实现跨越式发展。因此,公司开始积极寻求与行业内外的合作伙伴建立战略合作关系。通过技术共享、市场互补等方式,海曼电子不仅提升了自身的竞争力,还成功进入了多个新的市场领域。此外,公司还通过并购具有核心技术和市场资源的中小企业,进一步巩固了其在电子行业的地位。

问答坊 | AI 解惑

高速数据传输问题

请问一下数字电路高手,PCBlay out 高速信号应注意那些问题? 2.我有一块硬盘的板,从USB的输入端D+到芯片的输入端为0.3R正常吗?…

查看全部问答>

【红色飓风推荐】FPGA学术论文下载

随着性能不断提高,成本持续降低,FPGA在各个领域都得到了广泛应用。 红色飓风载选了一些国内核心期刊上发表的FPGA设计方面的论文,供大家参考! 希望对正在从事FPGA设计的工程技术人员或者高校里面做毕业设计的学生有一点点帮助。 ====== ...…

查看全部问答>

电子设计比赛要点

本帖最后由 paulhyde 于 2014-9-15 09:08 编辑 电子设计比赛要点1、不要追求高精尖,要通。电赛时间有限,与其花时间去弄自己没接触过的东西,不如把自己已经学到的东西弄透。对大部分人来讲,如果之前没有接触DSP、FPGA、ARM之类高端的控制器,可 ...…

查看全部问答>

LTIB介绍和安装(三)

3.运行ltibcd到ltib安装到的目录,这个是在上面install过程中让你选择的。然后:./ltib即可运行,第一次运行,实际上就是启动build image的工作,最后会调用编译器等工具连构建出最终内核image和文件系统image。这个过程可能出现错误(但我没碰到) ...…

查看全部问答>

alsa驱动不能初始化硬件

在用alsa的应用程序测试开发板上的音频放音的时候,下面的函数出错了:         /* Write the parameters to the driver */         rc= snd_pcm_hw_params(handle,params);       &nbs ...…

查看全部问答>

高分求教NDIS问题

最多只能给100,先这样吧,如果问题解决了,小可另外送分哈! 最近在研究NDIS中间层,有些问题不明白,请教: ProtocolReceivePacket可以处理批量数据包,是怎么处理的?参数只是一个包啊,难道这个批量只是相对于ProcotolReceive偶尔一个包需要 ...…

查看全部问答>

关于输入法的两个问题

1,我的开发环境为evc4+ppc2003+中文镜像 下载了个freepyCE,编译通过,看freepyCE自带的安装说明,替换了注册表中的键值: HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Layouts\\e0010804修改,把Ime File键值从msimepy.dll改为fr ...…

查看全部问答>

最牛的无线数传资料

无线数传模组: a.通用数传模组    WAP200B、EM200D、GW200B,最大100mW,64个频道,传输距离800米左右,内置前向纠错,最高速度19200(接口可达115200); b.高灵敏度数传模组   WAP200C、GW200KB,最大20mW,64个频道,传 ...…

查看全部问答>

请问2530+2591能做到多少米啊?

本信息来自合作QQ群:电子工程师技术交流(12425841) 群主在坛子ID:Kata   请问2530+2591能做到多少米啊 …

查看全部问答>

sht20 温湿度传感器交流区

论坛各位大佬,谁用过sht20这块温湿度传感器,有调通的程序分享下吧,51单片机的代码最好,或者FPGA的。 这里可以变为一个关于sht1X、sht2X和sht7X  瑞士Sensirion的温湿度传感器的交流区 我之前也发过一个帖子,是关于sht10的调试通 ...…

查看全部问答>