#include <reg51.h>
#include <intrins.h>
#include <bmp_code.h>
//#define uchar unsigned char
//#define uint unsigned int
//sbit cd=P2^4;
//sbit read=P2^5;
//sbit write=P2^6;
//#define dataport P0
void busy() //读状态,查忙
{
uchar status;
do{
dataport=0xff;
cd=1;
read=0;
write=1;
_nop_();
_nop_();
_nop_();
status=dataport;
read=1;
}while(status&0x03!=0x03); //s1数据读写状态s0指令读写状态,1表示准备好
}
void write_cmd(uchar cmd) //写命令
{
busy();
cd=1;
read=1;
write=0;
_nop_();
_nop_();
_nop_();
dataport=cmd;
write=1;
}
void write_dat(uchar dat) //写数据
{
busy();
cd=0;
read=1;
write=0;
_nop_();
_nop_();
_nop_();
dataport=dat;
write=1;
}
//void delay(uchar z)
//{
//for(z>0;z=0;z--);
//}
void init()
{
write_dat(0x00);
write_dat(0x00);
write_cmd(0x40); //文本首地址命令0x40,文本首地址=0x0000
write_dat(0x10);
write_dat(0x00);
write_cmd(0x41); //文本宽度命令0x41, 文本宽度=16
write_dat(0x00);
write_dat(0x08);
write_cmd(0x42); //图形首地址命令0x42,首地址=0x0800
write_dat(0x1e);
write_dat(0x00);
write_cmd(0x43); //图形宽度命令0x43, 图形宽度=30个字节; 240X128
write_cmd(0x80); //逻辑或
write_cmd(0x9c);//开图形显示和文本显示
}
void display(uchar *p)
{ //显示一副240*128图片
uint i,j;
uint addr;
addr=0x0800;
write_dat(addr%256); //低位
write_dat(addr/256); //高位
write_cmd(0x24); //设置地址指针
//for(i=0;i<128*30;i++)
for(i=0;i<128*30;i++)
{
if(i%30==0)//控制高度
{ j++;
addr=0x0800+j*30;
write_dat(addr%256); //低位
write_dat(addr/256); //高位
write_cmd(0x24); //设置地址指针
}
write_dat(p[i]);
write_cmd(0xc0); //写数据,地址加一
}
}
void display1(uchar x,uchar y,uchar a,uchar b,uchar c,uchar *p)
{
uint addr;
uchar i,j;
addr=256*8+x*30+y;
for(i=0;i<b;i++) //b行数据
{
write_dat(addr&0xff); //写地址低8位
write_dat(addr/256); //写地址高8位
write_cmd(0x24); //设置地址
write_cmd(0xb0); //设置数据自动写
for(j=c*2;j<(c*2+2);j++) //a/8列数据
{write_dat(p[(a/8)*i+j]);}
write_cmd(0xb2); //自动复位
addr=addr+30; //换行
}
}
//==================【显示图片部分】====================
//--------------------------------------------
// LM4229在指定位置显示a*b图片
// a为图片长,b为图片宽(a为8的倍数)
//--------------------------------------------
void display2(uchar x,uchar y,uchar a,uchar b,uchar *p)
{
uint addr;
uchar i,j;
addr=256*8+x*30+y;
for(i=0;i<b;i++) //b行数据
{
write_dat(addr&0xff); //写地址低8位
write_dat(addr/256); //写地址高8位
write_cmd(0x24); //设置地址
write_cmd(0xb0); //设置数据自动写
for(j=0;j<a/8;j++) //a/8列数据
{write_dat(p[(a/8)*i+j]);}
write_cmd(0xb2); //自动复位
addr=addr+30; //换行
}
}
void display3(uchar x,uchar y,uchar a,uchar b,uchar c,uchar *p)
{
uint addr;
uchar i,j;
addr=256*8+x*30+y;
for(i=0;i<b;i++) //b行数据
{
write_dat(addr&0xff); //写地址低8位
write_dat(addr/256); //写地址高8位
write_cmd(0x24); //设置地址
write_cmd(0xb0); //设置数据自动写
for(j=c;j<(c+30);j++) //a/8列数据
{
write_dat(p[(720/8)*i+j]);}//write_dat(p[(a/8)*i+j]);}
write_cmd(0xb2); //自动复位
addr=addr+30; //换行
}
}
void coin_func(uchar x,uchar y,uchar j,uchar go,uchar j1,uchar go1,uchar sw)
{
uchar k;
if(j==j1&go==go1&sw)
{
for(k=0;k<13;k++)
{
display1(y,x,48,16,k%3,coin);
}
}
sw=0;
}
void master_func(uchar go,uchar distance,uchar j,uchar sw)
{
display3(0,0,720,128,go,bmp3);
if(sw)
{
//if((29-distance)>1&(29-distance)<29)
//{
if((30-go-distance)>-2&(30-go-distance)<2&j>4)
display1(100,29-distance,48,16,2,master); //显示一副图
else
display1(100,29-distance,48,16,distance%2,master); //显示一副图
//}
}
}
void gameover()
{display3(0,0,720,128,10,bmp3);}
void good()
{display3(0,0,720,128,15,bmp3);}
void main()
{
uchar i,j,input;
uchar go=0,distance;
uchar s1=1,s2=1,s3=1,s4=1;
//EA=1;
//ET0=1;
//TR0=1;
//TH0=0x3C;
//TL0=0xB0;
init();
display3(0,0,720,128,go,bmp3); //显示一副背景图
while(1)
{
//uchar i,input,go;
input=P1;
if((~input)&0x01)
{
if(go<18)
display1(100,go,96,16,i,cha); //显示一副图
else
display1(100,18,96,16,i,cha); //显示一副图
if(i<2) {i++;}
else i=0;
go++;
//display3(0,0,720,128,go,bmp3); //显示一副背景图
master_func(go,distance,j,s4);distance++;
if(distance==30)
distance=1;
}
if((~input)==0x00)
{
if(go<18&go>0)
display1(100,go,96,16,5,cha); //显示一副图
if(go>17)
display1(100,18,96,16,5,cha); //显示一副图
if(go<1)
display1(100,0,96,16,5,cha); //显示一副图
if(((30-distance)>0&(30-distance)<29))
{if(s4) master_func(go,distance,j,s4);}distance++;
if(distance==30)
distance=1;
}
if((~input)&0x02)
{
if(go>0&go<18)
display1(100,go,96,16,i,cha); //显示一副图
if(go>17)
display1(100,18,96,16,i,cha); //显示一副图
if(go<1)
display1(100,0,96,16,i,cha); //显示一副图
if(i<2) {i++;}
else i=0;
if(go>0)
go--;
if(go>0)
{//display3(0,0,720,128,go,bmp3); //显示一副背景图
master_func(go,distance,j,s4);distance--;
if(distance==30)
distance=1;
}
else
display3(0,0,720,128,0,bmp3); //显示一副背景图
}
//跳跃部分
if((~input)&0x04)
{
for(j=0;j<7;j++)
{
if(go<18)
{
display1(100-2*j,go,96,16,3,cha); //显示一副图
}
else
display1(100-2*j,18,96,16,3,cha); //显示一副图
if(j>2&j<6)
{
//display3(0,0,720,128,go,bmp3); //显示一副背景图
master_func(go,distance,j,s4);distance++;
if(distance==30)
distance=1;
}
}
//金币显
coin_func(16,64,j,go,7,16,s1);
coin_func(18,64,j,go,7,24,s2);
coin_func(18,64,j,go,7,28,s3);
switch(j,go)
{
case 7,16: {s1=0;break;}
case 7,24: {s2=0;break;}
case 7,28: {s3=0;break;}
default:{ break;} //显示一副背景图
}
if(go>0)
{
//display3(0,0,720,128,go,bmp3); //显示一副背景图
master_func(go,distance,j,s4);distance++;
if(distance==28)
distance=0;
}
else
display3(0,0,720,128,0,bmp3); //显示一副背景图
if((34-go-distance)>-1&(34-go-distance)<5&j>0)
s4=0;
j=0;
}
if((30-go-distance)==0&j<1&s4)
{gameover();break;}
if(go>54)
good();
//怪物显示
/* if((40-go)>10&(40-go)<29)
{
if(go>0&(~((~input)&0x04)))
display3(0,0,720,128,go,bmp3); //显示一副背景图
if(distance<20)
{
display1(100,40-go-distance,48,16,distance%2,master); //显示一副图
distance++;
if(distance==20)
distance=0;
}
}*/
}
}