找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2234|回复: 2
收起左侧

为什么用12864仿真推箱子游戏,什么都不显示,只是黑屏变蓝屏

[复制链接]
ID:517444 发表于 2019-4-20 21:56 | 显示全部楼层 |阅读模式
请各位帮看看为啥这个在仿真里显示不出来,是哪里有问题吗?
9RHQOYA_QAJ_7Q5FRO_ED[C.png

单片机源程序如下:
  1. #include<reg52.h>          //此处省略定义uint,uchar
  2. #define DATA_PORT P0
  3. sbit LCD12864_RS   = P2^0;           //寄存器选择
  4. sbit LCD12864_RW  = P2^1;           //读/写控制
  5. sbit LCD12864_E   = P2^2;                //使能,此处PSB为并行方式
  6. sbit LCD12864_RST   = P2^4;

  7. //此处省略定义按键IO口

  8. xdata uchar game=0;           //当前第几关
  9. xdata uchar renwu_x,renwu_y;  //人所在位置的坐标

  10. //关卡8*8点阵 人物1,砖头2,箱子3,目的4,成功5,人物目的6
  11. uchar idata map_ram[8][8]={
  12.    0,0,0,0,0,0,0,0,
  13.    0,1,0,0,0,0,0,0,
  14.    0,0,0,0,0,0,0,0,
  15.    0,0,0,0,0,0,0,0,
  16.    0,0,0,0,0,0,0,0,
  17.    0,0,0,0,0,0,0,0,
  18.    0,0,0,0,0,0,0,0,
  19.    0,0,0,0,0,0,0,0,
  20. };

  21. uchar code map[][8][8]={
  22.   2,2,2,2,2,2,2,2,                //第一关
  23.   2,0,0,0,0,0,1,2,
  24.   2,0,0,0,5,0,0,2,
  25.   2,0,0,2,2,2,2,2,
  26.   2,2,0,0,2,0,0,0,
  27.   2,0,3,0,2,0,0,0,
  28.   2,0,0,4,2,0,0,0,
  29.   2,2,2,2,2,0,0,0,
  30. };                                 //此处省略剩余关卡

  31. uchar code map0[]={
  32.                         
  33.                         "  推箱子  "
  34.                         "  学电子  "
  35.                         "         "
  36.                         "         "
  37.             };

  38. uchar code tuxiang[7][8]={
  39.    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//空白
  40.    0x3C,0x3C,0x18,0x7E,0x5A,0x24,0x42,0x81,//人物
  41.    0x77,0x77,0x77,0x00,0xEE,0xEE,0xEE,0x00,//砖头
  42.    0xFF,0xC3,0xA5,0x99,0x99,0xA5,0xC3,0xFF,//箱子
  43.    0x00,0x3C,0x5A,0x66,0x66,0x5A,0x3C,0x00,//目的
  44.    0xFF,0xBD,0xDB,0xE7,0xE7,0xDB,0xBD,0xFF,//成功
  45.    0x3C,0x3C,0x18,0x7E,0x5A,0x24,0x42,0x81,//人物目的
  46. };

  47. //--定义全局函数--//
  48. void Lcd_WriteCmd(cmd);
  49. void Lcd_WriteData(dat);
  50. void delay_1ms();
  51. void Lcd_Init();     //初始化界面
  52. void Lcd_ClearScreen(void);         //清除显示整个图片
  53. void busy(void);          //忙标志位检查
  54. void Init_0(void);     //初始化开始界面,等待进入游戏
  55. void guoguan(void);            //过关后刷新界面
  56. //在指定位置一次显示两个标题
  57. void print_title(uchar xx,uchar yy,uchar code*title1,uchar code*title2);
  58. //在指定位置打印
  59. void print_onetitle(uchar xx,uchar yy,uchar code*title);
  60. void shuaxin(void);     //刷新屏幕
  61. void key_scan(char sx,char zy);        
  62. //此处省略延时函数

  63. void key_scan(char sx,char zy)
  64. {
  65.    if(map_ram[renwu_x][renwu_y]==1)   //人物
  66.    {
  67.      if(map_ram[renwu_x+sx][renwu_y+zy]==0)
  68.          {
  69.            print_onetitle(renwu_x,renwu_y,tuxiang[0]);
  70.            map_ram[renwu_x][renwu_y]=0;
  71.            renwu_x = renwu_x+sx;
  72.            renwu_y=renwu_y+zy;
  73.            print_onetitle(renwu_x,renwu_y,tuxiang[1]);
  74.            map_ram[renwu_x][renwu_y]=1;
  75.          }
  76. //         else if(map_ram[renwu_x+sx][renwu_y+zy]==4)
  77. //         {
  78. //           print_onetitle(renwu_x,renwu_y,tuxiang[0]);
  79. //           map_ram[renwu_x][renwu_y]=0;
  80. //           renwu_x = renwu_x+sx;
  81. //           renwu_y=renwu_y+zy;
  82. //           print_onetitle(renwu_x,renwu_y,tuxiang[6]);
  83. //           map_ram[renwu_x][renwu_y]=6;
  84. //         }
  85. //         else if(map_ram[renwu_x+sx][renwu_y+zy]==3)
  86. //         {
  87. //           if(map_ram[renwu_x+sx][renwu_y+zy]==0)
  88. //                 { print_onetitle(renwu_x,renwu_y,tuxiang[0]);
  89. //                   map_ram[renwu_x][renwu_y]=0;
  90. //                   renwu_x = renwu_x+sx;
  91. //                   renwu_y=renwu_y+zy;
  92. //                   print_onetitle(renwu_x,renwu_y,tuxiang[1]);
  93. //                   map_ram[renwu_x][renwu_y]=1;
  94. //                   print_onetitle(renwu_x,renwu_y,tuxiang[3]);
  95. //                   map_ram[renwu_x][renwu_y]=3;
  96. //                  }
  97. //         else if(map_ram[renwu_x+sx][renwu_y+zy]==4)
  98. //         {
  99. //           print_onetitle(renwu_x,renwu_y,tuxiang[0]);
  100. //           map_ram[renwu_x][renwu_y]=0;
  101. //           renwu_x = renwu_x+sx;
  102. //           renwu_y=renwu_y+zy;
  103. //           print_onetitle(renwu_x,renwu_y,tuxiang[1]);
  104. //           map_ram[renwu_x][renwu_y]=1;
  105. //           print_onetitle(renwu_x,renwu_y,tuxiang[5]);
  106. //           map_ram[renwu_x][renwu_y]=5;
  107. //         }
  108. //         }
  109. //         else if(map_ram[renwu_x+sx][renwu_y+zy]==5)
  110. //         {
  111. //           if(map_ram[renwu_x+sx][renwu_y+zy]==0)
  112. //                 { print_onetitle(renwu_x,renwu_y,tuxiang[0]);
  113. //                   map_ram[renwu_x][renwu_y]=0;
  114. //                   renwu_x = renwu_x+sx;
  115. //                   renwu_y=renwu_y+zy;
  116. //                   print_onetitle(renwu_x,renwu_y,tuxiang[6]);
  117. //                   map_ram[renwu_x][renwu_y]=6;
  118. //                   print_onetitle(renwu_x,renwu_y,tuxiang[3]);
  119. //                   map_ram[renwu_x][renwu_y]=3;
  120. //                  }
  121. //          else if(map_ram[renwu_x+sx][renwu_y+zy]==4)
  122. //          {
  123. //           print_onetitle(renwu_x,renwu_y,tuxiang[0]);
  124. //           map_ram[renwu_x][renwu_y]=0;
  125. //           renwu_x = renwu_x+sx;
  126. //           renwu_y=renwu_y+zy;
  127. //           print_onetitle(renwu_x,renwu_y,tuxiang[6]);
  128. //           map_ram[renwu_x][renwu_y]=6;
  129. //           print_onetitle(renwu_x,renwu_y,tuxiang[5]);
  130. //           map_ram[renwu_x][renwu_y]=5;
  131. //          }
  132. //          }
  133.    }
  134. //   else if(map_ram[renwu_x+sx][renwu_y+zy]==6)
  135. //         {
  136. //           if(map_ram[renwu_x+sx][renwu_y+zy]==0)
  137. //                 { print_onetitle(renwu_x,renwu_y,tuxiang[0]);
  138. //                   map_ram[renwu_x][renwu_y]=0;
  139. //                   renwu_x = renwu_x+sx;
  140. //                   renwu_y=renwu_y+zy;
  141. //                   print_onetitle(renwu_x,renwu_y,tuxiang[4]);
  142. //                   map_ram[renwu_x][renwu_y]=4;
  143. //                   print_onetitle(renwu_x,renwu_y,tuxiang[1]);
  144. //                   map_ram[renwu_x][renwu_y]=1;
  145. //                  }
  146. //          else if(map_ram[renwu_x+sx][renwu_y+zy]==4)
  147. //          {
  148. //           print_onetitle(renwu_x,renwu_y,tuxiang[4]);
  149. //           map_ram[renwu_x][renwu_y]=4;
  150. //           renwu_x = renwu_x+sx;
  151. //           renwu_y=renwu_y+zy;
  152. //           print_onetitle(renwu_x,renwu_y,tuxiang[6]);
  153. //           map_ram[renwu_x][renwu_y]=6;
  154. //           print_onetitle(renwu_x,renwu_y,tuxiang[6]);
  155. //           map_ram[renwu_x][renwu_y]=6;
  156. //          }
  157. //          else if(map_ram[renwu_x+sx][renwu_y+zy]==3)
  158. //         {
  159. //           if(map_ram[renwu_x+sx][renwu_y+zy]==0)
  160. //                 { print_onetitle(renwu_x,renwu_y,tuxiang[4]);
  161. //                   map_ram[renwu_x][renwu_y]=4;
  162. //                   renwu_x = renwu_x+sx;
  163. //                   renwu_y=renwu_y+zy;
  164. //                   print_onetitle(renwu_x,renwu_y,tuxiang[1]);
  165. //                   map_ram[renwu_x][renwu_y]=1;
  166. //                   print_onetitle(renwu_x,renwu_y,tuxiang[3]);
  167. //                   map_ram[renwu_x][renwu_y]=3;
  168. //                  }
  169. //          else if(map_ram[renwu_x+sx][renwu_y+zy]==4)
  170. //          {
  171. //           print_onetitle(renwu_x,renwu_y,tuxiang[4]);
  172. //           map_ram[renwu_x][renwu_y]=4;
  173. //           renwu_x = renwu_x+sx;
  174. //           renwu_y=renwu_y+zy;
  175. //           print_onetitle(renwu_x,renwu_y,tuxiang[1]);
  176. //           map_ram[renwu_x][renwu_y]=1;
  177. //           print_onetitle(renwu_x,renwu_y,tuxiang[5]);
  178. //           map_ram[renwu_x][renwu_y]=5;
  179. //          }
  180. //         }
  181. //         else if(map_ram[renwu_x+sx][renwu_y+zy]==5)
  182. //         {
  183. //           if(map_ram[renwu_x+sx][renwu_y+zy]==0)
  184. //                 { print_onetitle(renwu_x,renwu_y,tuxiang[4]);
  185. //                   map_ram[renwu_x][renwu_y]=4;
  186. //                   renwu_x = renwu_x+sx;
  187. //                   renwu_y=renwu_y+zy;
  188. //                   print_onetitle(renwu_x,renwu_y,tuxiang[6]);
  189. //                   map_ram[renwu_x][renwu_y]=6;
  190. //                   print_onetitle(renwu_x,renwu_y,tuxiang[3]);
  191. //                   map_ram[renwu_x][renwu_y]=3;
  192. //                  }
  193. //          else if(map_ram[renwu_x+sx][renwu_y+zy]==4)
  194. //          {
  195. //           print_onetitle(renwu_x,renwu_y,tuxiang[4]);
  196. //           map_ram[renwu_x][renwu_y]=4;
  197. //           renwu_x = renwu_x+sx;
  198. //           renwu_y=renwu_y+zy;
  199. //           print_onetitle(renwu_x,renwu_y,tuxiang[6]);
  200. //           map_ram[renwu_x][renwu_y]=6;
  201. //           print_onetitle(renwu_x,renwu_y,tuxiang[5]);
  202. //           map_ram[renwu_x][renwu_y]=5;
  203. //          }
  204. //        }
  205. //  }
  206. }

  207. void Init_0(void)          //初始化界面,等待进入游戏
  208. {
  209.   uchar lala=0;
  210.   Lcd_Init();
  211.   delay_1ms(10);
  212.   while(lala==0)
  213.   {
  214.     if(KEY_START==0)
  215.             { delay_1ms(10);
  216.               if(KEY_START==0)
  217.             {
  218.                           Lcd_WriteCmd(0x01);
  219. //                        Lcd_WriteCmd(0x01);
  220.                         Lcd_ClearScreen();
  221.                         guoguan();
  222.                         lala=1;
  223.             }
  224.           }
  225.   }
  226. }

  227. void busy(void)           //忙标志位检查
  228. {
  229.   LCD12864_RS=0;
  230.   LCD12864_RW=1;
  231.   LCD12864_E=1;
  232.   P0=0xff;
  233.   while((P0&0x80)==0x80)
  234.   delay_1ms(5);
  235.   LCD12864_E=0;
  236. }

  237. void Lcd_WriteCmd(cmd)                   //写入一个命令到12864
  238. {
  239.     busy();
  240.         LCD12864_E  = 1;           //使能        
  241.         LCD12864_RS = 0;       //select command,选择命令
  242.         LCD12864_RW = 0;       //select write,选择写模式
  243.         delay_1ms(5);
  244.         DATA_PORT = cmd; //put command,放置命令
  245.     LCD12864_E = 0;
  246.         
  247. }

  248. void Lcd_WriteData(dat)                        //写入一个数据到12864
  249. {        
  250.     busy();
  251.         LCD12864_E  = 1;           //disable read,读使能        
  252.         LCD12864_RS = 1;       //select data,选择数据
  253.         LCD12864_RW = 0;       //select write,选择写模式        
  254.         delay_1ms(5);
  255.         DATA_PORT = dat;       //put data,放置数据
  256.         LCD12864_E = 0;
  257.                   
  258. }

  259. void Lcd_Init()                 //LCD初始化
  260. {
  261.     uchar i;
  262.         uchar code *p;
  263.         p=map0;
  264.         Lcd_WriteCmd(0x30);  //基本指令操作,地址归位
  265.         delay_1ms(5);
  266.         Lcd_WriteCmd(0x0C);  //显示开,关光标
  267.         delay_1ms(5);
  268.         Lcd_WriteCmd(0x01);   //清除LCD的显示
  269.         delay_1ms(5);                          
  270.         Lcd_WriteCmd(0x06);          //指定在资料的读取及写入
  271.         for(i=0;i<64;i++)                //自动右移
  272.         {
  273.           Lcd_WriteData(*p);
  274.           p++;
  275.         }
  276. }

  277. void Lcd_ClearScreen(void)
  278. {
  279.   uchar x,y;
  280.   Lcd_WriteCmd(0x34);          //使用扩充指令
  281.   for(y=0;y<64;y++)
  282.    {
  283.             Lcd_WriteCmd(y+0x80);          //读忙碌状态                  
  284.          Lcd_WriteCmd(x+0x80);
  285.          Lcd_WriteData(0x00);   }
  286. }

  287. void guoguan(void)               //过关后刷新界面
  288. {
  289.           uchar i,j;
  290.         Lcd_ClearScreen();
  291.         for(i=0;i<8;i++)
  292.         for(j=0;j<8;j++)
  293.         {
  294.           map_ram[i][j]=map[game][j][i];
  295.           if(map_ram[i][j]==1)
  296.           {
  297.             renwu_x=i;
  298.                 renwu_y=j;
  299.           }
  300.         }
  301.         for(i=0;i<4;i++)
  302.         for(j=0;j<8;j++)
  303.         {
  304.           print_title(i,j,tuxiang[map_ram[2*i][j]],tuxiang[map_ram[2*i+1][j]]);
  305.         }
  306.          game++;
  307. }

  308. void print_title(uchar xx,uchar yy,uchar code*title1,uchar code*title2)
  309. {
  310.    uchar j=0;
  311.    uchar i=0;
  312.    uchar y;
  313.    if(yy>3)
  314.    {
  315.      xx=xx+8;
  316.          yy=yy-4;
  317.    }
  318.    yy=yy*8;
  319.    y=yy+8;
  320.    Lcd_WriteCmd(0x36);        //8bit控制,扩充指,开显示
  321.    for(;yy<y;yy++)                //上面32行
  322.    {
  323.      Lcd_WriteCmd(yy+0x80);             //y行地址
  324.          Lcd_WriteCmd(xx+0x80);                 //x行地址
  325.          Lcd_WriteData(title1[i++]);
  326.          Lcd_WriteData(title2[j++]);
  327.    }
  328. }

  329. //在指定位置打印
  330. void print_onetitle(uchar xx,uchar yy,uchar code*title)
  331. {
  332.           uchar j=0;
  333.         uchar i=0;
  334.         uchar code *title1;
  335.         uchar x,y,z;
  336.         x=xx%2;
  337.         if(x==1)
  338.         {
  339.           z=map[xx-1][yy];
  340.           title1=tuxiang[z];
  341.           if(yy>3)
  342.           {
  343.             xx=xx+8;
  344.                 yy=yy-4;
  345.           }
  346.           yy=yy*8;
  347.           y=yy+8;
  348.           Lcd_WriteCmd(0x36);        //8bit控制,扩充指,开显示
  349.            for(;yy<y;yy++)                //上面32行
  350.            {
  351.              Lcd_WriteCmd(yy+0x80);             //y行地址
  352.                  Lcd_WriteCmd(xx+0x80);                 //x行地址
  353.                  Lcd_WriteData(title1[i++]);
  354.                  Lcd_WriteData(title[j++]);
  355.            }
  356.         }
  357.                 if(x==0)
  358.         {
  359.           z=map[xx+1][yy];
  360.           title1=tuxiang[z];
  361.           if(yy>3)
  362.           {
  363.             xx=xx+8;
  364.                 yy=yy-4;
  365.           }
  366.           yy=yy*8;
  367.           y=yy+8;
  368.           Lcd_WriteCmd(0x36);        //8bit控制,扩充指,开显示
  369.            for(;yy<y;yy++)                //上面32行
  370.            {
  371.              Lcd_WriteCmd(yy+0x80);             //y行地址
  372.                  Lcd_WriteCmd(xx+0x80);                 //x行地址
  373.                  Lcd_WriteData(title[i++]);
  374.                  Lcd_WriteData(title1[j++]);
  375.            }
  376.         }
  377. }

  378. void shuanxin(void)
  379. {
  380.     uchar i,j;
  381.     for(i=0;i<4;i++)
  382.         for(j=0;j<8;j++)
  383.         {
  384.           print_title(i,j,tuxiang[map_ram[2*i][j]],tuxiang[map_ram[2*i+1][j]]);
  385.         }
  386. }

  387. //主程序
  388. void main()
  389. {
  390.   Lcd_Init();
  391.   Init_0();
  392.   Lcd_ClearScreen();
  393.   while(1)
  394.   {
  395.             if(KEY_UP==0)
  396.                   {
  397.                    delay_1ms(20);
  398.                    if(KEY_UP==0)
  399.                    {key_scan(1,0); }           
  400.                   }
  401.            if(KEY_DOWN ==0)
  402.                   {
  403.                    delay_1ms(20);
  404.                    if(KEY_DOWN==0)
  405.                    {key_scan(-1,0); }           
  406.                   }
  407.          if(KEY_LEFT ==0)
  408.                   {
  409.                    delay_1ms(20);
  410.                    if(KEY_LEFT==0)
  411.                    {key_scan(0,-1); }           
  412.                   }
  413.           if(KEY_RIGHT ==0)
  414.                   {
  415.                    delay_1ms(20);
  416.                    if(KEY_RIGHT==0)
  417.                    {key_scan(0,-1); }           
  418.                   }
  419.            if(KEY_START ==0)
  420.                   {
  421.                    delay_1ms(20);
  422.                    if(KEY_LEFT==0)
  423.                    { Lcd_ClearScreen();
  424.                             shuaxin();
  425.                    }           
  426.                   }
  427.   }
  428. }
复制代码


回复

使用道具 举报

ID:497670 发表于 2019-4-22 09:17 | 显示全部楼层
你好!
看程序是用的带字库液晶,你仿真里面用的是没有字库的液晶;
液晶类型型号不同,肯定不能正常显示,具体修改可以联系我!
回复

使用道具 举报

ID:1 发表于 2019-4-21 01:52 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表