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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3462|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)推箱子程序 LCD12864液晶顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:33449 發(fā)表于 2018-11-3 10:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機(jī)推箱子源程序如下:
  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) //延時函數(shù)   
  62. {  
  63.     while(--i);  
  64. }  
  65.   
  66. void read_busy()//讀忙函數(shù)。每次讀寫都要進(jìn)行讀忙操作   
  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)//寫指令函數(shù)   
  76. {  
  77.     read_busy();  
  78.     RS=0;  
  79.     RW=0;  
  80.     EN=1;       //EN從1---0鎖存數(shù)據(jù)   
  81.     LCD_data=value;  
  82.     delay(20);  
  83.     EN=0;  
  84. }   
  85.   
  86. void write_LCD_data(uchar value)//寫數(shù)據(jù)函數(shù)   
  87. {  
  88.     read_busy();  
  89.     RS=1;  
  90.     RW=0;  
  91.     EN=1;       //EN從1---0鎖存數(shù)據(jù)   
  92.     LCD_data=value;  
  93.     delay(20);  
  94.     EN=0;  
  95. }   
  96. void init_BMP()   
  97. {  
  98.     write_LCD_command(0x36);//CL=1--8位。擴(kuò)充指令(RE=1),繪圖打開(G=1)  
  99.     delay(100); //適當(dāng)延時   
  100.     write_LCD_command(0x36);  
  101.     delay(37);  
  102.     write_LCD_command(0x3E);//8位(CL=1),擴(kuò)充指令(RE=1),繪圖打開(G=1)   
  103.     delay(100);  
  104.     write_LCD_command(0x01);//清屏指令   
  105.     delay(100);  
  106. }  
  107.   
  108. void init_Hanzi()               //8位并口方式LCD1864初始化函數(shù)   
  109. {  
  110.     delay(4000);            //等待時間>40ms   
  111.     write_LCD_command(0x30);//功能設(shè)定:8位數(shù)據(jù)、基本指令操作   
  112.     delay(100);             //等待時間>100us   
  113.     write_LCD_command(0x30);//功能設(shè)定:8位數(shù)據(jù)、基本指令操作   
  114.     delay(37);              //等待時間>37us   
  115.     write_LCD_command(0x0C);//顯示設(shè)定:整體顯示、游標(biāo)關(guān)、不反白   
  116.     delay(100);             // 等待時間>100us   
  117.     //write_LCD_command(0x01);//清屏指令   
  118.     //delay(10000);         //等待時間>10ms   
  119.     write_LCD_command(0x06);//進(jìn)入點(diǎn)設(shè)定:地址指針加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()//圖形模式下,沒有清屏函數(shù),手動全部送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 表示方向數(shù)組的行標(biāo),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),擴(kuò)充指令(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. }
復(fù)制代碼

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


評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:397663 發(fā)表于 2018-11-5 18:25 | 只看該作者
好東西,謝樓主分享
回復(fù)

使用道具 舉報

板凳
ID:517444 發(fā)表于 2019-5-26 19:21 | 只看該作者
真牛逼
回復(fù)

使用道具 舉報

地板
ID:608600 發(fā)表于 2020-7-4 15:02 | 只看該作者
感謝樓主好人一生平安
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 丁香久久 | 久久久久久久久久久久91 | 久久精品网 | 国产欧美精品一区二区 | 国产精品国产三级国产aⅴ无密码 | 亚洲视频在线观看一区二区三区 | 国产欧美一区二区三区日本久久久 | 免费一级片 | 日本一二三区高清 | 中文精品视频 | 成人免费观看男女羞羞视频 | 毛片在线免费 | 久久日韩粉嫩一区二区三区 | 亚洲综合无码一区二区 | 精品免费国产一区二区三区四区介绍 | 精品96久久久久久中文字幕无 | 日韩2020狼一二三 | 91精品久久久久久久久久入口 | 日韩成人免费视频 | 操皮视频 | wwwxxx国产| 亚洲天堂免费在线 | 黄色一级网 | 国产一区二区三区在线 | 国产精品伦一区二区三级视频 | 国产粉嫩尤物极品99综合精品 | 人人做人人澡人人爽欧美 | 伊人网站视频 | 国产精品一区二区在线观看 | 一区欧美 | 天天综合网天天综合色 | 亚洲第一视频网站 | 精品日韩一区 | 国产精品久久久久一区二区三区 | 一区二区三区在线 | 久久在线 | 欧美性生活网 | 久久久精彩视频 | 在线电影日韩 | 国产精品一区二区三区在线 | 欧美日韩一 |