AT89C51单片机游戏(俄罗斯方块)

发布者:Shuangfei最新更新时间:2023-01-05 来源: zhihu关键字:AT89C51  俄罗斯方块 手机看文章 扫描二维码
随时随地手机看文章

一、电路设计

此电路由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);

}

}

}


关键字:AT89C51  俄罗斯方块 引用地址:AT89C51单片机游戏(俄罗斯方块)

上一篇:基于AT89C52单片机的光立方
下一篇:单片机 实时时钟电路(AT89C51、LCD1602、PCF8563)

推荐阅读最新更新时间:2024-10-16 14:27

AT89C51单片机在电话远程控制器中的应用
随着通讯产业的发展,电话机已经走进了千家万户,利用电话机进行远程控制的技术也日益用于生活中,本文设计了一种电话远程控制系统,该系统主要应用于电话遥控控制的家用电器,用户在户外可通过任意一部双音多频电话(包括手机、电话分机),根据语音提示,可以对各种电器(如电饭锅、微波炉等电器)进行远程控制。   1 系统结构 此系统主要包括电话振铃检测电路,电话自动拾机和挂机电话,DTMF信号解码电路,语音提示电路,以及音频放大电路,系统结构框图如图1所示。 当有电话呼入时,电话振铃检测电路检测到有振铃并等待系统默认的振铃次数后,控制器自动拾机。用户在语音提示下依次输入用户的操作密码和操作指令。DTMF解码电路将接收到的DT
[应用]
AT89C51单片机扩展高速串行同步移位输出口的方法
AT89C51(与MCS-51兼容)单片机的串行口在方式0工作状态下,使用移位寄存器芯片可以扩展多个8位并行I/O口。在LED点阵显示屏应用系统中,一般都采用数据同步移位输出方式,并使用移位寄存器芯片(如74LS595)扩展并行I/O口驱动LED点阵显示。LED 点阵显示采用扫描方式,为不产生闪烁感,每秒需要传送50屏点阵显示数据,因此有大量的数据要通过同步移位的方式送到显示驱动电路部分,这就要求单片机能够快速地输出数据。AT89C51单片机的串行口在方式0工作状态下,数据以fosc/12的波特率输出,1个字节数据写入SBUF后,需检查中断标志位 TI是否为“1”并清“0”TI或延时几个机器周期后才能继续写入了一个数据,输出速度慢
[单片机]
<font color='red'>AT89C51</font><font color='red'>单片机</font>扩展高速串行同步移位输出口的方法
五花八门的关于单片机的开发经验
单片机开发初探 做AT89C5X(51,52,55等等)的时间最长,知道的可能多些,主要谈些实际应用中的经验与教训。书可以参看北航出的一本专门讲AT89系列的,还不错,建议大家购买。 AT89C51我认为是一个非常标准的51单片机了,4个P口,1个串口,RAM只有标准的128Byte,Flash也只有4K,功能还算齐全,我就以它为基础,所以开发过程中遇到的问题吧。 复位源的问题 大家最常用的复位方式就是电阻加电容吧,AT89C51是高电平复位,这种方式不稳定,在产品调试时可以使用,因为在调试时我们一般使用了仿真器,而许多仿真器都会自己输出复位信号,而屏蔽掉目标板产生的复位信号,所以调试时复位信号是没有问题的,我们公司使用的
[单片机]
五花八门的关于<font color='red'>单片机</font>的开发经验
基于LCD12864和51单片机的简单小游戏Proteus仿真程序
以lcd12864作为显示屏,实现一个按钮控制的简单小游戏。主要工作集中于游戏的图形化以及相关逻辑的实现。人物场景设计通过字模提取软件转换成为段码预先储存在单片机中,动画的实现采取局部刷新的方式以提高显示的速度。 仿真原理图如下 单片机源程序如下: #include reg51.h #define LCDLCDDisp_Off 0x3e #define LCDLCDDisp_On 0x3f #define Page_Add 0xb8//ye #define LCDCol_Add 0x40//lie #define Start_Line 0xC0//hang /*****液晶显示器的端口定义*****
[单片机]
基于LCD12864和51<font color='red'>单片机</font>的简单小<font color='red'>游戏</font>Proteus仿真程序
AT89C51单片机在LED显示屏控制电路设计中的应用
LED显示屏又叫电子显示屏,是由LED点阵组成,通过红色或绿色灯珠的亮灭来显示文字、图片、动画、视频,内容可以随时更换,通常由显示模块、控制系统及电源系统组成。显示模块由LED灯组成的点阵构成,负责发光显示;控制系统通过控制相应区域的亮灭,可以让屏幕显示文字、图片、视频等内容,恒舞动卡主要是播放动画的;电源系统负责将输入电压电流转为显示屏需要的电压电流。   LED显示屏广泛应用于信息指示灯,大屏幕显示,液晶显示的背光灯,固体照明等。本文设计一种由4个16×16点阵LED模块组成的显示屏,由单片机作控制器,平滑移动显示任意多个文字或图形符号,本电路可级联扩展实现由任意多个16×16点阵LED模块组成的显示屏。   一、控制
[单片机]
<font color='red'>AT89C51</font><font color='red'>单片机</font>在LED显示屏控制电路设计中的应用
基于单片机设计的汽车倒车雷达系统
0 引 言 随着中国经济的持续增长和汽车价格的持续下降,越来越多的家庭拥有了私家车。在享受汽车给人们带来便利的同时,由于倒车而产生的问题也日益突出。据初步调查统计,15%的汽车事故是由汽车倒车 后视 不良造成的。早期的倒车防撞仪可以测试车后一定距离范围的障碍物从而发出警报,后来发展到根据距离分段报警。随着人们对汽车驾驶辅助系统易用性要求的提高,对汽车倒车雷达的要求也越来越高。本文设计的基于单片机AT89C51的倒车雷达,采用美国DAL-LAS 半导体公司生产的DS18B20单总线型数字温度传感器进行温度补偿提高了测距精度,采用OC-MJ12232C_3液晶显示模块对车距进行实时显示和 ISD4004语音芯片实现了倒车雷达语音报警
[单片机]
基于<font color='red'>单片机</font>设计的汽车倒车雷达系统
基于AT89C51单片机设计的简易智能机器人
引言 随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数器、并行和串行接口、看门狗、前置放大器、A/D转换器、D/A转换器等多种电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。这种技术促使机器人技术也有了突飞猛进的发展,目前人们已经完全可以设计并制造出具有某些特殊功能的简易智能机器人。 1 设计思想与总体方案 1.1 简易智能机器人的设计思想 本机器人能在任意区域内沿引导线行走,自动绕障,在有光源引导的条件下能沿光源行走。同时,能检测埋在地下的金属片,发出声光指示信息,并能实时存储、显示检测到的断点数目以及各断点至起跑线
[单片机]
AT89C5131单片机在接口设计中的应用
  AT89C5131是一个基于52内核的单片机。在存储器方面,其内部集成了32KB的Flash存储器用于代码的存储,1KB的EEPROM存储器用于用户数据的存储,用户可以使用片上的Bootloader或Flash API通过USB接口或者其他接口(如UART和I2C总线)对Flash存储器和EEPROM存储器进行ISP或者IAP编程。 此外AT89C5131还集成了10位的ADC、I2C总线接口和PCA模块等丰富的外设。   AT89C5131的USB2.0全速从接口的结构如图3所示,其包括USB D+/D-的接口缓冲,数字锁相环,串行接口引擎(SIE)和通用功能接口(UFI)。其中数字锁相环以单片机的时钟为输入,产生了USB接
[单片机]
<font color='red'>AT89C51</font>31<font color='red'>单片机</font>在接口设计中的应用
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved