找回密码
 注册
关于网站域名变更的通知
查看: 326|回复: 0
打印 上一主题 下一主题

用Ran#函数制成的猜码游戏机源程序及仿真

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-10-29 11:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

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

5 l0 e5 V1 ~# l! c( m) j
: `4 B& ~& [: \3 k 7 ~. m$ ]: V9 m* ^$ }

) ^9 }7 R6 d; g6 L# Z 7 n% F2 `2 x2 }- \% L9 u" B
( v1 H0 _: C4 ~2 F; r
8 V1 }4 G. k8 B  U' ~1 n4 k) K2 B

4 q; L2 E$ ]+ D. l  w单片机源程序如下:
+ T2 \6 a' o  b4 Z  \2 D7 A
  • #include <reg52.h>
  • #include <stdlib.h> //该文件中包含随机数生成函数包含函数
  • #include "lcd.c" //显示
  • //二进制的形象表示方法,从左到右分别位第7 6 5 4 3 2 1 0位
  • #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))        //二进制的表示
  • //定义按键
  • sbit k1=P2^0;
  • sbit k2=P2^1;
  • sbit k3=P2^2;
  • sbit k4=P2^3;
  • sbit sp=P2^4;
  • const uchar normal_man[]={ //正常脸CGRAM
  • bin(0,0,0,0,0,0,0,0),
  • bin(0,0,0,0,1,0,1,0),
  • bin(0,0,0,0,1,0,1,0),
  • bin(0,0,0,0,0,0,0,0),
  • bin(0,0,0,0,0,0,0,0),
  • bin(0,0,0,1,1,1,1,1),
  • bin(0,0,0,0,0,0,0,0),
  • bin(0,0,0,0,0,0,0,0)
  • };
  • const uchar yes_man[]={ //笑脸CGRAM
  • bin(0,0,0,0,0,0,0,0),
  • bin(0,0,0,0,1,0,1,0),
  • bin(0,0,0,0,1,0,1,0),
  • bin(0,0,0,0,0,0,0,0),
  • bin(0,0,0,1,0,0,0,1),
  • bin(0,0,0,0,1,1,1,0),
  • bin(0,0,0,0,0,1,1,0),
  • bin(0,0,0,0,0,0,0,0)
  • };
  • const uchar no_man[]={ //哭脸CGRAM
  • bin(0,0,0,0,0,0,0,0),
  • bin(0,0,0,0,1,0,1,0),
  • bin(0,0,0,0,1,0,1,0),
  • bin(0,0,0,0,0,0,0,0),
  • bin(0,0,0,0,1,1,1,0),
  • bin(0,0,0,1,0,0,0,1),
  • bin(0,0,0,0,0,0,0,0),
  • bin(0,0,0,0,0,0,0,0)
  • };
  • const uchar pause[]={ //暂停符号CGRAM
  • bin(0,0,0,1,1,0,1,1),
  • bin(0,0,0,1,1,0,1,1),
  • bin(0,0,0,1,1,0,1,1),
  • bin(0,0,0,1,1,0,1,1),
  • bin(0,0,0,1,1,0,1,1),
  • bin(0,0,0,1,1,0,1,1),
  • bin(0,0,0,1,1,0,1,1),
  • bin(0,0,0,0,0,0,0,0)
  • };
  • const uchar key[]={ //钥匙CGRAM
  • bin(0,0,0,0,0,1,1,0),
  • bin(0,0,0,0,0,1,0,0),
  • bin(0,0,0,0,0,1,1,0),
  • bin(0,0,0,0,0,1,0,0),
  • bin(0,0,0,0,1,1,1,0),
  • bin(0,0,0,0,1,0,1,0),
  • bin(0,0,0,0,1,1,1,0),
  • bin(0,0,0,0,0,0,0,0)
  • };
  • void paused()
  • {
  •         uchar a,b;
  •         LcdWriteCom(0x8a); //定义坐标(10,0)
  •         LcdWriteData(0x03); //写暂停符号
  •         while(1){
  •                 if(sp==0){ //发现S/P按钮按下
  •                         for(b=1;b>0;b--) //延时10微秒以实现消抖
  •                         for(a=2;a>0;a--);
  •                         if(sp==0){
  •                                 while(!sp); //等待S/P按钮松开
  •                                 LcdWriteCom(0x8a); //定义坐标(10,0)
  •                                 LcdWriteData(0x20); //清除暂停符号
  •                                 return; //返回
  •                         }
  •                 }
  •         }
  • }
  • void game()
  • {
  •         uchar a,b,c,key,rnd,delay,lives=4; //定义数据槽
  •         uint score=0; //定义得分槽
  •         LcdWriteCom(0x01); //清屏
  •         LcdPrintf(" 1  MAN:"); //放上必需字符
  •         LcdWriteCom(0xc0); //定义坐标(0,1)
  •         LcdPrintf("324 SCORE:000000"); //放上必需字符
  •         LcdWriteCom(0x88); //定义坐标(8,0)
  •         LcdWriteData(0x00); //放置正常脸CGRAM
  •         while(1){
  •                 LcdWriteCom(0xca); //定义坐标(10,1)
  •                 LcdPrintNum(score,4); //显示得分
  •                 if(c==0){
  •                         rnd=rand()%4; //获取一个小于4的随机数
  •                         c=1;
  •                 }
  •                 if(k1==0){ //发现1按钮按下
  •                         delay=1;
  •                         key=0;
  •                 }
  •                 if(k2==0){ //发现2按钮按下
  •                         delay=1;
  •                         key=1;
  •                 }
  •                 if(k3==0){ //发现3按钮按下
  •                         delay=1;
  •                         key=2;
  •                 }
  •                 if(k4==0){ //发现4按钮按下
  •                         delay=1;
  •                         key=3;
  •                 }
  •                 if(sp==0){ //发现S/P按钮按下
  •                         for(b=1;b>0;b--) //延时10微秒以实现消抖
  •                         for(a=2;a>0;a--);
  •                         if(sp==0){
  •                                 while(!sp); //等待S/P按钮松开
  •                                 paused(); //暂停
  •                         }
  •                 }
  •                 if(delay==1){
  •                         if(rnd==0){
  •                                 LcdWriteCom(0x81); //定义坐标(1,0)
  •                                 LcdWriteData(0x04); //放置钥匙CGRAM
  •                         }
  •                         if(rnd==1){
  •                                 LcdWriteCom(0xc1); //定义坐标(1,1)
  •                                 LcdWriteData(0x04); //放置钥匙CGRAM
  •                         }
  •                         if(rnd==2){
  •                                 LcdWriteCom(0xc0); //定义坐标(0,1)
  •                                 LcdWriteData(0x04); //放置钥匙CGRAM
  •                         }
  •                         if(rnd==3){
  •                                 LcdWriteCom(0xc2); //定义坐标(2,1)
  •                                 LcdWriteData(0x04); //放置钥匙CGRAM
  •                         }
  •                         if(key==rnd){ //如果这个代码中找到钥匙
  •                                 LcdWriteCom(0x88); //定义坐标(8,0)
  •                                 LcdWriteData(0x01); //放置笑脸CGRAM
  •                                 Lcd1602_Delay1ms(1000);
  •                                 ++score;
  •                                 ++lives;
  •                                 if(lives==0)lives=255;
  •                         }
  •                         else{
  •                                 LcdWriteCom(0x88); //定义坐标(8,0)
  •                                 LcdWriteData(0x02); //放置哭脸CGRAM
  •                                 Lcd1602_Delay1ms(1000);
  •                                 --lives;
  •                         }
  •                         c=0;
  •                         delay=0;
  •                         //恢复原状
  •                         LcdWriteCom(0x81);
  •                         LcdWriteData('1');
  •                         LcdWriteCom(0xc1);
  •                         LcdWriteData('2');
  •                         LcdWriteCom(0xc0);
  •                         LcdWriteData('3');
  •                         LcdWriteCom(0xc2);
  •                         LcdWriteData('4');
  •                         LcdWriteCom(0x88);
  •                         LcdWriteData(0x00);
  •                 }
  •                 //观察机会
  •                 LcdWriteCom(0x8c);
  •                 LcdWriteData('L');
  •                 LcdPrintNum(lives,3);
  •                 //当没有机会旗时且某个代码中没有找到钥匙,游戏结束
  •                 if(lives==0xff){
  •                         LcdWriteCom(0x01); //清屏
  •                         LcdWriteCom(0x80);
  •                         LcdPrintf("GAME OVER"); //显示字符
  •                         LcdWriteCom(0xc0); //定义坐标(0,1)
  •                         LcdPrintf("SCORE:"); //显示字符
  •                         //显示得分
  •                         LcdPrintNum(score,4);
  •                         LcdPrintf("00");
  •                         return;
  •                 }
  •         }
  • }
  • void main()
  • {
  •         uchar a,b;
  •         LcdInit(); //LCD初始化
  •         //将所有CGRAM写入LCD
  •         LcdWriteCGRAM(0x00,normal_man);
  •         LcdWriteCGRAM(0x01,yes_man);
  •         LcdWriteCGRAM(0x02,no_man);
  •         LcdWriteCGRAM(0x03,pause);
  •         LcdWriteCGRAM(0x04,key);
  •         LcdPrintf("Code Gamer"); //显示字符
  •         LcdWriteCom(0xc0); //定义坐标(0,1)
  •         LcdPrintf("Press S/P Button"); //显示字符
  •         while(1){
  •                 if(sp==0){ //发现S/P按钮按下
  •                         for(b=1;b>0;b--) //延时10微秒以实现消抖
  •                         for(a=2;a>0;a--);
  •                         if(sp==0){
  •                                 while(!sp); //等待S/P按钮松开
  •                                 game(); //游戏开始
  •                         }
  •                 }
  •         }
  • }
  • 游客,如果您要查看本帖隐藏内容请回复
    9 K+ x, |1 t1 e8 }

, X1 e+ ]" D6 n1 A# W
: H7 `' B) v, W; g) G

2 [6 b+ |6 c, S2 j" Q1 z6 g# z2 H
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-22 06:53 , Processed in 0.140625 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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