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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
+ d4 z0 D3 |* c; V/ P4 e

% c: N, G" S7 ~9 B- e$ S
8 x* d8 v2 W1 @  w% P, E4 [0 E
# K% W0 A  `% t
  {: t8 }2 G' `6 X( X2 A
& g( |* a" }8 G- T7 {; G8 v
5 q3 w  B, ~, b
0 _! g8 [9 S" f* v; l单片机源程序如下:
  P7 ?+ r) |3 U. a1 Q* @$ {; 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 k4 d4 K2 W$ U" V, K. `3 p& Z
' L  R5 k6 a" d$ H2 q; ]: H
) i: x3 \7 \/ ?! Z- S

* x; l8 B6 j/ Y" @% J
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-10 16:37 , Processed in 0.078125 second(s), 27 queries , Gzip On.

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

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

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