找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8449|回复: 5
收起左侧

51单片机推箱子游戏 (lm3229)T6963C液晶屏显示 带仿真和中文资料

  [复制链接]
ID:204844 发表于 2017-5-25 19:31 | 显示全部楼层 |阅读模式
51单片机+(lm3229液晶屏)T6963C芯片主控 做的推箱子游戏 带上下左右 选关和开始按钮.

推箱子游戏的proteus仿真原理图(附件中可下载工程文件):
0.png 0.png 0.png


(lm3229)T6963C中文资料:
0.png
(lm3229)T6963C引脚图:
0.png 0.png
目    录
前   言2
注意事项2
第一章:T6963C一般介绍4
第二章:6963C的引脚说明及其功能4
一、  T6963C外形图4
二、  T6963C引脚说明5
第三章:T6963C指令集6
第四章:内藏T6963C控制器的液晶显示器的外特性10
第五章、内藏T6963C的液晶显示模块与MPU的接口方法12
第六章、T6963C控制器液晶模块应用程序示例16


推箱子游戏的51单片机源程序如下:
  1. #include <reg52.h>
  2. #include <Text1.h> //关卡的界面
  3. #include <Text2.h> //在此文件中定义了汉字编码,用点阵液晶字模提取软件
  4. #define uc unsigned char
  5. #define ui unsigned int
  6. #define d P0          //数据口
  7. sbit cd=P2^0;          //=0,数据通道;=1,命令通道
  8. sbit rd=P2^1;          //=0,读选通有效
  9. sbit wr=P2^2;          //=0,写选通有效

  10. uc renh=6,renl=4,bu=0,startf=1,guan=1;

  11. static uc rammap[8][10];


  12. void lcddatw(uc dat)  //写数据
  13. {
  14. cd=0;
  15. wr=0;
  16. d=dat;
  17. wr=1;
  18. }

  19. void lcdcmd0(uc cmd)        //写命令
  20. {
  21. cd=1;
  22. wr=0;
  23. d=cmd;
  24. wr=1;
  25. }

  26. void lcdcmd1(uc dat1,uc cmd)  //写带有一个参数的命令
  27. {
  28. lcddatw(dat1);
  29. lcdcmd0(cmd);
  30. }

  31. void lcdcmd2(uc dat1,uc dat2,uc cmd)  //写带有两个参数的命令
  32. {
  33. lcddatw(dat1);
  34. lcddatw(dat2);
  35. lcdcmd0(cmd);
  36. }

  37. void lcdinit()           //LCD初始化
  38. {
  39. lcdcmd2(0x00,0x10,0x40); //设置文本显示区首地址
  40. lcdcmd2(30,0x00,0x41); //设置文本显示区宽度
  41. lcdcmd2(0x00,0x00,0x42); //设置图形显示区首地址
  42. lcdcmd2(30,0x00,0x43); //设置图形显示区宽度
  43. lcdcmd0(0xa2); //设置光标形状
  44. lcdcmd0(0x80); //设置显示方式,文本图形“或”
  45. lcdcmd0(0x9e); //设置光标闪烁,不显示,文本与图形显示
  46. }

  47. void dischar(uc row,uc col,uc cha) //写ASCII码字符,row字符行(=8图形行),col字符列(=8图形列),chaASCII码
  48. {  //显示ASCII码时,16行x30列
  49. ui address;
  50. uc dat1,dat2;
  51. address=row*30+col+0x1000; //计算文本显示区地址
  52. dat1=address;
  53. dat2=address>>8;
  54. lcdcmd2(dat1,dat2,0x24);//地址指针定位
  55. lcdcmd1(cha,0xc4); //写字符,地址指针不变
  56. }

  57. //数字和汉字代码写入自定义字符存储区
  58. void setcgram(uc count)  //count是要写的汉字个数
  59. {//定义自定义字符在GCRAM中存储区地址,自定义字符首地址0x80(固定值),一个字符8x8=8字节,对应字节地址0x0400
  60. ui i;
  61. lcdcmd2(0x03,0x00,0x22); //定义自定义字符(在GCRAM中)存储区字节地址高5位为0x03,
  62. lcdcmd2(0x00,0x1c,0x24); //0x03<<11+0x0400=0x1c00(字节地址)
  63. for(i=0;i<16*8*12/8;i++)
  64. lcdcmd1(shucode[i],0xc0);        //写数字(每个16*8)*12(0-9,:)到GCRAM
  65. for(i=0;i<16*16*count/8;i++)
  66. lcdcmd1(hancode[i],0xc0);         //写汉字(每个16*16)*count到GCRAM
  67. }
  68.          //写汉字代码,row行,col列,sit汉字在自定义字符中的位置,每个汉字相当于4个字符(2行2列)
  69. void dishan(uc row,uc col,uc sit)//                sit位置用han[]描述
  70. {
  71. dischar(row,col,sit);//每个汉字按左上,左下,右上,右下存放
  72. dischar(row+1,col,sit+1);
  73. dischar(row,col+1,sit+2);
  74. dischar(row+1,col+1,sit+3);
  75. }
  76. //写数字代码,row行,col列,sit数字在自定义字符中的位置,每个数字相当于2个字符(2行1列)
  77. void disshu(uc row,uc col,uc sit)//        sit位置用shu[]描述
  78. {
  79. dischar(row,col,sit);//每个汉字按左上,左下,右上,右下存放
  80. dischar(row+1,col,sit+1);
  81. }

  82. void bushu()                //显示步数
  83. {
  84.         uc b1=0,b2=0,b3=0;
  85.         if(bu>999)  {b1=9;b2=9;b3=9;}
  86.         else {b1=bu/100;b2=bu/10;b3=bu%10;}
  87.         disshu(10,23,shu[b1]);disshu(10,24,shu[b2]);disshu(10,25,shu[b3]);
  88.         dishan(10,26,han[6]);
  89. }

  90. void huamap()          //画关卡地图
  91. {
  92. uc i,j;
  93. for(i=0;i<8;i++)
  94. for(j=0;j<10;j++)
  95. {
  96.         dishan(2*i,2*j,han[map[guan-1][i][j]]);
  97.         rammap[i][j]=map[guan-1][i][j];
  98.         if(rammap[i][j]==0x07) rammap[i][j]=0x00;
  99. }
  100. dishan(4,22,han[4]);
  101. disshu(4,24,shu[0]);
  102. disshu(4,25,shu[guan]);
  103. dishan(4,26,han[5]);
  104. bushu();
  105. dishan(2*renh,2*renl,han[1]);
  106. }

  107. void disxg()                   //显示选关提示
  108. {
  109. dishan(0,22,han[8]);
  110. dishan(0,24,han[9]);
  111. dishan(0,26,han[5]);
  112. disshu(0,28,shu[10]);
  113. }

  114. void shengli()                         //过关判断
  115. {
  116. uc i,j,s1=0,s2=0;
  117. for(i=0;i<8;i++)
  118. for(j=0;j<10;j++)
  119. {
  120.         if(map[guan-1][i][j]==0x07)    //检视目标
  121.         {
  122.                 s1++;                                          //目标计数
  123.                 if(rammap[i][j]==0x02) s2++;        //目标上箱子计数
  124.         }
  125. }
  126. if(s1==s2)                 //目标计数和目标上箱子计数相同,则过关
  127. {
  128. dishan(2,20,han[10]);         //显示过关提示
  129. dishan(2,22,han[11]);
  130. dishan(2,24,han[12]);
  131. dishan(2,26,han[5]);
  132. disshu(2,28,shu[11]);
  133. startf=0;                                 //停止游戏
  134. disxg();                                 //显示选关提示
  135. }
  136. }

  137. void delay()                        //延时
  138. {
  139.         ui x;
  140.         for(x=0;x<1000;x++);
  141. }


  142. uc key()                   //检测按键
  143. {
  144.         uc x,k=0;
  145.         P3=0xff;
  146.         x=P3;
  147.         if(x==0xff)           //没按键跳出
  148.         goto over;
  149.         else
  150.         {
  151.                 delay();           //有按键,延时
  152.                 P3=0xff;
  153.                 x=P3;
  154.                 if(x==0xff)                //再测
  155.                 goto over;
  156.                 else
  157.                 {
  158.                         switch(x)           //获取键值
  159.                         {
  160.                                 case 0xfe:k=1;break;
  161.                                 case 0xfd:k=2;break;
  162.                                 case 0xfb:k=3;break;
  163.                                 case 0xf7:k=4;break;
  164.                                 case 0xef:k=5;break;
  165.                                 case 0xdf:k=6;break;
  166.                                 case 0xbf:k=7;break;
  167.                                 case 0x7f:k=8;break;
  168.                                 default:break;
  169.                         }
  170.                         wait:           //等待按键释放
  171.                         P3=0xff;
  172.                         x=P3;
  173.                         if(x==0xff) goto over;
  174.                         else goto wait;
  175.                 }
  176.         }
  177.         over:
  178.         return k;
  179. }

  180. void xuanguan(uc k)                 //选关处理
  181. {
  182.    if((k==1||k==3)&&guan<3) {guan++;renh=6;renl=4;huamap();}
  183.    if((k==2||k==4)&&guan>1) {guan--;renh=6;renl=4;huamap();}
  184. }

  185. void huifumubiao()                //恢复目标显示,(被人踩的目标)
  186. {
  187. uc i,j;
  188. for(i=0;i<8;i++)
  189. for(j=0;j<10;j++)
  190. {
  191.         if(map[guan-1][i][j]==0x07&&rammap[i][j]!=0x02)         //有目标且没有箱子
  192.         {
  193.                 if(renh!=i||renl!=j) dishan(2*i,2*j,han[7]);
  194.         }
  195. }       
  196. }

  197. void game(uc k)                        //游戏控制
  198. {
  199.         if(k==1)                        //向上
  200.         {
  201.                 if(rammap[renh-1][renl]==0x00)                    //上面是空白
  202.                 {
  203.                         dishan(2*renh,2*renl,han[0]);          //人原来的位置清0
  204.                         renh--;                                                          //上移一行
  205.                         dishan(2*renh,2*renl,han[1]);          //人新位置显示
  206.                         bu++;                                                  //步数加1
  207.                 }
  208.                 else if((rammap[renh-1][renl]==0x02)&&(rammap[renh-2][renl]==0x00)) //上面是箱子,箱子上是空格
  209.                 {
  210.                         dishan(2*renh,2*renl,han[0]);dishan(2*(renh-1),2*renl,han[0]);
  211.                         renh--;
  212.                         dishan(2*renh,2*renl,han[1]);dishan(2*(renh-1),2*renl,han[2]);
  213.                         rammap[renh][renl]=0x00;rammap[renh-1][renl]=0x02;
  214.                         bu++;
  215.                 }
  216.         }
  217.         if(k==4)
  218.         {
  219.                 if(rammap[renh+1][renl]==0x00)
  220.                 {
  221.                         dishan(2*renh,2*renl,han[0]);
  222.                         renh++;
  223.                         dishan(2*renh,2*renl,han[1]);
  224.                         bu++;
  225.                 }
  226.                 else if((rammap[renh+1][renl]==0x02)&&(rammap[renh+2][renl]==0x00))
  227.                 {
  228.                         dishan(2*renh,2*renl,han[0]);dishan(2*(renh+1),2*renl,han[0]);
  229.                         renh++;
  230.                         dishan(2*renh,2*renl,han[1]);dishan(2*(renh+1),2*renl,han[2]);
  231.                         rammap[renh][renl]=0x00;rammap[renh+1][renl]=0x02;
  232.                         bu++;
  233.                 }
  234.         }
  235.            if(k==2)
  236.         {
  237.                 if(rammap[renh][renl-1]==0x00)
  238.                 {
  239.                         dishan(2*renh,2*renl,han[0]);
  240.                         renl--;
  241.                         dishan(2*renh,2*renl,han[1]);
  242.                         bu++;
  243.                 }
  244.                 else if((rammap[renh][renl-1]==0x02)&&(rammap[renh][renl-2]==0x00))
  245.                 {
  246.                         dishan(2*renh,2*renl,han[0]);dishan(2*renh,2*(renl-1),han[0]);
  247.                         renl--;
  248.                         dishan(2*renh,2*renl,han[1]);dishan(2*renh,2*(renl-1),han[2]);
  249.                         rammap[renh][renl]=0x00;rammap[renh][renl-1]=0x02;
  250.                         bu++;
  251.                 }
  252.         }
  253.            if(k==3)
  254.         {
  255.                 if(rammap[renh][renl+1]==0x00)
  256.                 {
  257.                         dishan(2*renh,2*renl,han[0]);
  258.                         renl++;
  259.                         dishan(2*renh,2*renl,han[1]);
  260.                         bu++;
  261.                 }
  262.                 else if((rammap[renh][renl+1]==0x02)&&(rammap[renh][renl+2]==0x00))
  263.                 {
  264.                         dishan(2*renh,2*renl,han[0]);dishan(2*renh,2*(renl+1),han[0]);
  265.                         renl++;
  266.                         dishan(2*renh,2*renl,han[1]);dishan(2*renh,2*(renl+1),han[2]);
  267.                         rammap[renh][renl]=0x00;rammap[renh][renl+1]=0x02;
  268.                         bu++;
  269.                 }
  270.         }
  271.         huifumubiao();
  272.         bushu();
  273.         shengli();
  274. }

  275. void clear()        //清屏
  276. ……………………

  277. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
推箱子LM3229.rar (309.46 KB, 下载次数: 170)
回复

使用道具 举报

ID:62509 发表于 2020-7-9 01:20 | 显示全部楼层
很好的呀!我试了一下可以用的。就是画面太集中了,看起来觉得太小。另外关数太少了,你刚来兴趣,它没了!点个赞吧!
回复

使用道具 举报

ID:473186 发表于 2020-7-9 08:27 | 显示全部楼层
你觉得吧是你自己的问题,你完全可以自按自己的思路接着往下开发
回复

使用道具 举报

ID:62509 发表于 2020-7-9 09:27 | 显示全部楼层
zhengchong60,还是你厉害呀!
回复

使用道具 举报

ID:251061 发表于 2020-7-12 08:37 | 显示全部楼层
能写游戏,一定是高手,拜莫
回复

使用道具 举报

ID:884564 发表于 2021-4-28 16:27 | 显示全部楼层
真是学习好资料,下了,谢谢!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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