仿真版本:Proteus8.6及以上版本
程序编译:Keil5 C51
编程语言:C语言
设计编号:【Z08】
1. 简介
本文提出了一种基于51单片机的12864俄罗斯方块设计。本系统由AT89C51单片机为控制核心,制作一个俄罗斯方块游戏机,通过LCD12864显示屏为载体显示数据,并用四个输入端表示四个上下左右控制键和三个确认、暂停功能键,实现俄罗斯方块设计。
2. 主要功能
a.支持按键实现游戏速度设置、分数统计。
b. 支持按键启停、变形、左右下功能。
3. 源程序(Keil5)
本设计采用keil5 C51软件(内附安装包)实现程序设计。如需用keil4打开程序,可自行通过.c和.h文件新建工程即可。
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<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画全屏函数
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);
}
}
4. 仿真proteus8.6
本设计采用proteus8.6软件(内附安装包)实现仿真设计,如下图所示。proteus软件一般存在高低版本兼容问题,该仿真是通过proteus8.6导出的,所以请尽量使用proteus8.6打开文件,低于proteus8.6的版本不能够正常使用,高于proteus8.6的版本除了proteus8.8/8.9理论上可以正常使用。
仿真界面:
5. 设计报告
设计报告主要包括硬件电路、软件设计、仿真调试等等,仅供参考。
6. 资料清单
设计资料主要包括C程序+仿真+设计报告+使用说明+元件清单+操作视频等。
7. 资料获取链接
百度网盘下载链接:【Z08】百度网盘下载链接
更多单片机仿真设计合集:单片机仿真设计合集