0001.jpg (118.8 KB, 下載次數: 39)
下載附件
2020-4-2 10:22 上傳
單片機源程序如下:
- #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)
2020-4-2 10:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|