|
單片機(jī)推箱子源程序如下:
- #include<reg52.h>
- #include<stdlib.h>
- #include<stdio.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit RS = P1^0;
- sbit RW = P1^1;
- sbit EN = P1^2;
- sbit psb=P1^3;
- sbit rst=P1^5;
-
- sbit key_up = P2^1;
- sbit key_down = P2^2;
- sbit key_left = P2^0;
- sbit key_right = P2^3;
-
- #define LCD_data P0
- int cur_x,cur_y,X,dir[4][2]={-1,0,1,0,0,-1,0,1},where[3][2]={4,6,5,6,6,6};
-
-
- uchar code table1[]="LCD12864";
- uchar code table2[]="推箱子";
- uchar code table3[]="BY laoda";
- uchar code table4[]="You Win!";
-
- uchar code tmp[]={//空格
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
- };
- /* 0表示空格,1表示墻,2表示人,3表示箱子,4表示目的地 */
- uchar code mat[8][8]={
- 1,1,1,1,1,1,1,1,
- 1,1,1,1,0,2,1,1,
- 1,1,0,0,3,0,1,1,
- 1,1,0,1,0,1,1,1,
- 1,0,0,1,0,1,4,1,
- 1,0,1,0,0,3,4,1,
- 1,0,3,0,0,0,4,1,
- 1,1,1,1,1,1,1,1
- };
-
- uchar map[8][8];
-
- uchar code Qiang[]={//方格,有間隙
- 0xff,0x81,0x81,0x81,0x81,0x81,0x81,0xff
- };
-
- uchar code Ren[]={//人
- 0xff,0xff,0xe3,0xc5,0xb1,0xc5,0xe3,0xff
- };
-
- uchar code Xiang[]={//箱子
- 0xff,0x42,0x24,0x18,0x18,0x24,0x42,0xff
- };
-
- uchar code Mudi[]={//目的地
- 0xff,0xff,0xe7,0x81,0x81,0xe7,0xff,0xff
- };
-
- void delay(uint i) //延時函數(shù)
- {
- while(--i);
- }
-
- void read_busy()//讀忙函數(shù)。每次讀寫都要進(jìn)行讀忙操作
- {
- RS=0;
- RW=1;
- EN=1;
- while(LCD_data & 0x80);//最高位為BF位 DB7---BF
- EN=0;
- }
-
- void write_LCD_command(uchar value)//寫指令函數(shù)
- {
- read_busy();
- RS=0;
- RW=0;
- EN=1; //EN從1---0鎖存數(shù)據(jù)
- LCD_data=value;
- delay(20);
- EN=0;
- }
-
- void write_LCD_data(uchar value)//寫數(shù)據(jù)函數(shù)
- {
- read_busy();
- RS=1;
- RW=0;
- EN=1; //EN從1---0鎖存數(shù)據(jù)
- LCD_data=value;
- delay(20);
- EN=0;
- }
- void init_BMP()
- {
- write_LCD_command(0x36);//CL=1--8位。擴(kuò)充指令(RE=1),繪圖打開(G=1)
- delay(100); //適當(dāng)延時
- write_LCD_command(0x36);
- delay(37);
- write_LCD_command(0x3E);//8位(CL=1),擴(kuò)充指令(RE=1),繪圖打開(G=1)
- delay(100);
- write_LCD_command(0x01);//清屏指令
- delay(100);
- }
-
- void init_Hanzi() //8位并口方式LCD1864初始化函數(shù)
- {
- delay(4000); //等待時間>40ms
- write_LCD_command(0x30);//功能設(shè)定:8位數(shù)據(jù)、基本指令操作
- delay(100); //等待時間>100us
- write_LCD_command(0x30);//功能設(shè)定:8位數(shù)據(jù)、基本指令操作
- delay(37); //等待時間>37us
- write_LCD_command(0x0C);//顯示設(shè)定:整體顯示、游標(biāo)關(guān)、不反白
- delay(100); // 等待時間>100us
- //write_LCD_command(0x01);//清屏指令
- //delay(10000); //等待時間>10ms
- write_LCD_command(0x06);//進(jìn)入點(diǎn)設(shè)定:地址指針加1
- }
-
- void display_BMP(uchar fuck,uchar name1,uchar name2,uchar y,uchar x)
- {
- uchar shit,i;
- if(fuck==0)shit=0x80;
- else shit=0x88;
- for(i=0;i<8;i++)
- {
- write_LCD_command(0x80+i+8*x);//先送垂直地址
- write_LCD_command(shit+y); //再送水平地址 ----顯示圖片的上半部分
-
- if(name1==0) write_LCD_data(tmp[i]);
- else if(name1==1) write_LCD_data(Qiang[i]);
- else if(name1==2) write_LCD_data(Ren[i]);
- else if(name1==3) write_LCD_data(Xiang[i]);
- else if(name1==4) write_LCD_data(Mudi[i]);
-
- if(name2==0) write_LCD_data(tmp[i]);
- else if(name2==1) write_LCD_data(Qiang[i]);
- else if(name2==2) write_LCD_data(Ren[i]);
- else if(name2==3) write_LCD_data(Xiang[i]);
- else if(name2==4) write_LCD_data(Mudi[i]);
- }
- }
-
- void show_map(){
- uchar i,j,x,y;
-
- for(i=0;i<2;i++){
- for(j=0;j<4;j++){
- x=2*i; y=2*j;
- display_BMP(0,map[x][y],map[x][y+1],j,2*i);
- x=2*i+1; y=2*j;
- display_BMP(0,map[x][y],map[x][y+1],j,2*i+1);
- }
- }
-
- for(i=2;i<4;i++){
- for(j=0;j<4;j++){
- x=2*i; y=2*j;
- display_BMP(1,map[x][y],map[x][y+1],j,2*(i-2));
- x=2*i+1; y=2*j;
- display_BMP(1,map[x][y],map[x][y+1],j,2*(i-2)+1);
- }
- }
-
- init_Hanzi();
- write_LCD_command(0x80+4);
- for(i=0;i<8;i++)
- {
- write_LCD_data(table1[i]);
- }
- write_LCD_command(0x90+4);
- for(i=0;i<8;i++)
- {
- write_LCD_data(table2[i]);
- }
-
- write_LCD_command(0x88+4);
- for(i=0;i<8;i++)
- {
- write_LCD_data(table3[i]);
- }
- delay(100);
- }
-
- void clear()//圖形模式下,沒有清屏函數(shù),手動全部送0
- {
- uchar i,j;
- for(i=0;i<32;i++){
- write_LCD_command(0x80+i);//先送垂直地址
- write_LCD_command(0x80); //再送水平地址 ----顯示圖片的上半部分
- for(j=0;j<16;j++)write_LCD_data(0);
- }
- for(i=0;i<32;i++){
- write_LCD_command(0x80+i); //先送垂直地址
- write_LCD_command(0x88); //顯示圖片的下半部分
- for(j=0;j<16;j++)write_LCD_data(0);
- }
- }
-
- uchar judge(int x,int y,int id){ //id 表示方向數(shù)組的行標(biāo),0,1,2,3 分別表示上下左右
- int xx,yy,xxx,yyy;
- xx=x+dir[id][0]; yy=y+dir[id][1];
- if(map[xx][yy]==0 || map[xx][yy]==4)return 1; //1表示前面是 空格 或者 目的地,就是可以直接移動
- else if(map[xx][yy]==1)return 0; //0表示無法移動
- else if(map[xx][yy]==3){
- xxx=xx+dir[id][0]; yyy=yy+dir[id][1];
- if(map[xxx][yyy]==1 || map[xxx][yyy]==3)return 0;
- else if(map[xxx][yyy]==0 || map[xxx][yyy]==4)return 2; //2表示需要間接移動,先把前面的箱子移動一,再讓人移動一
- }return 0;
- }
-
- void update(uchar a,uchar b){
- uchar i,j,x,y;
-
- write_LCD_command(0x3E);//8位(CL=1),擴(kuò)充指令(RE=1),繪圖打開(G=1)
- delay(100);
-
- if(a<4){
- i=a/2; j=b/2;
- x=2*i; y=2*j;
- display_BMP(0,map[x][y],map[x][y+1],j,2*i);
- x=2*i+1; y=2*j;
- display_BMP(0,map[x][y],map[x][y+1],j,2*i+1);
- }
- else {
- i=a/2; j=b/2;
- x=2*i; y=2*j;
- display_BMP(1,map[x][y],map[x][y+1],j,2*(i-2));
- x=2*i+1; y=2*j;
- display_BMP(1,map[x][y],map[x][y+1],j,2*(i-2)+1);
- }
- }
-
- void fun(uchar key,uchar dirction){
- uchar x,y;
- /* 0表示空格,1表示墻,2表示人,3表示箱子,4表示目的地 */
- if(key==1){//直接移動
- if(mat[cur_x][cur_y]==4)map[cur_x][cur_y]=4;
- else map[cur_x][cur_y]=0;
- update(cur_x,cur_y);
-
- cur_x+=dir[dirction][0]; cur_y+=dir[dirction][1];
- map[cur_x][cur_y]=2;
- update(cur_x,cur_y);
-
- }
- else if(key==2){//間接移動
- if(mat[cur_x][cur_y]==4)map[cur_x][cur_y]=4;
- else map[cur_x][cur_y]=0;
- update(cur_x,cur_y);
-
- cur_x+=dir[dirction][0]; cur_y+=dir[dirction][1];
- map[cur_x][cur_y]=2;
- update(cur_x,cur_y);
-
- x=cur_x+dir[dirction][0]; y=cur_y+dir[dirction][1];
- map[x][y]=3;
- update(x,y);
- }
- }
-
- void lcd_init(){
- uchar i,j;
-
- init_BMP();
-
- cur_x=1; cur_y=5;
- X=3;
-
- for(i=0;i<8;i++){
- for(j=0;j<8;j++)map[i][j]=mat[i][j];
- }
- }
-
- void main()
- {
- uchar i,num,index=6;
- lcd_init();
- clear();
- show_map();
- psb=1;
- rst=1;
-
- /* 0表示空格,1表示墻,2表示人,3表示箱子,4表示目的地 */
- while(1){
- num=0;
- for(i=0;i<3;i++){
- if(map[ where[i][0] ][ where[0][1] ]==3)num++;
- else break;
- }
- if(num==X)goto WIN;
- if(key_up==0){
- delay(500);
- if(key_up==0){
- index=judge(cur_x,cur_y,0);
- fun(index,0);
- }while(!key_up);
- }
- else if(key_down==0){
- delay(500);
- if(key_down==0){
- index=judge(cur_x,cur_y,1);
- fun(index,1);
- }while(!key_down);
- }
- else if(key_left==0){
- delay(500);
- if(key_left==0){
- index=judge(cur_x,cur_y,2);
- fun(index,2);
- }while(!key_left);
- }
- else if(key_right==0){
- delay(500);
- if(key_right==0){
- index=judge(cur_x,cur_y,3);
- fun(index,3);
- }while(!key_right);
- }
- }
- WIN:
- init_Hanzi();
-
- write_LCD_command(0x98+4);
- for(i=0;i<8;i++)
- {
- write_LCD_data(table4[i]);
- }
- delay(1000);
- while(1);
- }
復(fù)制代碼
全部資料51hei下載地址:
推箱子.rar
(31 KB, 下載次數(shù): 116)
2018-11-3 10:40 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|