久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3492|回復: 3
收起左側

單片機推箱子程序 LCD12864液晶顯示

[復制鏈接]
ID:33449 發表于 2018-11-3 10:40 | 顯示全部樓層 |閱讀模式
單片機推箱子源程序如下:
  1. #include<reg52.h>  
  2. #include<stdlib.h>  
  3. #include<stdio.h>  
  4. #include<intrins.h>  
  5. #define uchar unsigned char  
  6. #define uint  unsigned int  
  7.   
  8. sbit RS = P1^0;  
  9. sbit RW = P1^1;  
  10. sbit EN = P1^2;
  11. sbit psb=P1^3;
  12. sbit rst=P1^5;
  13.   
  14. sbit key_up = P2^1;  
  15. sbit key_down = P2^2;  
  16. sbit key_left = P2^0;  
  17. sbit key_right = P2^3;  
  18.   
  19. #define LCD_data P0  
  20. 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};  
  21.   
  22.   
  23. uchar code table1[]="LCD12864";  
  24. uchar code table2[]="推箱子";  
  25. uchar code table3[]="BY laoda";  
  26. uchar code table4[]="You Win!";  
  27.   
  28. uchar code tmp[]={//空格  
  29. 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff  
  30. };  
  31. /* 0表示空格,1表示墻,2表示人,3表示箱子,4表示目的地 */  
  32. uchar code mat[8][8]={  
  33. 1,1,1,1,1,1,1,1,  
  34. 1,1,1,1,0,2,1,1,  
  35. 1,1,0,0,3,0,1,1,  
  36. 1,1,0,1,0,1,1,1,  
  37. 1,0,0,1,0,1,4,1,  
  38. 1,0,1,0,0,3,4,1,  
  39. 1,0,3,0,0,0,4,1,  
  40. 1,1,1,1,1,1,1,1  
  41. };  
  42.   
  43. uchar map[8][8];  
  44.   
  45. uchar code Qiang[]={//方格,有間隙  
  46. 0xff,0x81,0x81,0x81,0x81,0x81,0x81,0xff  
  47. };  
  48.   
  49. uchar code Ren[]={//人  
  50. 0xff,0xff,0xe3,0xc5,0xb1,0xc5,0xe3,0xff  
  51. };  
  52.   
  53. uchar code Xiang[]={//箱子   
  54. 0xff,0x42,0x24,0x18,0x18,0x24,0x42,0xff   
  55. };  
  56.   
  57. uchar code Mudi[]={//目的地   
  58. 0xff,0xff,0xe7,0x81,0x81,0xe7,0xff,0xff   
  59. };  
  60.   
  61. void delay(uint i) //延時函數   
  62. {  
  63.     while(--i);  
  64. }  
  65.   
  66. void read_busy()//讀忙函數。每次讀寫都要進行讀忙操作   
  67. {  
  68.     RS=0;  
  69.     RW=1;  
  70.     EN=1;  
  71.     while(LCD_data & 0x80);//最高位為BF位 DB7---BF   
  72.     EN=0;  
  73. }  
  74.   
  75. void write_LCD_command(uchar value)//寫指令函數   
  76. {  
  77.     read_busy();  
  78.     RS=0;  
  79.     RW=0;  
  80.     EN=1;       //EN從1---0鎖存數據   
  81.     LCD_data=value;  
  82.     delay(20);  
  83.     EN=0;  
  84. }   
  85.   
  86. void write_LCD_data(uchar value)//寫數據函數   
  87. {  
  88.     read_busy();  
  89.     RS=1;  
  90.     RW=0;  
  91.     EN=1;       //EN從1---0鎖存數據   
  92.     LCD_data=value;  
  93.     delay(20);  
  94.     EN=0;  
  95. }   
  96. void init_BMP()   
  97. {  
  98.     write_LCD_command(0x36);//CL=1--8位。擴充指令(RE=1),繪圖打開(G=1)  
  99.     delay(100); //適當延時   
  100.     write_LCD_command(0x36);  
  101.     delay(37);  
  102.     write_LCD_command(0x3E);//8位(CL=1),擴充指令(RE=1),繪圖打開(G=1)   
  103.     delay(100);  
  104.     write_LCD_command(0x01);//清屏指令   
  105.     delay(100);  
  106. }  
  107.   
  108. void init_Hanzi()               //8位并口方式LCD1864初始化函數   
  109. {  
  110.     delay(4000);            //等待時間>40ms   
  111.     write_LCD_command(0x30);//功能設定:8位數據、基本指令操作   
  112.     delay(100);             //等待時間>100us   
  113.     write_LCD_command(0x30);//功能設定:8位數據、基本指令操作   
  114.     delay(37);              //等待時間>37us   
  115.     write_LCD_command(0x0C);//顯示設定:整體顯示、游標關、不反白   
  116.     delay(100);             // 等待時間>100us   
  117.     //write_LCD_command(0x01);//清屏指令   
  118.     //delay(10000);         //等待時間>10ms   
  119.     write_LCD_command(0x06);//進入點設定:地址指針加1   
  120. }  
  121.   
  122. void display_BMP(uchar fuck,uchar name1,uchar name2,uchar y,uchar x)      
  123. {  
  124.     uchar shit,i;  
  125.     if(fuck==0)shit=0x80;  
  126.     else shit=0x88;  
  127.     for(i=0;i<8;i++)      
  128.     {     
  129.         write_LCD_command(0x80+i+8*x);//先送垂直地址   
  130.         write_LCD_command(shit+y);  //再送水平地址 ----顯示圖片的上半部分   
  131.   
  132.         if(name1==0)    write_LCD_data(tmp[i]);  
  133.         else if(name1==1)   write_LCD_data(Qiang[i]);  
  134.         else if(name1==2)   write_LCD_data(Ren[i]);  
  135.         else if(name1==3)   write_LCD_data(Xiang[i]);  
  136.         else if(name1==4)   write_LCD_data(Mudi[i]);  
  137.   
  138.         if(name2==0)    write_LCD_data(tmp[i]);  
  139.         else if(name2==1)   write_LCD_data(Qiang[i]);  
  140.         else if(name2==2)   write_LCD_data(Ren[i]);  
  141.         else if(name2==3)   write_LCD_data(Xiang[i]);  
  142.         else if(name2==4)   write_LCD_data(Mudi[i]);  
  143.     }  
  144. }  
  145.   
  146. void show_map(){  
  147.     uchar i,j,x,y;  
  148.   
  149.     for(i=0;i<2;i++){  
  150.         for(j=0;j<4;j++){  
  151.             x=2*i; y=2*j;  
  152.             display_BMP(0,map[x][y],map[x][y+1],j,2*i);  
  153.             x=2*i+1; y=2*j;  
  154.             display_BMP(0,map[x][y],map[x][y+1],j,2*i+1);  
  155.         }  
  156.     }  
  157.   
  158.     for(i=2;i<4;i++){  
  159.         for(j=0;j<4;j++){  
  160.             x=2*i; y=2*j;  
  161.             display_BMP(1,map[x][y],map[x][y+1],j,2*(i-2));  
  162.             x=2*i+1; y=2*j;  
  163.             display_BMP(1,map[x][y],map[x][y+1],j,2*(i-2)+1);  
  164.         }  
  165.     }  
  166.   
  167.     init_Hanzi();         
  168.     write_LCD_command(0x80+4);  
  169.     for(i=0;i<8;i++)  
  170.     {  
  171.         write_LCD_data(table1[i]);  
  172.     }  
  173.     write_LCD_command(0x90+4);  
  174.     for(i=0;i<8;i++)  
  175.     {  
  176.         write_LCD_data(table2[i]);  
  177.     }  
  178.   
  179.     write_LCD_command(0x88+4);  
  180.     for(i=0;i<8;i++)  
  181.     {  
  182.         write_LCD_data(table3[i]);  
  183.     }  
  184.     delay(100);  
  185. }  
  186.   
  187. void clear()//圖形模式下,沒有清屏函數,手動全部送0                        
  188. {  
  189.     uchar i,j;  
  190.     for(i=0;i<32;i++){  
  191.         write_LCD_command(0x80+i);//先送垂直地址   
  192.         write_LCD_command(0x80);  //再送水平地址 ----顯示圖片的上半部分   
  193.         for(j=0;j<16;j++)write_LCD_data(0);  
  194.     }  
  195.     for(i=0;i<32;i++){  
  196.         write_LCD_command(0x80+i);  //先送垂直地址  
  197.         write_LCD_command(0x88);    //顯示圖片的下半部分   
  198.         for(j=0;j<16;j++)write_LCD_data(0);  
  199.     }  
  200. }  
  201.   
  202. uchar judge(int x,int y,int id){                            //id 表示方向數組的行標,0,1,2,3 分別表示上下左右  
  203.     int xx,yy,xxx,yyy;  
  204.     xx=x+dir[id][0]; yy=y+dir[id][1];  
  205.     if(map[xx][yy]==0 || map[xx][yy]==4)return 1;              //1表示前面是 空格 或者 目的地,就是可以直接移動  
  206.     else if(map[xx][yy]==1)return 0;                           //0表示無法移動  
  207.     else if(map[xx][yy]==3){  
  208.         xxx=xx+dir[id][0]; yyy=yy+dir[id][1];  
  209.         if(map[xxx][yyy]==1 || map[xxx][yyy]==3)return 0;  
  210.         else if(map[xxx][yyy]==0 || map[xxx][yyy]==4)return 2; //2表示需要間接移動,先把前面的箱子移動一,再讓人移動一  
  211.     }return 0;  
  212. }  
  213.   
  214. void update(uchar a,uchar b){  
  215.     uchar i,j,x,y;  
  216.   
  217.     write_LCD_command(0x3E);//8位(CL=1),擴充指令(RE=1),繪圖打開(G=1)   
  218.     delay(100);  
  219.   
  220.     if(a<4){  
  221.         i=a/2; j=b/2;  
  222.         x=2*i; y=2*j;  
  223.         display_BMP(0,map[x][y],map[x][y+1],j,2*i);  
  224.         x=2*i+1; y=2*j;  
  225.         display_BMP(0,map[x][y],map[x][y+1],j,2*i+1);  
  226.     }  
  227.     else {  
  228.         i=a/2; j=b/2;  
  229.         x=2*i; y=2*j;  
  230.         display_BMP(1,map[x][y],map[x][y+1],j,2*(i-2));  
  231.         x=2*i+1; y=2*j;  
  232.         display_BMP(1,map[x][y],map[x][y+1],j,2*(i-2)+1);  
  233.     }  
  234. }  
  235.   
  236. void fun(uchar key,uchar dirction){  
  237.     uchar x,y;  
  238.     /* 0表示空格,1表示墻,2表示人,3表示箱子,4表示目的地 */  
  239.     if(key==1){//直接移動  
  240.         if(mat[cur_x][cur_y]==4)map[cur_x][cur_y]=4;  
  241.         else map[cur_x][cur_y]=0;  
  242.         update(cur_x,cur_y);  
  243.   
  244.         cur_x+=dir[dirction][0]; cur_y+=dir[dirction][1];  
  245.         map[cur_x][cur_y]=2;  
  246.         update(cur_x,cur_y);  
  247.                      
  248.     }  
  249.     else if(key==2){//間接移動  
  250.         if(mat[cur_x][cur_y]==4)map[cur_x][cur_y]=4;  
  251.         else map[cur_x][cur_y]=0;  
  252.         update(cur_x,cur_y);  
  253.                      
  254.         cur_x+=dir[dirction][0]; cur_y+=dir[dirction][1];  
  255.         map[cur_x][cur_y]=2;  
  256.         update(cur_x,cur_y);  
  257.   
  258.         x=cur_x+dir[dirction][0]; y=cur_y+dir[dirction][1];  
  259.         map[x][y]=3;  
  260.         update(x,y);  
  261.     }  
  262. }  
  263.   
  264. void lcd_init(){  
  265.     uchar i,j;  
  266.   
  267.     init_BMP();  
  268.   
  269.     cur_x=1; cur_y=5;  
  270.     X=3;  
  271.       
  272.     for(i=0;i<8;i++){  
  273.         for(j=0;j<8;j++)map[i][j]=mat[i][j];  
  274.     }  
  275. }  
  276.   
  277. void main()  
  278. {  
  279.     uchar i,num,index=6;  
  280.     lcd_init();  
  281.     clear();  
  282.     show_map();
  283.         psb=1;
  284.         rst=1;
  285.   
  286.     /* 0表示空格,1表示墻,2表示人,3表示箱子,4表示目的地 */  
  287.     while(1){  
  288.         num=0;  
  289.         for(i=0;i<3;i++){  
  290.             if(map[ where[i][0] ][ where[0][1] ]==3)num++;  
  291.             else break;  
  292.         }  
  293.         if(num==X)goto WIN;  
  294.         if(key_up==0){  
  295.             delay(500);  
  296.             if(key_up==0){  
  297.                 index=judge(cur_x,cur_y,0);  
  298.                 fun(index,0);  
  299.             }while(!key_up);  
  300.         }  
  301.         else if(key_down==0){  
  302.             delay(500);  
  303.             if(key_down==0){  
  304.                 index=judge(cur_x,cur_y,1);  
  305.                 fun(index,1);  
  306.             }while(!key_down);  
  307.         }  
  308.         else if(key_left==0){  
  309.             delay(500);  
  310.             if(key_left==0){  
  311.                 index=judge(cur_x,cur_y,2);  
  312.                 fun(index,2);  
  313.             }while(!key_left);  
  314.         }  
  315.         else if(key_right==0){  
  316.             delay(500);  
  317.             if(key_right==0){  
  318.                 index=judge(cur_x,cur_y,3);  
  319.                 fun(index,3);  
  320.             }while(!key_right);  
  321.         }  
  322.     }  
  323. WIN:  
  324.     init_Hanzi();         
  325.   
  326.     write_LCD_command(0x98+4);  
  327.     for(i=0;i<8;i++)  
  328.     {  
  329.         write_LCD_data(table4[i]);  
  330.     }  
  331.     delay(1000);  
  332.     while(1);   
  333. }
復制代碼

全部資料51hei下載地址:
推箱子.rar (31 KB, 下載次數: 116)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:397663 發表于 2018-11-5 18:25 | 顯示全部樓層
好東西,謝樓主分享
回復

使用道具 舉報

ID:517444 發表于 2019-5-26 19:21 | 顯示全部樓層
真牛逼
回復

使用道具 舉報

ID:608600 發表于 2020-7-4 15:02 | 顯示全部樓層
感謝樓主好人一生平安
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一级日韩 | a级大片 | 国产精品久久视频 | 久久久这里都是精品 | 日韩中文在线观看 | av免费在线播放 | 久久九九影视 | 亚洲第一av | 毛片一级片 | www.日韩| 久久久久久国产精品免费免费 | 精品视频一区二区 | 国产午夜精品一区二区三区 | 国产91在线播放 | 亚洲视频一区二区三区 | 久久精品女人天堂av | 中文字幕精品一区二区三区精品 | 精品一级 | 午夜国产一区 | 亚卅毛片 | 亚洲三区在线播放 | 欧美国产一区二区 | 婷婷在线免费 | 91精品国产一区二区三区香蕉 | 色必久久 | 欧美成人精品激情在线观看 | 亚洲三区在线观看 | 中文字幕在线一区二区三区 | 国产精品久久久久久久久久久久久久 | 天天操网| 精品视频一区二区三区四区 | 亚洲精品自在在线观看 | 国产精品夜夜春夜夜爽久久电影 | 国产性网 | 天天精品在线 | 日韩第1页| 日韩久久久久久 | 国产综合网站 | 国产一区2区 | 日日干干 | 久久久网|