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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6414|回復: 1
打印 上一主題 下一主題
收起左側

51單片機制作的推箱子游戲 PG160128A液晶顯示 帶源碼與仿真(共9關)

[復制鏈接]
跳轉到指定樓層
樓主
ID:192257 發(fā)表于 2017-4-24 12:46 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
推箱子游戲設計資料


PG160128A液晶屏初始化源代碼(51單片機):
  1. #define uchar unsigned char
  2. #define LCD_CHAR 0x14

  3. sbit cd = P3^0;                /*通道選擇*/
  4. sbit rd = P3^1;                /*讀操作信號*/
  5. sbit wr = P3^2;                /*寫操作信號*/
  6. sbit error0 = P1^5;  /*出錯提示1*/
  7. sbit error1 = P1^6;  /*出錯提示2*/
  8. sbit error2 = P1^7;  /*出錯提示3*/

  9. /*讀狀態(tài)*/
  10. uchar read_state(){
  11.         uchar temp;
  12.         P2 = 0xff;
  13.         cd = 1;
  14.         rd = 0;
  15.         temp = P2;
  16.         rd = 1;
  17.         return(temp);
  18. }

  19. /*STA0指令讀寫狀態(tài),STA1數據讀寫狀態(tài) 判斷函數*/
  20. void lcd_enable(){
  21.         uchar i;
  22.         for(i = 10; i > 0; i--)
  23.                 if((read_state() & 0x03) == 0x03)
  24.                         break;
  25.         if(i==0)error0=1;/*若i==0,說明錯誤*/
  26.         //else error0=0;
  27. }

  28. /*STA2數據自動讀狀態(tài) 判斷函數*/
  29. void atrd_enable(){
  30.         uchar i;
  31.         for(i = 10; i > 0; i--)
  32.                 if((read_state() & 0x04) == 0x04)
  33.                         break;
  34.         if(i==0)error1=1;/*若i==0,說明錯誤*/
  35.         //else error1=0;
  36. }

  37. /*STA3數據自動寫狀態(tài) 判斷函數*/
  38. void atwr_enable(){
  39.         uchar i;
  40.         for(i = 10; i > 0; i--)
  41.                 if((read_state() & 0x08) == 0x08)
  42.                         break;
  43.         if(i==0)error2=1;/*若i==0,說明錯誤*/
  44.         //else error2=0;
  45. }

  46. /*寫無參數函數*/
  47. void write_cmd0(uchar cmd){
  48.         lcd_enable();
  49.         cd=1;
  50.         P2=cmd;
  51.         wr=0;
  52.         wr=1;
  53. }

  54. /*寫單參數函數*/
  55. void write_cmd1(uchar data1, uchar cmd){
  56.         lcd_enable();
  57.         cd=0;
  58.         P2=data1;
  59.         wr=0;
  60.         wr=1;
  61.         lcd_enable();
  62.         cd=1;
  63.         P2=cmd;
  64.         wr=0;
  65.         wr=1;
  66. }

  67. /*寫雙參數函數*/
  68. void write_cmd2(uchar data1, uchar data2, uchar cmd){
  69.         lcd_enable();
  70.         cd=0;
  71.         P2=data1;
  72.         wr=0;
  73.         wr=1;
  74.         lcd_enable();
  75.         cd=0;
  76.         P2=data2;
  77.         wr=0;
  78.         wr=1;       
  79.         lcd_enable();
  80.         cd=1;
  81.         P2=cmd;
  82.         wr=0;
  83.         wr=1;       
  84. }

  85. /*寫數據函數*/
  86. void write_data(uchar data0){
  87.         lcd_enable();
  88.         cd=1;
  89.         P2=data0;
  90.         wr=0;
  91.         wr=1;       
  92. }

  93. /*讀數據函數*/
  94. uchar read_data(){
  95.         char temp;
  96.         lcd_enable();
  97.         cd = 0;
  98.         P2 = 0xff;
  99.         rd = 0;
  100.         temp = P2;
  101.         rd = 1;
  102.         return(temp);        /*若返回0,可能錯誤*/
  103. }

  104. /*自動寫開始*/
  105. void auto_write(){
  106.         write_cmd0(AUT_WR);
  107. }

  108. /*自動讀開始*/
  109. void auto_read(){
  110.         write_cmd0(AUT_RD);
  111. }

  112. /*自動寫結束*/
  113. void atwr_stop(){
  114.         write_cmd0(AUT_WO);
  115. }

  116. /*自動讀結束*/
  117. void atrd_stop(){
  118.         write_cmd0(AUT_RO);
  119. }

  120. /*數據一次寫函數*/
  121. void write_one(uchar data1, char way){
  122.         atwr_enable();
  123.         auto_write();
  124.         write_cmd1(data1,way);
  125.         atwr_stop();
  126. }

  127. /*數據一次讀函數*/
  128. uchar read_one(char way){
  129.         uchar temp;
  130.         atrd_enable();
  131.         auto_read();
  132.         write_cmd0(way);
  133.         temp = read_data();
  134.         atrd_stop();
  135.         return(temp);
  136. }

  137. /*設置當前顯示位置函數x,y從0開始表示單位為字符*/
  138. void set_xy(uchar x, uchar y){
  139.         int temp;
  140.         temp = y * LCD_CHAR + x;
  141.         write_cmd2(temp&0xff,temp/0xff,ADR_POS);                       
  142. }

  143. void set_adr(uchar D1, uchar D2){
  144.         write_cmd2(D1,D2,ADR_POS);
  145. }

  146. /*設置光標指針 x,y從0開始*/
  147. void set_cur(char x, char y){
  148.         write_cmd2(x,y,CUR_POS);
  149. }

  150. /*CGRAM偏置地址設置函數*/
  151. void set_cgram(){
  152.         write_cmd2(0x01,0x00,CGR_POS);//0000,1100,0000,0000 0C00
  153. }

  154. /*液晶初始化函數(文本區(qū)首地址D1,文本區(qū)首地址D2, 文本區(qū)寬度,  圖形區(qū)首地址D1, 圖形區(qū)首地址D2, 圖形區(qū)寬度,   光標形狀,  顯示方式,  顯示開關)*/
  155. void lcd_init(uchar txtstpd1, uchar txtstpd2, uchar txtwid, uchar grhstpd1, uchar grhstpd2, uchar grhwid, uchar cur, uchar mod, uchar sw){
  156.         write_cmd2(txtstpd1,txtstpd2,TXT_STP);                                                                /*文本區(qū)首地址*/
  157.         write_cmd2(txtwid,0x00,TXT_WID);                        /*文本區(qū)寬度*/
  158.         write_cmd2(grhstpd1,grhstpd2,GRH_STP);                /*圖形區(qū)首地址*/
  159.         write_cmd2(grhwid,0x00,GRH_WID);                        /*圖形區(qū)寬度*/
  160.         write_cmd0(CUR_SHP | cur);                                        /*光標形狀*/
  161.         write_cmd0(mod);                                                        /*顯示方式*/
  162.         write_cmd0(DIS_SW | sw);                                        /*顯示開關*/
  163. }
復制代碼


部分源碼預覽:
  1. /*獲取當前行,列*/
  2. /*設置當前行,列*/
  3. uchar g=0;
  4. void delay(int c){
  5.         int i, j;
  6.         for(i = 0; i < c; i++)
  7.                 for(j = 0; j < 1000; j++);
  8. }

  9. /*清屏 320 = (160/8) * (128/8) = 20 * 16 = 320*/
  10. void cls(void){
  11.         int i;
  12.         set_xy(0,0);
  13.         for(i = 0; i < 320; i++)
  14.                 write_one(0x94,INC_WR);
  15. }


  16. uchar curx,cury;        /*紀錄當前人物所在位置*/

  17. uchar level_temp[8][8]={
  18.         0,0,0,0,0,0,0,0,
  19.         0,0,0,0,0,0,0,0,
  20.         0,0,0,0,0,0,0,0,
  21.         0,0,0,0,0,0,0,0,
  22.         0,0,0,0,0,0,0,0,
  23.         0,0,0,0,0,0,0,0,
  24.         0,0,0,0,0,0,0,0,
  25.         0,0,0,0,0,0,0,0,
  26. };


  27. void wirte_bg(void){
  28.         int i;
  29.         set_adr(0x50,0x01);
  30.         for(i = 0; i < 2560; i++)
  31.                 write_one(bg[i],INC_WR);
  32. }

  33. void wirte_cgrom(void){
  34.         int i;
  35. //        set_adr(0x50,0x01);
  36. //        for(i = 0; i < 2560; i++)
  37. //                write_one(0xff,INC_WR);
  38.         set_adr(0x00,0x0c);
  39.         /*自定義字符寫入CGROM*/
  40.         for(i = 0; i < 848; i++)
  41.                 write_one(Lattice[i],INC_WR);
  42. }

  43. void start(void){
  44.         uchar i;
  45.         set_xy(0,0);
  46.         for(i=0;i<20;i++)
  47.                 write_one(0x95,INC_WR);
  48.         set_xy(0,15);
  49.         for(i=0;i<20;i++)
  50.                 write_one(0x95,INC_WR);
  51.         for(i=0;i<15;i++){
  52.                 set_xy(0,i);
  53.                 write_one(0x95,INC_WR);
  54.                 set_xy(19,i);
  55.                 write_one(0x95,INC_WR);
  56.         }
  57.         set_xy(18,1);
  58.         write_one(0x96,INC_WR);
  59.         set_xy(18,14);
  60.         write_one(0x97,INC_WR);
  61.         set_xy(1,1);
  62.         write_one(0x98,INC_WR);
  63.         set_xy(1,14);
  64.         write_one(0x99,INC_WR);

  65.         set_xy(7,6);
  66.         write_one(0xaa,INC_WR);
  67.         write_one(0xab,INC_WR);
  68.         write_one(0xae,INC_WR);
  69.         write_one(0xaf,INC_WR);
  70.         write_one(0xb2,INC_WR);
  71.         write_one(0xb3,INC_WR);
  72.         set_xy(7,7);
  73.         write_one(0xac,INC_WR);
  74.         write_one(0xad,INC_WR);
  75.         write_one(0xb0,INC_WR);
  76.         write_one(0xb1,INC_WR);
  77.         write_one(0xb4,INC_WR);
  78.         write_one(0xb5,INC_WR);

  79.         set_xy(6,8);
  80.         write_one(0x9a,INC_WR);
  81.         write_one(0x9b,INC_WR);
  82.         write_one(0x9e,INC_WR);
  83.         write_one(0x9f,INC_WR);
  84.         write_one(0xa2,INC_WR);
  85.         write_one(0xa3,INC_WR);
  86.         write_one(0xa6,INC_WR);
  87.         write_one(0xa7,INC_WR);
  88.         set_xy(6,9);
  89.         write_one(0x9c,INC_WR);
  90.         write_one(0x9d,INC_WR);
  91.         write_one(0xa0,INC_WR);
  92.         write_one(0xa1,INC_WR);
  93.         write_one(0xa4,INC_WR);
  94.         write_one(0xa5,INC_WR);
  95.         write_one(0xa8,INC_WR);
  96.         write_one(0xa9,INC_WR);
  97.         while(i){                        /*此while語句判斷確定鍵超級技巧*/
  98.                 switch(P1&0x1f){
  99.                         case 0x0f:
  100.                                 i=0;
  101.                                 break;                               
  102.                 }
  103.         }
  104. }


  105. void guan(void){
  106.         /*推*/       
  107.         set_xy(16,0);
  108.         write_one(0xaa,INC_WR);
  109.         write_one(0xab,INC_WR);
  110.         set_xy(16,1);
  111.         write_one(0xac,INC_WR);
  112.         write_one(0xad,INC_WR);
  113.         /*箱*/
  114.         set_xy(16,2);
  115.         write_one(0xae,INC_WR);
  116.         write_one(0xaf,INC_WR);
  117.         set_xy(16,3);
  118.         write_one(0xb0,INC_WR);
  119.         write_one(0xb1,INC_WR);
  120.         /*子*/
  121.         set_xy(16,4);
  122.         write_one(0xb2,INC_WR);
  123.         write_one(0xb3,INC_WR);
  124.         set_xy(16,5);
  125.         write_one(0xb4,INC_WR);
  126.         write_one(0xb5,INC_WR);       
  127.         /*第*/
  128.         set_xy(16,8);
  129.         write_one(0xd2,INC_WR);
  130.         write_one(0xd3,INC_WR);       
  131.         set_xy(16,9);
  132.         write_one(0xd4,INC_WR);
  133.         write_one(0xd5,INC_WR);
  134.         /*幾*/       
  135.         set_xy(16,10);
  136.         write_one(0xd6,INC_WR);
  137.         write_one(0xd6+2*(g+1),INC_WR);       
  138.         set_xy(16,11);
  139.         write_one(0xd7,INC_WR);
  140.         write_one(0xd7+2*(g+1),INC_WR);
  141.         /*關*/       
  142.         set_xy(16,12);
  143.         write_one(0xce,INC_WR);
  144.         write_one(0xcf,INC_WR);       
  145.         set_xy(16,13);
  146.         write_one(0xd0,INC_WR);
  147.         write_one(0xd1,INC_WR);
  148.         /*阿*/
  149.         set_xy(18,0);
  150.         write_one(0x9a,INC_WR);
  151.         write_one(0x9b,INC_WR);       
  152.         set_xy(18,1);
  153.         write_one(0x9c,INC_WR);
  154.         write_one(0x9d,INC_WR);
  155.         /*С*/       
  156.         set_xy(18,2);
  157.         write_one(0x9e,INC_WR);
  158.         write_one(0x9f,INC_WR);       
  159.         set_xy(18,3);
  160.         write_one(0xa0,INC_WR);
  161.         write_one(0xa1,INC_WR);
  162.         /*制*/       
  163.         set_xy(18,4);
  164.         write_one(0xa2,INC_WR);
  165.         write_one(0xa3,INC_WR);       
  166.         set_xy(18,5);
  167.         write_one(0xa4,INC_WR);
  168.         write_one(0xa5,INC_WR);
  169.         /*作*/       
  170.         set_xy(18,6);
  171.         write_one(0xa6,INC_WR);
  172.         write_one(0xa7,INC_WR);       
  173.         set_xy(18,7);
  174.         write_one(0xa8,INC_WR);
  175.         write_one(0xa9,INC_WR);
  176. }




  177. void printc(uchar i, uchar j, uchar c){
  178.         set_xy(i*2,j*2);
  179.         switch(c){       
  180.                 case 0:
  181.                            write_one(0x94,INC_WR);
  182.                            write_one(0x94,INC_WR);
  183.                            set_xy(i*2,j*2+1);
  184.                            write_one(0x94,INC_WR);
  185.                            write_one(0x94,INC_WR);
  186.                            break;                                          
  187.                 case 1:                /*人物1*/
  188.                            write_one(0x80,INC_WR);
  189.                            write_one(0x81,INC_WR);
  190.                            set_xy(i*2,j*2+1);
  191.                            write_one(0x82,INC_WR);
  192.                            write_one(0x83,INC_WR);
  193.                            break;
  194.                 case 2:                /*磚頭2*/
  195.                            write_one(0x84,INC_WR);
  196.                            write_one(0x85,INC_WR);
  197.                            set_xy(i*2,j*2+1);
  198.                            write_one(0x86,INC_WR);
  199.                            write_one(0x87,INC_WR);
  200.                            break;
  201.                 case 3:                /*箱子3*/
  202.                            write_one(0x88,INC_WR);
  203.                            write_one(0x89,INC_WR);
  204.                            set_xy(i*2,j*2+1);
  205.                            write_one(0x8a,INC_WR);
  206.                            write_one(0x8b,INC_WR);
  207.                            break;
  208.                 case 4:                /*目的4*/
  209.                            write_one(0x8c,INC_WR);
  210.                            write_one(0x8d,INC_WR);
  211.                            set_xy(i*2,j*2+1);
  212.                            write_one(0x8e,INC_WR);
  213.                            write_one(0x8f,INC_WR);
  214.                            break;
  215.                 case 5:                /*成功5*/
  216.                            write_one(0x90,INC_WR);
  217.                            write_one(0x91,INC_WR);
  218.                            set_xy(i*2,j*2+1);
  219.                            write_one(0x92,INC_WR);
  220.                            write_one(0x93,INC_WR);
  221.                            break;
  222.         }
  223.        
  224. }



  225. void pushbox(){
  226.         uchar i,j;
  227.         /*根據level.h中的值進行輸出單個字符點陣為16*16,顯示8*8個字符*/
  228.         for(i = 0; i < 8; i++)
  229.                 for(j = 0; j < 8; j++){
  230.                         level_temp[i][j]=level[g][j][i];
  231.                         switch(level_temp[i][j]){       
  232.                                 case 0:
  233.                                            printc(i,j,0);
  234.                                            break;                                          
  235.                                 case 1:                /*人物1*/
  236.                                            curx=i;
  237.                                            cury=j;
  238.                                            printc(i,j,1);
  239.                                            break;
  240.                                 case 2:                /*磚頭2*/
  241.                                            printc(i,j,2);
  242.                                            break;
  243.                                 case 3:                /*箱子3*/
  244.                                            printc(i,j,3);
  245.                                            break;
  246.                                 case 4:                /*目的4*/
  247.                                            printc(i,j,4);
  248.                                            break;
  249.                                 case 5:                /*成功5*/
  250.                                           



  251. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


下載:
推箱子.zip (75.42 KB, 下載次數: 60)

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:194355 發(fā)表于 2017-4-27 20:53 | 只看該作者
怎么修改某某制作?
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频一区在线观看 | 祝你幸福电影在线观看 | 亚洲精品1区 | 一级a爱片性色毛片免费 | 一区在线观看视频 | 毛片一区二区 | www.日韩 | 国产美女永久免费无遮挡 | 国产日韩欧美一区二区 | 欧美视频福利 | 久久久久久成人 | 99re国产视频 | 在线看av网址 | 免费欧美 | 久久国产精品一区二区 | 亚洲第一网站 | 男女精品网站 | 一区二区三区精品 | 欧美色综合一区二区三区 | 久久国产精品视频 | 欧美亚洲国产一区二区三区 | 欧美日韩在线一区 | 欧美成人精品一区二区男人看 | 日日操夜夜操天天操 | 免费看国产精品视频 | 精品国产亚洲一区二区三区大结局 | 精品中文字幕一区 | 免费观看的av | 久久出精品| 日韩一区二区在线视频 | 奇色影视| 欧产日产国产精品99 | 日韩欧美国产综合 | 日屁网站 | 国产福利视频网站 | 成人性视频免费网站 | 伊人久麻豆社区 | 隔壁老王国产在线精品 | 国产一级在线 | 国产一伦一伦一伦 | 羞羞视频在线网站观看 |