单片机源程序如下:
- #include <reg52.h>
- #include <SS.h> //关卡的界面
- #include <SB.h> //在此文件中定义了汉字编码,用点阵液晶字模提取软件
- #define uchar unsigned char
- #define uint unsigned int
- sbit cd = P2^0; //=0,数据通道;=1,命令通道
- sbit rd = P2^1; //=0,读选通有效
- sbit wr = P2^2; //=0,写选通有效
- sbit ce = P2^3;
- sbit md = P2^4;
- sbit rst= P2^5;
- uchar renh=6, renl=4, bu=0, guan=1;
- static uchar SB[8][10];
- bit flag=1;
- void wrdat(uchar) ;//写数据
- void wrcmd(uchar cmd); //写命令
- void wrdcmd(uchar dat1, cmd);//写带有一个参数的命令
- void lcddcmd(uchar dat1,dat2,cmd); //写带有两个参数的命令
- void LCD24012864_init();
- void dischar(uchar hang,uchar lie,uchar cha) ;//写ASCII码字符
- void delay();
- void disxg(); //显示选关提示
- void clear(); //清屏
- void disphz(uchar count) ; //数字和汉字代码写入自定义字符存储区
- void dishan(uchar hang, lie,uchar bianma);//写汉字代码行,列,bianma汉字在自定义字符中的位置,
- void disshu(uchar hang, lie, bianma);//写数字代码行,列,bianma汉字在自定义字符中的位置,
- void bushu();
- uchar key() ; //检测按键
- void tupian() //画关卡地图
- {
- uchar i,j;
- for(i=0;i<8;i++)
- for(j=0;j<10;j++)
- {
- dishan(2*i,2*j,han[map[guan-1][i][j]]);
- SB[i][j]=map[guan-1][i][j];
- if(SB[i][j]==0x07) SB[i][j]=0x00;
- }
- dishan(4,22,han[4]);
- disshu(4,24,shu[0]);
- disshu(4,25,shu[guan]);
- dishan(4,26,han[5]);
- bushu();
- dishan(2*renh,2*renl,han[1]);
- }
- void shengli() //过关判断
- {
- uchar i,j,s1=0,s2=0;
- for(i=0;i<8;i++)
- for(j=0;j<10;j++)
- {
- if(map[guan-1][i][j]==0x07) //检视目标
- {
- s1++; //目标计数
- if(SB[i][j]==0x02) s2++; //目标上箱子计数
- }
- }
- if(s1==s2) //目标计数和目标上箱子计数相同,则过关
- {
- dishan(2,20,han[10]); //显示过关提示
- dishan(2,22,han[11]);
- dishan(2,24,han[12]);
- dishan(2,26,han[5]);
- disshu(2,28,shu[11]);
- flag=0; //停止游戏
- disxg(); //显示选关提示
- }
- }
- void xuanguan(uchar k) //选关处理
- {
- if((k==1||k==3)&&guan<3) {guan++;renh=6;renl=4;tupian();}
- if((k==2||k==4)&&guan>1) {guan--;renh=6;renl=4;tupian();}
- }
- void huintfumubiao() //恢复目标显示,(被人踩的目标)
- {
- uchar i,j;
- for(i=0;i<8;i++)
- for(j=0;j<10;j++)
- {
- if(map[guan-1][i][j]==0x07&&SB[i][j]!=0x02) //有目标且没有箱子
- {
- if(renh!=i||renl!=j) dishan(2*i,2*j,han[7]);
- }
- }
- }
- void game(uchar k) //游戏控制
- {
- if(k==1) //向上
- {
- if(SB[renh-1][renl]==0x00) //上面是空白
- {
- dishan(2*renh,2*renl,han[0]); //人原来的位置清0
- renh--; //上移一行
- dishan(2*renh,2*renl,han[1]); //人新位置显示
- bu++; //步数加1
- }
- else if((SB[renh-1][renl]==0x02)&&(SB[renh-2][renl]==0x00)) //上面是箱子,箱子上是空格
- {
- dishan(2*renh,2*renl,han[0]);dishan(2*(renh-1),2*renl,han[0]);
- renh--;
- dishan(2*renh,2*renl,han[1]);dishan(2*(renh-1),2*renl,han[2]);
- SB[renh][renl]=0x00;SB[renh-1][renl]=0x02;
- bu++;
- }
- }
- if(k==4)
- {
- if(SB[renh+1][renl]==0x00)
- {
- dishan(2*renh,2*renl,han[0]);
- renh++;
- dishan(2*renh,2*renl,han[1]);
- bu++;
- }
- else if((SB[renh+1][renl]==0x02)&&(SB[renh+2][renl]==0x00))
- {
- dishan(2*renh,2*renl,han[0]);dishan(2*(renh+1),2*renl,han[0]);
- renh++;
- dishan(2*renh,2*renl,han[1]);dishan(2*(renh+1),2*renl,han[2]);
- SB[renh][renl]=0x00;SB[renh+1][renl]=0x02;
- bu++;
- }
- }
- if(k==2)
- {
- if(SB[renh][renl-1]==0x00)
- {
- dishan(2*renh,2*renl,han[0]);
- renl--;
- dishan(2*renh,2*renl,han[1]);
- bu++;
- }
- else if((SB[renh][renl-1]==0x02)&&(SB[renh][renl-2]==0x00))
- {
- dishan(2*renh,2*renl,han[0]);dishan(2*renh,2*(renl-1),han[0]);
- renl--;
- dishan(2*renh,2*renl,han[1]);dishan(2*renh,2*(renl-1),han[2]);
- SB[renh][renl]=0x00;SB[renh][renl-1]=0x02;
- bu++;
- }
- }
- if(k==3)
- {
- if(SB[renh][renl+1]==0x00)
- {
- dishan(2*renh,2*renl,han[0]);
- renl++;
- dishan(2*renh,2*renl,han[1]);
- bu++;
- }
- else if((SB[renh][renl+1]==0x02)&&(SB[renh][renl+2]==0x00))
- {
- dishan(2*renh,2*renl,han[0]);dishan(2*renh,2*(renl+1),han[0]);
- renl++;
- dishan(2*renh,2*renl,han[1]);dishan(2*renh,2*(renl+1),han[2]);
- SB[renh][renl]=0x00;SB[renh][renl+1]=0x02;
- bu++;
- }
- }
- huintfumubiao();
- bushu();
- shengli();
- }
- void clear() //清屏
- {
- uchar i,j;
- for(i=0;i<8;i++)
- for(j=0;j<15;j++)
- {
- dishan(2*i,2*j,han[0]); //写0
- }
- }
- void keychuli(uchar k) //按键处理
- {
- if(k==5) {flag=0;disxg();goto over;} //键值为5,“选关”
- if(k==6) {flag=1;bu=0;renl=4;renh=6;clear();tupian();goto over;} //键值为5,“开始”
- if(k<5)
- {
- if(flag==0) xuanguan(k); //选关处理
- else game(k); //游戏控制
- }
- over:
- ;
- }
- void main()
- {
- uchar k;
- LCD24012864_init();
- disphz(14); //写入汉字
-
- tupian();
- while(1)
- {
- k=key();
- if(k!=0) keychuli(k);
- }
- }
- void wrdat(uchar dat) //写数据
- {
- cd=0;
- wr=0;
- P0=dat;
- wr=1;
- }
- void wrcmd(uchar cmd) //写命令
- {
- cd=1;
- wr=0;
- P0=cmd;
- wr=1;
- }
- void wrdcmd(uchar dat1, cmd) //写带有一个参数的命令
- {
- wrdat(dat1);
- wrcmd(cmd);
- }
- void lcddcmd(uchar dat1,dat2,cmd) //写带有两个参数的命令
- {
- wrdat(dat1);
- wrdat(dat2);
- wrcmd(cmd);
- }
- void LCD24012864_init()
- {
- ce=0;
- md=0;
- rst=1;
- lcddcmd(0x00,0x10,0x40); //设置文本显示区首地址
- lcddcmd(30,0x00,0x41); //设置文本显示区宽度
- lcddcmd(0x00,0x00,0x42); //设置图形显示区首地址
- lcddcmd(30,0x00,0x43); //设置图形显示区宽度
- wrcmd(0xa2); //设置光标形状
- wrcmd(0x80); //设置显示方式,文本图形“或”
- wrcmd(0x9e); //设置光标闪烁,不显示,文本与图形显示
- }
- void dischar(uchar hang,uchar lie,uchar cha) //写ASCII码字符,hang字符行(=8图形行),lie字符列(=8图形列),chaASCII码
- { //显示ASCII码时,16行x30列
- uint address;
- uchar dat1,dat2;
- address=hang*30+lie+0x1000; //计算文本显示区地址
- dat1=address;
- dat2=address>>8;
- lcddcmd(dat1,dat2,0x24);//地址指针定位
- wrdcmd(cha,0xc4); //写字符,地址指针不变
- }
- void delay() //延时
- {
- uint x;
- for(x=0;x<1000;x++);
- }
- void disxg() //显示选关提示
- {
- dishan(0,22,han[8]);
- dishan(0,24,han[9]);
- dishan(0,26,han[5]);
- disshu(0,28,shu[10]);
- }
- void disphz(uchar count) //count是要写的汉字个数 //数字和汉字代码写入自定义字符存储区
- {
- uint i;
- lcddcmd(0x03,0x00,0x22); //定义自定义字符(在GCRAM中)存储区字节地址高5位为0x03,
- lcddcmd(0x00,0x1c,0x24); //0x03<<11+0x0400=0x1c00(字节地址)
- for(i=0;i<16*8*12/8;i++)
- wrdcmd(shucode[i],0xc0); //写数字(每个16*8)*12(0-9,:)到GCRAM
- for(i=0;i<16*16*count/8;i++)
- wrdcmd(hancode[i],0xc0); //写汉字(每个16*16)*count到GCRAM
- }
- void dishan(uchar hang, lie,uchar bianma)//写汉字代码行,列,bianma汉字在自定义字符中的位置,
- {
- dischar(hang,lie,bianma);//每个汉字按左上,左下,右上,右下存放
- dischar(hang+1,lie,bianma+1);
- dischar(hang,lie+1,bianma+2);
- dischar(hang+1,lie+1,bianma+3);
- }
- void disshu(uchar hang, lie, bianma)//写数字汉字代码行,列,bianma汉字在自定义字符中的位置,
- {
- dischar(hang,lie,bianma);//每个汉字按左上,左下,右上,右下存放
- dischar(hang+1,lie,bianma+1);
- }
- uchar key() //检测按键
- {
- uchar x,k=0;
- P1=0xff;
- x=P1;
- if(x==0xff) //没按键跳出
- goto over;
- else
- {
- delay(); //有按键,延时
- P1=0xff;
- x=P1;
- if(x==0xff) //再测
- goto over;wait: //等待按键释放
- P1=0xff;
- x=P1;
- if(x==0xff) goto over;
- else goto wait;
- }
- }
- over:
- return k;
- }
复制代码
LCD240128搬货物.rar
(23.03 KB, 下载次数: 95)
|