找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2555|回复: 0
收起左侧

用Ran#函数制成的单片机猜码游戏机的紧急更新

[复制链接]
ID:218023 发表于 2018-8-6 17:07 | 显示全部楼层 |阅读模式
经自己多次审核,发现能猜到的几率很小。所以增加每猜对一次,机会就加一次。这将取消机会旗。
以前的、原理图、效果图都在这:

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <stdlib.h> //该文件中包含随机数生成函数包含函数
  3. #include "lcd.c" //显示

  4. //二进制的形象表示方法,从左到右分别位第7 6 5 4 3 2 1 0位
  5. #define bin(_a,_b,_c,_d,_e,_f,_g,_h) ((_a)<<7|(_b)<<6|(_c)<<5|(_d)<<4|(_e)<<3|(_f)<<2|(_g)<<1|(_h))        //二进制的表示

  6. //定义按键
  7. sbit k1=P2^0;
  8. sbit k2=P2^1;
  9. sbit k3=P2^2;
  10. sbit k4=P2^3;
  11. sbit sp=P2^4;

  12. const uchar normal_man[]={ //正常脸CGRAM
  13. bin(0,0,0,0,0,0,0,0),
  14. bin(0,0,0,0,1,0,1,0),
  15. bin(0,0,0,0,1,0,1,0),
  16. bin(0,0,0,0,0,0,0,0),
  17. bin(0,0,0,0,0,0,0,0),
  18. bin(0,0,0,1,1,1,1,1),
  19. bin(0,0,0,0,0,0,0,0),
  20. bin(0,0,0,0,0,0,0,0)
  21. };

  22. const uchar yes_man[]={ //笑脸CGRAM
  23. bin(0,0,0,0,0,0,0,0),
  24. bin(0,0,0,0,1,0,1,0),
  25. bin(0,0,0,0,1,0,1,0),
  26. bin(0,0,0,0,0,0,0,0),
  27. bin(0,0,0,1,0,0,0,1),
  28. bin(0,0,0,0,1,1,1,0),
  29. bin(0,0,0,0,0,1,1,0),
  30. bin(0,0,0,0,0,0,0,0)
  31. };

  32. const uchar no_man[]={ //哭脸CGRAM
  33. bin(0,0,0,0,0,0,0,0),
  34. bin(0,0,0,0,1,0,1,0),
  35. bin(0,0,0,0,1,0,1,0),
  36. bin(0,0,0,0,0,0,0,0),
  37. bin(0,0,0,0,1,1,1,0),
  38. bin(0,0,0,1,0,0,0,1),
  39. bin(0,0,0,0,0,0,0,0),
  40. bin(0,0,0,0,0,0,0,0)
  41. };

  42. const uchar pause[]={ //暂停符号CGRAM
  43. bin(0,0,0,1,1,0,1,1),
  44. bin(0,0,0,1,1,0,1,1),
  45. bin(0,0,0,1,1,0,1,1),
  46. bin(0,0,0,1,1,0,1,1),
  47. bin(0,0,0,1,1,0,1,1),
  48. bin(0,0,0,1,1,0,1,1),
  49. bin(0,0,0,1,1,0,1,1),
  50. bin(0,0,0,0,0,0,0,0)
  51. };

  52. const uchar key[]={ //钥匙CGRAM
  53. bin(0,0,0,0,0,1,1,0),
  54. bin(0,0,0,0,0,1,0,0),
  55. bin(0,0,0,0,0,1,1,0),
  56. bin(0,0,0,0,0,1,0,0),
  57. bin(0,0,0,0,1,1,1,0),
  58. bin(0,0,0,0,1,0,1,0),
  59. bin(0,0,0,0,1,1,1,0),
  60. bin(0,0,0,0,0,0,0,0)
  61. };

  62. void paused()
  63. {
  64.         uchar a,b;
  65.         LcdWriteCom(0x8a); //定义坐标(10,0)
  66.         LcdWriteData(0x03); //写暂停符号
  67.         while(1){
  68.                 if(sp==0){ //发现S/P按钮按下
  69.                         for(b=1;b>0;b--) //延时10微秒以实现消抖
  70.                         for(a=2;a>0;a--);
  71.                         if(sp==0){
  72.                                 while(!sp); //等待S/P按钮松开
  73.                                 LcdWriteCom(0x8a); //定义坐标(10,0)
  74.                                 LcdWriteData(0x20); //清除暂停符号
  75.                                 return; //返回
  76.                         }
  77.                 }
  78.         }
  79. }

  80. void game()
  81. {
  82.         uchar a,b,c,key,rnd,delay,lives=4; //定义数据槽
  83.         uint score=0; //定义得分槽
  84.         LcdWriteCom(0x01); //清屏
  85.         LcdPrintf(" 1  MAN:"); //放上必需字符
  86.         LcdWriteCom(0xc0); //定义坐标(0,1)
  87.         LcdPrintf("324 SCORE:000000"); //放上必需字符
  88.         LcdWriteCom(0x88); //定义坐标(8,0)
  89.         LcdWriteData(0x00); //放置正常脸CGRAM
  90.         while(1){
  91.                 LcdWriteCom(0xca); //定义坐标(10,1)
  92.                 LcdPrintNum(score,4); //显示得分
  93.                 if(c==0){
  94.                         rnd=rand()%4; //获取一个小于4的随机数
  95.                         c=1;
  96.                 }
  97.                 if(k1==0){ //发现1按钮按下
  98.                         delay=1;
  99.                         key=0;
  100.                 }
  101.                 if(k2==0){ //发现2按钮按下
  102.                         delay=1;
  103.                         key=1;
  104.                 }
  105.                 if(k3==0){ //发现3按钮按下
  106.                         delay=1;
  107.                         key=2;
  108.                 }
  109.                 if(k4==0){ //发现4按钮按下
  110.                         delay=1;
  111.                         key=3;
  112.                 }
  113.                 if(sp==0){ //发现S/P按钮按下
  114.                         for(b=1;b>0;b--) //延时10微秒以实现消抖
  115.                         for(a=2;a>0;a--);
  116.                         if(sp==0){
  117.                                 while(!sp); //等待S/P按钮松开
  118.                                 paused(); //暂停
  119.                         }
  120.                 }
  121.                 if(delay==1){
  122.                         if(rnd==0){
  123.                                 LcdWriteCom(0x81); //定义坐标(1,0)
  124.                                 LcdWriteData(0x04); //放置钥匙CGRAM
  125.                         }
  126.                         if(rnd==1){
  127.                                 LcdWriteCom(0xc1); //定义坐标(1,1)
  128.                                 LcdWriteData(0x04); //放置钥匙CGRAM
  129.                         }
  130.                         if(rnd==2){
  131.                                 LcdWriteCom(0xc0); //定义坐标(0,1)
  132.                                 LcdWriteData(0x04); //放置钥匙CGRAM
  133.                         }
  134.                         if(rnd==3){
  135.                                 LcdWriteCom(0xc2); //定义坐标(2,1)
  136.                                 LcdWriteData(0x04); //放置钥匙CGRAM
  137.                         }
  138.                         if(key==rnd){ //如果这个代码中找到钥匙
  139.                                 LcdWriteCom(0x88); //定义坐标(8,0)
  140.                                 LcdWriteData(0x01); //放置笑脸CGRAM
  141.                                 Lcd1602_Delay1ms(1000);
  142.                                 ++score;
  143.                                 ++lives;
  144.                                 if(lives==0)lives=255;
  145.                         }
  146.                         else{
  147.                                 LcdWriteCom(0x88); //定义坐标(8,0)
  148.                                 LcdWriteData(0x02); //放置哭脸CGRAM
  149.                                 Lcd1602_Delay1ms(1000);
  150.                                 --lives;
  151.                         }
  152.                         c=0;
  153.                         delay=0;
  154.                         //恢复原状
  155.                         LcdWriteCom(0x81);
  156.                         LcdWriteData('1');
  157.                         LcdWriteCom(0xc1);
  158.                         LcdWriteData('2');
  159.                         LcdWriteCom(0xc0);
  160.                         LcdWriteData('3');
  161.                         LcdWriteCom(0xc2);
  162.                         LcdWriteData('4');
  163.                         LcdWriteCom(0x88);
  164.                         LcdWriteData(0x00);
  165.                        
  166.                 }
  167.                 //观察机会
  168.                 LcdWriteCom(0x8c);
  169.                 LcdWriteData('L');
  170.                 LcdPrintNum(lives,3);
  171.                 //当没有机会旗时且某个代码中没有找到钥匙,游戏结束
  172.                 if(lives==0xff){
  173.                         LcdWriteCom(0x01); //清屏
  174.                         LcdWriteCom(0x80);
  175.                         LcdPrintf("GAME OVER"); //显示字符
  176.                         LcdWriteCom(0xc0); //定义坐标(0,1)
  177.                         LcdPrintf("SCORE:"); //显示字符
  178.                         //显示得分
  179.                         LcdPrintNum(score,4);
  180.                         LcdPrintf("00");
  181.                        
  182.                         return;
  183.                 }
  184.         }
  185. }

  186. void main()
  187. {
  188.         uchar a,b;
  189.         LcdInit(); //LCD初始化
  190.         //将所有CGRAM写入LCD
  191.         LcdWriteCGRAM(0x00,normal_man);
  192.         LcdWriteCGRAM(0x01,yes_man);
  193.         LcdWriteCGRAM(0x02,no_man);
  194.         LcdWriteCGRAM(0x03,pause);
  195.         LcdWriteCGRAM(0x04,key);
  196.         LcdPrintf("Code Gamer"); //显示字符
  197.         LcdWriteCom(0xc0); //定义坐标(0,1)
  198.         LcdPrintf("Press S/P Button"); //显示字符
  199.         while(1){
  200.                 if(sp==0){ //发现S/P按钮按下
  201.                         for(b=1;b>0;b--) //延时10微秒以实现消抖
  202.                         for(a=2;a>0;a--);
  203.                         if(sp==0){
  204.                                 while(!sp); //等待S/P按钮松开
  205.                                 game(); //游戏开始
  206.                         }
  207.                 }
  208.         }
  209. }
复制代码

所有资料51hei提供下载:
code.zip (49.62 KB, 下载次数: 8)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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