基于STC89C52单片机贪吃蛇做法可编辑修改word版.docx
- 文档编号:9872906
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:30
- 大小:22.92KB
基于STC89C52单片机贪吃蛇做法可编辑修改word版.docx
《基于STC89C52单片机贪吃蛇做法可编辑修改word版.docx》由会员分享,可在线阅读,更多相关《基于STC89C52单片机贪吃蛇做法可编辑修改word版.docx(30页珍藏版)》请在冰豆网上搜索。
基于STC89C52单片机贪吃蛇做法可编辑修改word版
#ifndef_glb_h_#define_glb_h_
#defineucharunsignedchar#defineuintunsignedint
#defineLOW0
#defineHIGH1
//初始化指令
#defineCLEAR_SCREEN0x01//清屏指令:
清屏且AC值为00H#defineAC_INIT0x02//将AC设置为00H。
且游标移到原点位置
#defineCURSE_ADD0x06//设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)
#defineFUN_MODE0x30//工作模式:
8位基本指令集
#defineDISPLAY_ON0x0c//显示开,显示游标,且游标位置反白#defineDISPLAY_OFF0x08//显示关
#defineCURSE_DIR0x14//游标向右移动:
AC=AC+1#defineSET_CG_AC0x40//设置AC,范围为:
00H~3FH#defineSET_DD_AC0x80
#defineFUN_MODEK0x36//扩展指令集,8位指令#defineX1address0x80//上半屏X轴起始地址#defineX2address0x88//下半屏X轴起始地址
#defineYaddress0x80//Y轴起始地址
/*---------------------------------------------------------------------------------------------------
液晶屏
*/
#defineDataPortP0sbitRS=P3^5;
sbitRW=P3^6;sbitE=P3^4;sbitPSB=P3^7;
sbitWELA=P2^7;sbitDULA=P2^6;sbitspeed=P2^0;sbitbeep=P2^3;
/*
#defineDataPortP1sbitRS=P2^0;
sbitRW=P2^1;sbitE=P2^3;sbitPSB=P2^4;
//sbitWELA=P2^7;
//sbitDULA=P2^6;
*/
/*---------------------------------------------------------------------------------------------------
贪吃蛇
*/
//定义复位不自动清零全局变量
//#pragmaDATA_SEGNOINIT_RAM
sbitLEFT=P2^4;//左sbitRIGHT=P2^1;//右sbitUP=P2^5;//上sbitDOWN=P2^2;//下
//sbitLed1=P1^7;
//sbitLed2=P1^6;
/*sbitLEFT=P0^2;//左sbitRIGHT=P0^3;//右sbitUP=P0^0;//上
sbitDOWN=P0^1;//下*/
sbitLed7=P1^0;sbitLed6=P1^1;sbitLed5=P1^3;sbitLed4=P1^4;
//sbitLed3=P3^3;
//sbitLed2=P3^2;
//sbitLed1=P3^1;
//sbitLed0=P3^0;#endif
#ifndef_Init_h_#define_Init_h_
/*------------------------------------------------------------------------------------------------------------
Init_12864
*/
voidDelayus(unsignedchari);voidDelayms(unsignedinti);voidCheck_Busy();
voidWrite_Cmd(unsignedcharCmd);voidWrite_Data(unsignedcharData);
//ucharRead_Status();ucharRead_Data();voidInit_IO();
voidInit_12864();
//voiddisp();voidCGRAM();
voidLCD_PutString(unsignedcharx,unsignedchary,unsignedcharcode*s);voidClrScreen();
voidClr_GDRAM(void);
voidLCD_PutGraphic(unsignedcharcode*img);voidSetGraphicMode();
voidKeyscan();voidstatuschange();
voidDraw_Point(ucharX,ucharY,ucharclour);voidDraw_zhi(ucharX1,ucharX2,ucharY);voidDraw_shu(ucharX,ucharY1,ucharY2);
voidDraw_line(ucharx0,uchary0,ucharx1,uchary1);voidDraw_all_lines();
voidStat_Point();voidLast_Point();voidAdd_Point();voidBump_Wall();voidSelf_Bump();
/*------------------------------------------------------------------------------------------------------------
Init_Time
*/
//voidInit_Time();
//voidexter0()interrupt1#endif
#include
uinttimestatus=0;voidInit_Time()
{
TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;
ET0=1;
TR0=1;
}
voidTimer0()interrupt1
{
TH0=(65536-50000)/256;TL0=(65536-50000)%256;
timestatus++;if(speed==0)
{
if(timestatus>2)timestatus=0;
}
if(timestatus>10)timestatus=0;
}
#ifndef_Interrupt_h_#define_Interrupt_h_
voidInit_Time();
#endif
#include
/*游戏的初始化值*/uchargamestatus=0;
ucharflag=1;//折点个数标志
uchara[]={20,0,0,0,0,0,0,0};//其中(a[0],b[0])为初始蛇头坐标,(a[1],b[1])为初始蛇尾坐标,之后蛇尾坐标为(a[flag],b[flag])。
ucharb[]={32,32,0,0,0,0,0,0};//后面(a[i],b[i])记录拐点坐标,其中(a[flag-1],b[flag-1])为第一个拐点的坐标
ucharc[]={0,0,0,0,0,0,0,0};//c[i]记录方向,其中a[0]为当前方向ucharx=54,y=32,pointstatus,allpoints;
/*---------------------------------------------------------------------------------
延时函数
*/voidDelayus(unsignedchari)
{
intj;for(j=2;j>0;j--)
for(;i>0;i--);
}
voidDelayms(unsignedinti)
{
unsignedintj;for(;i>0;i--)
for(j=110;j>0;j--);
}
/*---------------------------------------------------------------------------------
检测忙位
*/voidCheck_Busy()
{
E=0;
RS=0;
RW=1;
E=1;
DataPort=0xff;
while((DataPort&0x80)==0x80);//忙则等待,忙标志检测BF,可以将BF读到DB7
进行检测
E=0;
}
/*---------------------------------------------------------------------------------
写命令
*/voidWrite_Cmd(unsignedcharCmd)
{
Check_Busy();
RS=0;
RW=0;
DataPort=Cmd;
Delayus
(2);
E=1;
Delayus(5);
E=0;
}
/*---------------------------------------------------------------------------------
写数据
*/voidWrite_Data(unsignedcharData)
{
Check_Busy();
RS=1;
RW=0;
E=1;
DataPort=Data;Delayus
(2);E=0;
Delayus(5);
}
/*---------------------------------------------------------------------------------
读状态
*/
/*ucharRead_Status()
{
uchari;DataPort=0xff;RW=1;
RS=0;
E=0;
Delayus
(2);
E=1;
Delayus(5);i=DataPort;Delayus(5);E=0;
return(i);
}
*/
/*---------------------------------------------------------------------------------
读数据
*/ucharRead_Data()
{
uchari;
//while((Read_Status()&0x80)!
=0x00);//忙检测Check_Busy();
RW=1;
RS=1;
E=0;
Delayus
(2);
E=1;
Delayus(5);i=DataPort;Delayus(5);E=0;
returni;
}
/*---------------------------------------------------------------------------------
计算并显示得分
*/voidWrite_Score(ucharx,uchary,ucharshu)
{
uchard1,d2,add,ah;d1=shu/10;
d2=shu%10;if(x==0)ah=0x80;elseif(x==1)ah=0x90;elseif(x==2)ah=0x88;elseah=0x98;
add=ah+y;//某一行显示分数Write_Cmd(add);
Write_Data(d1+'0');
Write_Data(d2+'0');
}
/*---------------------------------------------------------------------------------
IO口初始化
*/voidInit_IO()
{
Led4=1;Led5=1;Led6=1;Led7=1;
}
/*---------------------------------------------------------------------------------
液晶屏初始化
*/voidInit_12864()
{
//WELA=0;
//DULA=1;
Delayms
(1);
PSB=1;
Delayms
(1);
Write_Cmd(0x30);
Delayms
(1);
Write_Cmd(0x30);
Delayms
(1);
Write_Cmd(0x0f);
Delayms
(1);
Write_Cmd(0x01);
Delayms
(1);
//Write_Cmd(0x06);
//DelayVs2x(50);
}
/*voiddisp()
{
unsignedchari;unsignedchara=0x10;Write_Cmd(0x80);for(i=0;i<16;i++)
{
Write_Data(a);a++;
Delayms
(2);
}
}
*/
/*---------------------------------------------------------------------------------
用户自定义字符
*/
/*voidCGRAM()
{
inti;Write_Cmd(0x30);Write_Cmd(0x40);for(i=0;i<16;i++)
{
Write_Data(0x10);
Write_Data(0x10);
}
}
*/
/*---------------------------------------------------------------------------------
显示字符
x:
横坐标值,范围0-8
y:
纵坐标值,范围1-4
*/
voidLCD_PutString(unsignedcharx,unsignedchary,unsignedcharcode*s)
{
switch(y)
{
case1:
Write_Cmd(0x80+x);break;
case2:
Write_Cmd(0x90+x);break;
case3:
Write_Cmd(0x88+x);break;
case4:
Write_Cmd(0x98+x);break;default:
break;
}
while(*s>0)
{
Write_Data(*s);s++;
Delayms(5);
}
}
/*---------------------------------------------------------------------------------
清屏
*/voidClrScreen()
{
Write_Cmd(0x01);
Delayus(5);
}
/*---------------------------------------------------------------------------------
清除液晶GDRAM内部的随机数据
*/
voidClr_GDRAM(void)
{
ucharx,y,i,j;
Write_Cmd(0x34);//鎵撳紑鎵╁睍鎸囦护闆?
y=0x80;
x=0x80;
for(i=0;i<32;i++)
{
Write_Cmd(y);Write_Cmd(x);for(j=0;j<16;j++)
{
Write_Data(0x00);
}y++;
}
y=0x80;
x=0x88;
for(i=0;i<32;i++)
{
Write_Cmd(y);Write_Cmd(x);for(j=0;j<16;j++)
{
Write_Data(0x00);
}
y++;
}
Write_Cmd(0x30);//鍥炲埌鍩烘湰鎸囦护闆?
}
/*---------------------------------------------------------------------------------
显示图片
*/
/*voidLCD_PutGraphic(unsignedcharcode*img)
{
inti,j;
//显示上半屏内容设置for(i=0;i<16;i++)
{
Write_Cmd(0x80);for(j=0;j<16;j++)
{
Write_Data(*img);img++;
}
Write_Cmd(0x90);for(j=0;j<16;j++)
{
Write_Data(*img);img++;
}
}
//显示下半屏内容设置for(i=0;i<32;i++)
{
Write_Cmd(0x88);for(j=0;j<16;j++)
{
Write_Data(*img);img++;
}
Write_Cmd(0x98);for(j=0;j<16;j++)
{
}
}
}*/
Write_Data(*img);img++;
/*---------------------------------------------------------------------------------
设置到绘图模式
*/
/*voidSetGraphicMode()
{
Write_Cmd(0x36);
Delayms
(2);
}
*/
/*------------------------------------------------------------------------------------------------------------
按键函数
*/voidKeyscan()
{
Led4=1;Led5=1;Led6=1;Led7=1;if(RIGHT==0)
{
Delayms(5);
if(RIGHT==0)
{
Led4=0;
gamestatus=0;
}
}
if(DOWN==0)
{
Delayms(5);if(DOWN==0)
{
Led5=0;
gamestatus=1;
}
}
if(UP==0)
{
Delayms(5);if(UP==0)
{
Led6=0;
gamestatus=3;
}
}
if(LEFT==0)
{
Delayms(5);if(LEFT==0)
{
Led7=0;
gamestatus=2;
}
}
}
/*------------------------------------------------------------------------------------------------------------
状态发生改变处理函数必须跟在按键涵数后面!
!
!
!
*/voidstatuschange()
{
uchari;
if((gamestatus!
=c[0])&&((gamestatus%2)!
=(c[0]%2)))//只有gamestatus由奇数变为偶数或由偶数变为奇数时,才改变方向
{
flag++;//方向改变,折点个数加1
for(i=flag;i>0;i--)
{
a[i]=a[i-1];
b[i]=b[i-1];
c[i]=c[i-1];
}
c[0]=gamestatus;
}
}
/*------------------------------------------------------------------------------------------------------------
画点函数,在屏幕上画一个点
*/voidDraw_Point(ucharX,ucharY,ucharclour)//clour为0时画点,为其它清除这个点
{
ucharx_pos,y_pos,x_bit;
uintread_H,read_L,data_H,data_L;
//计算LCD位置
x_pos=X/16;//取16*16首地址
if(Y>31)
x_pos+=8;//计算该点所属LCD液晶中X坐标位置,上半屏0-7,下半屏8-15
x_bit=X%16;//该点位于所在16bit中的第几位
y_pos=Y%32;//y坐标32行的第几行
Write_Cmd(0x34);//打开扩展指令集操作GDRAM
是扩展指令集
Write_Cmd(0x36);//使用扩充指令集,绘图显示ON
Write_Cmd(0x80+y_pos);//写入第一行8个32*16模块的垂直起始地址,在写入地址时,要先输入垂直地址,再输入水平地址这是规定好的
Write_Cmd(0x80+x_pos);//第一行水平的起始地址为80H
//以后写入数据后,地址计数器(AC)
会自动加一
Read_Data();//此处为什么要中上不知道为什么?
?
?
?
read_H=Read_Data();//高八位!
read_L=Read_Data();//低八位!
if(x_bit<8)//该点位于高八位
{
if(clour==0)//画点
{
}
else
{
}
data_H=read_H|(1<<(7-x_bit));//把1左移7-x_bit位
data_H=read_H&~(1<<(7-x_bit));
data_L=read_L;
}
else//该点位于低八位
{
data_H=read_H;if(clour==0)
{
}
else
{
}
data_L=read_L|(1<<(15-x_bit));
data_L=read_L&~(1<<(15-x_bit));
}
Write_Cmd(0x80+y_pos);Write_Cmd(0x80+x_pos);
Write_Data(data_H);//写高八位数据
Write_Data(data_L);//写
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC89C52 单片机 贪吃 做法 编辑 修改 word