>[info]## **3-第一篇:硬件篇**..............................................................
>[info]实践出真知,实验平台必不可少!本篇将介绍我们用来开发的硬件平台。
通过该篇的介绍,你将了解我们Smart模块的硬件资源以及外设接口。
>[info]### **3.1-实验平台介绍:**
>[info]#### **3.1.1-意想意创Smart模块-资源初窥**......................................................
>[info]①-硬件平台.................................................................................................
![](https://box.kancloud.cn/2334f1c516e9c2cbba3abae1a3bb33f4_554x242.png)
>[info]#### **3.1.2意想意创Smart模块-资源说明**.......................................................
![](https://box.kancloud.cn/a9a4c2ce6469e8996e19a1a206158dbd_554x495.png)
*****
*****
>[info]## **4-第二篇:软件篇**.................................................................................
>本篇我们在软件开发平台TKStudio上介绍意想意创Smart模块。
>[info]### **4.1-开发环境:TKStudio以及工程文件以介绍**................................
> ①-TKstudio下载地址:
②-工程文件下载地址:
③-工程文件夹介绍:
![](https://box.kancloud.cn/13d6423e66a4b67c7d4be11241c605b7_554x109.png)
>[info]### **4.2-user_file文件**............................................................................
![](https://box.kancloud.cn/cd6cc4c4b91cb244c15c76f02954268a_478x242.png)
PS:用户自己所编写的程序都是在这个.c文件下。其他的文件无需操作,如果操作了其他文件夹可能会造成未知的错误。
>[info]## **5-第三篇:API接口介绍**...............................................................
>意想意创Smart模块API接口都是用C标准语言实现的。
API接口有对模块的区分。比如:音乐模块就有播放音乐的API接口,当然其他模块是不能使用的。
*****
*****
>[info]### **5.1-Master_Setup函数**...................................................................
>·PS:程序初始化函数,模块上电时,该函数只执行一次。
·语法:
void Master_Setup(void)
·参数:
| 参数 | 释义 |
| --- | --- |
| void | void:没有参数 |
>[info]·返回值:无;
·实例:
void Master\_Setup() //模块初始化让小灯亮500毫秒
{
LedSet(ENABLE); //打开小灯
delay_ms(500); //延时500毫秒
LedSet(DISABLE); //所有输出打开
}
*****
*****
>[info]### **5.2-Master_Loop函数**...................................................................................
>·ps:循环函数,用户主要的函数都会在此函数里完成。
·语法:
void Master_Loop(void)
·参数:
| 参数 | 释义 |
| --- | --- |
| void | void:没有参数 |
>[info]·返回值:无;
·实例:
void Master\_Loop() //当输入1有信号的时候,输出1输出。
{
if(Read_Input(1)==1){
OutSet(1,ENABLE);
}
}
*****
*****
>[info]### **5.3-delay_ms函数** ......................................................................................
>·PS:毫秒级延时函数,最大延时65535毫秒。
·语法:
void delay\_ms(unsigned int ms); //延时函数
·参数
| 参数 | 释义 |
| --- | --- |
| ms| ms:毫秒延时。可填写(1-65535)毫秒 |
>[info]·返回值:无;
·实例:
uchar i=0;
for(i=0;i<3;i++)//小灯1秒闪一次一共闪烁3秒
{
LedSet(ENABLE); //打开小灯
delay_ms(500); //延时500毫秒
LedSet(DISABLE); //所有输出打开
delay_ms(500);
}
*****
*****
>[info]### **5.4-Read_Input函数**...................................................................................
>·PS:输入口读取状态函数;
·语法:
uchar Read_Input(uchar Num_IO)
·参数
| 参数 | 释义 |
| --- | --- |
| Num_IO| Num_IO:输入口端口号。 |
| | 基础主控:(1-5)。 |
| | 高级主控: (1-10)。 |
| | 超级主控(1-12)。 |
| | 廿级主控(1-20)。 |
| | 根据硬件输入口数量而定 |
>[info]返回:对应口有信号输入的时候,返回1。对应输入口没有信号输入的时候,返回0。
·实例:
if((Read\_Input(1)==1) && ((Read\_Input(2)==1)){ //输入1,2同时有信号,打开电磁锁。
LockSet(POWEROPEN);
}
*****
*****
>[info]### **5.5-LedSet函数**..................................................................................................
>·PS:模块指示灯状态设置函数。
·语法:
void LedSet(uchar Sta);//设置小灯状态
·参数
| 参数 | 释义 |
| --- | --- |
| Sta| Sta: LEDOPEN,打开小灯 |
| | Sta: LEDCLOSED,关闭小灯 |
>[info]·返回:无;
·实例:
LedSet(LEDOPEN); //打开小灯
*****
*****
>[info]### **5.6-LedDisable函数**.......................................................
>·PS:关闭模块指示灯函数
·语法:
void LedDisable(void);//关闭小灯
·参数
| 参数 | 释义 |
| --- | --- |
| void | void:没有参数 |
>[info]·返回:无;
·实例:
LedDisable(); //关闭小灯
*****
*****
>[info]### **5.7-LedEnable函数**.........................................................................
>·PS:打开模块指示灯函数
·语法:
void LedEnable(void);//关闭小灯
·参数
| 参数 | 释义 |
| --- | --- |
| void | void:没有参数 |
>[info]·返回:无;
·实例:
LedEnable(); //关闭小灯
*****
*****
>[info]### **5.8-OutSet函数**.............................................................
>·PS:模块输出口设置函数。
·语法:
void OutSet(uchar Num,uchar Sta);//关闭小灯
·参数
| 参数 | 释义 |
| --- | --- |
| Num| Num:输出口端号。 |
| | 基础主控(1-5)。|
| | 高级主控(1-10)。|
| | 超级主控(1-12)。 |
| | 廿级主控(1-20)。 |
| | 255:对应所有输出口。 |
| | 根据硬件输出口定。 |
| Sta | Sta:DISABLE-相应口不输出。|
| | Sta:ENABLE-相应口输出。|
>[info]·返回:无;
·实例:
OutSet(1,ENABLE);delay\_ms(1000);
OutSet(2,ENABLE);delay\_ms(1000);
OutSet(3,ENABLE);delay\_ms(1000);
OutSet(4,ENABLE);delay\_ms(1000);
OutSet(5,ENABLE);delay\_ms(1000);//一秒动作一个输出口
*****
*****
>[info]### **5.9-OutDisable函数**......................................................
>·PS:关闭模块输出口函数
·语法:
void OutDisable(uchar Num);//关闭输出口
·参数
| 参数 | 释义 |
| --- | --- |
| Num| Num:输出口端号。 |
| | 基础主控(1-5)。|
| | 高级主控(1-10)。|
| | 超级主控(1-12)。 |
| | 廿级主控(1-20)。 |
| | 255:对应所有输出口。 |
| | 根据硬件输出口定。 |
>[info]·返回:无;
·实例:
OutDisable(1); //关闭输出口1
*****
*****
>[info]### **5.10-OutEnable函数**..........................................................................................
>·PS:打开模块输出口函数
·语法:
void OutEnable(uchar Num);//打开输出
·参数
| 参数 | 释义 |
| --- | --- |
| Num| Num:输出口端号。 |
| | 基础主控(1-5)。|
| | 高级主控(1-10)。|
| | 超级主控(1-12)。 |
| | 廿级主控(1-20)。 |
| | 255:对应所有输出口。 |
| | 根据硬件输出口定。 |
>[info]·返回:无;
·实例:
OutEnable(255); //打开所有的输出口。
*****
*****
>[info]### **5.11-LockSet函数**...............................................................................................
>·PS电磁锁状态设置函数。
·语法:
void LockSet(uchar Sta);//灯锁口状态设置
·参数
| 参数 | 释义 |
| --- | --- |
| Sta | Sta:POWEROPEN, 关闭电磁锁口,打开灯口; |
| | Sta:POWERCLOSED, 打开电磁锁口,关闭灯口; |
>[info]·返回:无;
·实例:
LockSet(POWEROPEN); //关闭电磁锁,打开灯口
*****
*****
>[info]### **5.12-LockClose函数**.........................................................
>·PS:电磁锁关闭函数。
·语法:
void LockClose(void);//关闭电磁锁函数
·参数
| 参数 | 释义 |
| --- | --- |
| void | void:没有参数 |
>[info]·返回:无;
·实例:
LockClose(); //关闭电磁锁,打开灯口
*****
*****
>[info]### **5.13-LockOpen函数**.............................................................................................
>·PS:打开电磁锁函数。
·语法:
void LockOpen(void);//关闭电磁锁函数
·参数
| 参数 | 释义 |
| --- | --- |
| void | void:没有参数 |
>[info]·返回:无;
·实例:
LockOpen(); //打开电磁锁口,关闭灯口。
*****
*****
>[info]### **5.14-UART\_ReceiveBuffer函数**........................................................
>·PS:串口接受函数。(和UART1_SendBuffer配套使用)
·语法:
void UART\_ReceiveBuffer(uchar *buf,uchar len);//串口接受函数
·参数
| 参数 | 释义 |
| --- | --- |
| buf| buf:接收到的数据缓存。|
| len| len:接收到的数据长度。|
>[info]·返回:无;
·实例:
void UART_ReceiveBuffer(uchar \*buf,uchar len)
{
uchar i=0;
/*下面这个例程,接受到什么数据,在转发出去的功能*/
UART1_SendBuffer(buf,len);
}
*****
*****
>[info]### **5.15-UART1_SendBuffer函数**.............................................................
>·PS:串口发送函数。(和UART\_ReceiveBuffer配套使用)
·语法:
void UART1_SendBufferr(uchar *buf,uchar len); //串口发送数组函数
·参数
| 参数 | 释义 |
| --- | --- |
| buf| buf:需要发送的数据缓存。|
| len| len:需要发送的数据长度 。|
>[info]·返回:无;
·实例:
uchar Arry\[5\]={1,2,3,4,5};
UART1\_SendBuffer(Arry,sizeof(Arry)); //把Arry发送出去。
*****
*****
>[info]### **5.16-UART1_SendData函数**..........................................
>·PS:串口单字节发送函数。
·语法:
void UART1_SendData(uchar dat); //串口发送单字节函数。
·参数
| 参数 | 释义 |
| --- | --- |
| dat| dat:需要发送的数据|
>[info]·返回:无;
·实例:
uchar a=1;
UART1_SendData(a); //发送数据
*****
*****
>[info]### **5.17-Music_Play函数**........................................................................
>·PS:音乐播放函数。(音乐模块,音乐主控独有函数,其他模块不能使用)
·语法:
Music_Play(uchar PlayerNum); //播放音乐函数
·参数
| 参数 | 释义 |
| --- | --- |
| PlayerNum| PlayerNum:音乐编号(1-255)|
>[info]·返回:无;
·实例:
Music_Play(1); //播放音乐1
*****
*****
>[info]### **5.18-Music_Read_FeedBack函数**........................................................
>·PS:音乐播完反馈函数。(音乐模块,音乐主控独有函数,其他模块不能使用)
·语法:
uchar Music_Read_FeedBack(void);///播放音乐函数
·参数
| 参数 | 释义 |
| --- | --- |
| void | void:没有参数 |
>[info]·返回:当前音乐播放完毕返回1,没有播放完成返回0;
·实例:
If( Music\_Read_FeedBack(1)==1){ //当前音乐播放完毕,输出1口输出
OutSet(1,ENABLE);
}
*****
*****
>[info]### **5.19-PF_Tim0_1msIT函数**.............................................................
>·PS:1毫秒定时器函数。
·语法:
void PF_Tim0_1msIT(void);//1毫秒定时器函数
·参数
| 参数 | 释义 |
| --- | --- |
| void | void:没有参数 |
>[info]·返回:无;
·实例:
void PF\_Tim0\_1msIT(void)
{
static uint t=0;
If(++t>=1000){
LockSet(POWEROPEN); //计时1秒打开电磁锁
}
}
*****
*****
>[info]### **5.20-Light_Function函数**...........................................................................
>·PS:超级主控输入端灯效函数。(超级主控独有函数,其他模块不能使用)
·语法:
void Light\_Function(uchar Num,uchar Sta);//超级主控效果等函数
·参数
| 参数 | 释义 |
| --- | --- |
| Num| 效果灯编号(1-12)|
| | 1-输入1的灯。 |
| | 2-输入2的灯。 |
| | 3-输入3的灯。 |
| | 4-输入4的灯。 |
| | 5-输入5的灯。 |
| | 6-输入6的灯。 |
| | 7-输入7的灯。 |
| | 8-输入8的灯。 |
| | 9-输入9的灯。 |
| | 10-输入10的灯。|
| | 11-输入12的灯。|
| | 12-输入12的灯。|
|Sta|Sta:DISABLE-不亮 |
| | Sta:ENABLE-亮 |
>[info]·返回:无;
·实例:
If(Read_Input(1)==1){ //当输入1有信号的时候,输入1效果灯亮。没有信号的时候输入1,效果灯灭
Light\_Function(1,ENABLE);
}
else{
Light_Function(1,DISABLE);
}
*****
*****
>[info]### **5.21-Read\_User_Confign函数**..................................................................
>·PS:读取用户配置函数。
·语法:
uchar *Read_User_Config(void); //读取用户配置函数
·参数
| 参数 | 释义 |
| --- | --- |
| void | void:没有参数 |
>[info]·返回:读取到的有效数据;
·实例:
uchar len=0;uchar *P=NULL;
uchar i=0;
P=Read_User_Config();
while(*(P+len)!=0){ //有效数据不为0,
len++; //读取到的数据长度
}
UART1_Send(P,len); //发送出接受的数据
*****
*****
>[info]### **5.22-DigitronDisplay函数**..................................................................
>·PS:数码管显示函数,只能在点阵主控-数码管SDK中调用。
·语法:
void DigitronDisplay(unsigned char wei,unsigned char value);//数码管显示函数
·参数
| 参数 | 释义 |
| --- | --- |
| void | void:没有参数 |
>[info]·返回:读取到的有效数据;
·实例:下面这个历程,实现了输入1234有信号的时候,数码管对应显示
uchar i=0;
for(i=0;i<4;i++){
if(Read_Input(i+1)==1){
DigitronDisplay(i+1,i+1);
}
}
*****
*****
>[info]### **5.23-Set_rgb_AllColour函数**..................................................................
>·PS:七彩灯显示函数,只能在七彩灯SDK中调用。
·语法:
void Set_rgb_AllColour(uchar colour,uchar Value); //七彩灯显示函数
·参数
| 参数 | 释义 |
| --- | --- |
| colour | 选择颜色 |
| | RGB_RED //红色 |
| | RGB_GREEN //绿色 |
| | RGB_BLUE //蓝色 |
| | RGB_YELLOW //黄 |
| | RGB_PURPLE //紫 |
| | RGB_CYAN //青 |
| | RGB_WHITE //白 |
| Value | 0-0xFF; //0为熄灭,0xFF为最亮 |
>[info]·返回:读取到的有效数据;
·实例:显示红色。
Set_rgb_AllColour(RGB_RED,0xFF); //红色
*****
*****
>[info]### **5.24-void Ws2812_SetPixelColor**..................................................................
>·PS:可控灯画点函数,只能在可控灯SDK中调用。
·语法:
void Ws2812_SetPixelColor(unsigned int num,unsigned char r,unsigned char g,unsigned char b);//可控灯画点函数
·参数
| 参数 | 释义 |
| --- | --- |
| num| 灯珠位置 (0-99)|
| r | 红色 (0-255) |
| g | 绿色 (0-255) |
| b | 蓝色 (0-255) |
>[info]·返回:无;
·实例:显示红色。
Ws2812_SetPixelColor(0,255,0,0); //设置一个灯珠红色
*****
*****
>[info]### **5.25-Ws2812_Show**..................................................................
>·PS:可控灯刷新函数,只能在可控灯SDK中调用。
·语法:
void Ws2812_Show(void); //可控灯刷新函数
·参数
| 参数 | 释义 |
| void | void:没有参数 |
>[info]·返回:无;
·实例:显示红色。
Ws2812_SetPixelColor(0,255,0,0); //设置一个灯珠红色
Ws2812_Show();//让颜色显示
*****
*****
>[info]## **6-第四篇:实战篇**...............................................................
>[info]### **1-案例演示-手印机关**
>[info]**1-游戏玩法:**
①\-触摸传感器摸一下(一共5个触摸感应),一个灯亮。
②\-5个按照顺序(1,2,3,4,5的顺序)都摸对之后,一个电磁锁断电,游戏结束,触摸无效。
③\-5个都摸完之后,但是顺序不对,所有的灯都熄灭,重新触摸。
**2-视频演示:**
>[info] **3-程序源码:**
```
#include "user_file.h"
/**********************************************************************************
+---------------------------------------------------------+
用户函数部分(user_file.h里面有详细使用介绍)
+---------------------------------------------------------+
- 目前进展:
- 日期 :2018-09-08
- 作者 :意想意创.
- 硬件环境:意想意创-A0001-2.6代-白色盒子-基础主控。
- 软件版本号:V1.0
- 技术论坛:XXXXXXX
- 备注 :本示例在 TKStudio 开发环境下,用2.6代-基础主控调试OK。
- Copyright(C):青岛意想意创技术发展有限公司。
- All rights reserved
**********************************************************************************/
uchar Game_isGo=0; //游戏流程变量
uchar Index[5]={0};
uchar Order[5]={1,2,3,4,5}; //需要比对的顺序
uchar Order_Len=0; //触摸的次数
/*==============================
功能:这是一个串口接受函数,接受到的数据都在buf中配合S(uchar *buf,uchar len)使用
参数:发送的数据和数据长度;
返回:无;
===============================*/
void UART_ReceiveBuffer(uchar *buf,uchar len)
{
uchar i=0;
/*下面这个历程,接受到什么数据,在转发出去的功能*/
UART1_SendBuffer(buf,len);
}
/*==============================
功能:这是一个1毫秒的中断函数;
参数:无;
返回:无;
===============================*/
void PF_Tim0_1msIT(void)
{
/*下面这个历程,实现了200毫秒小灯执行一次闪烁功能*/
/* static uchar Sta=0;
static uint t=0;
if(++t>=100){
if(Sta==NO){
LedSet(LEDOPEN);Sta=YES; //打开小灯;
}
else if(Sta==YES){
LedSet(LEDCLOSED);Sta=NO; //关闭小灯;
}else{
}
t=0;
} */
}
/***************************************
功能:这个是一个执行一次的函数;
参数:无;
返回:无;
***************************************/
void Master_Setup()
{
return ;
}
/***************************************
功能:游戏效果执行函数;
参数:无;
返回:成功返回1,失败返回2;
***************************************/
uchar Game_result(void)//游戏效果函数
{
uchar i=0;
static uchar buf[5]={0};
for(i=1;i<=5;i++){
if((Read_Input(i)==1) && (Index[i-1]==0)){ //扫描5个输入口
OutSet(i,ENABLE); //触摸一个点亮一个
buf[Order_Len++]=i; //缓存当前的顺序
Index[i-1]=1;
}
}
if(Order_Len==5){ //5点都触摸之后
if(UART_Compare(buf,Order,sizeof(buf))){
return 1;
}
else{
Clean_dat(buf,sizeof(buf)); //错误清空当前缓存
Clean_dat(Index,sizeof(Index));
Order_Len=0; //清空长度
return 2;
}
}
return 0;
}
/***************************************
功能:游戏正确效果函数;
参数:无;
返回:成功返回1,失败返回0;
***************************************/
uchar Game_Right(void)//游戏正确结果
{
LockSet(POWEROPEN);
return 1;
}
/***************************************
功能:游戏错误效果函数;
参数:无;
返回:成功返回1,失败返回0;
***************************************/
uchar Game_Wrong(void)//游戏错误结果
{
uchar i=0;
OutSet(255,DISABLE); //关闭所有的灯;
/*------需要注意,这里需要按键释放--------*/
for(i=0;i<5;i++){
if(Read_Input(i+1)==1)break; //有输入的时候,说明手还没有拿开
}
if(i==5)return 1;
return 0;
}
/**************************************
功能:是一个循环函数;
参数:无;
返回:无;
PS:游戏玩法:
1-每触摸一个手印,对应一盏灯亮。
2-当五盏灯都亮了之后,如果触摸的顺序正确那么电磁锁打开。
3-没有按照顺序,熄灭所有的灯。
**************************************/
void Master_Loop()
{
switch (Game_isGo)
{
case 0:
Game_isGo=Game_result();
break;
case 1:
Game_Right();
break;
case 2:
if(Game_Wrong())Game_isGo=0; //错误效果执行完毕,并且触摸已经全部释放,从新开始
break;
default:
break;
}
}
```
>[info]### **2-案例演示-语音版打地鼠**
>[info]**1-游戏玩法:**
1-上个机关启动之后,所有的指示灯闪烁3次,开始播放循环播放北京音效,该游戏启动。
2-此时,随机播放一首音效(1-5首其中一个),并且对应的灯箱亮起,
如果,如果在3秒内按下对应的地鼠按键,灯箱熄灭,连续击中N(可以设置)次之后,所有地鼠快速闪烁5次,播放成功音效,电磁锁打开。
3-如果在规定时间内,没有击中对应的地鼠,或者击错地鼠,游戏失败,播放错误音效,需要从头开始。
**2-视频演示:**
>[info] **3-程序源码:**
```
#include "user_file.h"
/**********************************************************************************
+---------------------------------------------------------+
用户函数部分(user_file.h里面有详细使用介绍)
+---------------------------------------------------------+
- 目前进展:
- 日期 :2018-09-08
- 作者 :意想意创.
- 硬件环境:意想意创-A0001-2.6代黑色盒子-音乐模块。
- 软件版本号:V1.0
- 技术论坛:XXXXXXX
- 备注 :本示例在 TKStudio 开发环境下,用2.6代-音乐模块调试OK。
- Copyright(C):青岛意想意创技术发展有限公司。
- All rights reserved
**********************************************************************************/
MODU_Game_Tim Game_Tim={//游戏计时变量
0,0,0
};
uchar Game_Right_Num=0; //游戏成功的次数标记
uchar Game_isGo=0; //游戏流程标记
/*==============================
功能:这是一个串口接受函数,接受到的数据都在buf中配合S(uchar *buf,uchar len)使用
参数:发送的数据和数据长度;
返回:无;
===============================*/
void UART_ReceiveBuffer(uchar *buf,uchar len)
{
/*下面这个历程,接受到什么数据,在转发出去的功能*/
UART1_SendBuffer(buf,len);
}
/*==============================
功能://这是一个1毫秒的中断函数;
参数:无;
返回:无;
===============================*/
void PF_Tim0_1msIT(void)
{
Game_ADD_Tim();
return ;
}
/***************************************
功能:游戏启动函数;
参数:无;
返回:成功1,失败0;
***************************************/
uchar Game_Star(void)//游戏启动函数
{
uchar i=0;
for(i=0;i<3;i++){ //游戏启动之后,所有灯箱闪烁三次
OutSet(0xFF,ENABLE);
delay_ms(500);
OutSet(0xFF,DISABLE);
delay_ms(500);
}
return 1;
}
/***************************************
功能:游戏随机播放音效函数;
参数:无;
返回:返回随机的音乐编号;
***************************************/
uchar Game_Rand_Music(void)//音乐随机播放音效函数
{
uchar Value=0;
while(1){
Value=rand()%6; //随机数值应该比实际需要的数值大1
if(Value!=NO){
Music_Play(Value); //播放对应的音效
return Value;
}
}
}
/***************************************
功能:游戏按键值比对函数;
参数:无;
返回:成功返回1,失败返回2;
***************************************/
uchar Game_Key_ComPare(uchar Value) //游戏按键比对函数;
{
uchar i=0;
static uchar Key_Index[5]={0,0,0,0,0};
for(i=1;i<=5;i++){ //扫描5个地鼠按键
if((Read_Input(i)==1) && (Key_Index[i-1]==NO)){ //如果有按键按下
Key_Index[i-1]=YES;
if(i==Value){
return 1;
}
else{
return 2;
}
}
else if((Read_Input(i)==0) && (Key_Index[i-1]==YES)){
Key_Index[i-1]=NO;
}
}
return 0;
}
/***************************************
功能:地鼠在线定时器函数;
参数:无;
返回:无;
***************************************/
uchar Game_ADD_Tim(void)//游戏计时函数;
{
if(Game_Tim.Star==YES){
if(++Game_Tim.Sec>=1000){
Game_Tim.Sec=NO;
if(++Game_Tim.Cnt>=GAME_TIME){
Game_Tim.Star=second;Game_Tim.Cnt=Game_Tim.Sec=NO; //GAME_TIME秒计时函数
}
}
}
return 1;
}
/***************************************
功能:游戏流程执行函数;
参数:无;
返回:成功返回1,失败返回2;
***************************************/
uchar Game_result(void)//游戏效果执行函数
{
static uchar Index=0;
static uchar Music_Num=0;
uchar Sta=0;
if(Index==NO){
Music_Num=Game_Rand_Music(); //随机播放一首音效
OutSet(Music_Num,ENABLE); //打开对用的灯箱
Game_Tim.Star=YES;Game_Tim.Sec=Game_Tim.Cnt=NO; //打开按键定时器函数
Index=YES;
}
else if(Index==YES){
Sta=Game_Key_ComPare(Music_Num); //按键值和随机的音效值进行比较
if(Sta==YES){ //表示此次按键按对
Game_Tim.Star=Game_Tim.Cnt=Game_Tim.Sec=NO;
Index=NO;
return 1;
}
else if(Sta==second){ //表示是此次按键按错
Index=NO;
Game_Tim.Star=Game_Tim.Cnt=Game_Tim.Sec=NO;
return 2;
}
}
if(Game_Tim.Star==second){
Game_Tim.Star=Game_Tim.Cnt=Game_Tim.Sec=NO;
Index=NO;return 2;
}
return 0;
}
/***************************************
功能:游戏正确效果执行函数;
参数:无;
返回:成功1次返回1,全部成功返回2,;
***************************************/
uchar Game_Right(void)//游戏正确结果执行函数
{
uchar i=0;
Game_Right_Num++;
/*======游戏过关效果=======*/
if(Game_Right_Num>=GAME_TURE_NUM){ //游戏过关之后
Music_Play(6); //游戏过关之后,播放成功音效,并且让所有的地鼠闪烁5次
LockSet(POWEROPEN); //打开电磁锁
for(i=0;i<5;i++){
OutSet(0xFF,ENABLE);
delay_ms(300);
OutSet(0xFF,DISABLE);
delay_ms(300);
}
return 2;
}
/*=======击中一次地鼠效果=======*/
OutSet(0xFF,DISABLE); //关闭正确的灯箱
return 1;
}
/***************************************
功能:游戏错误执行函数;
参数:无;
返回:执行完毕返回1,失败返回0;
***************************************/
uchar Game_Wrong(void)//游戏错误效果执行函数
{
static uchar Index=0;
Game_Right_Num=NO; //清空地鼠的连击次数
OutSet(0xFF,DISABLE); //所有灯箱的灯熄灭
if(Index==NO){
Music_Play(7); //播放错误的地鼠音效
Index=YES;
}
else if((Index==YES) && (Music_Read_FeedBack()==1)){ //等待错误的效果执行完毕
Index=NO;
return 1;
}
return 0;
}
/***************************************
功能:这是一个执行一次的任务;
参数:无;
返回:无;
***************************************/
void Master_Setup()
{
Game_Star(); //游戏启动函数
}
/**************************************
功能:这是一个循环函数;
参数:无;
返回:无;
PS:1-上个机关启动之后,所有的指示灯闪烁3次,开始播放循环播放北京音效,该游戏启动。
2-此时,随机播放一首音效(1-5首其中一个),并且对应的灯箱亮起,
如果,如果在3秒内按下对应的地鼠按键,灯箱熄灭,连续击中N(可以设置)次之后,所有地鼠快速闪烁5次,播放成功音效,电磁锁打开。
3-如果在规定时间内,没有击中对应的地鼠,或者击错地鼠,游戏失败,播放错误音效,需要从头开始。
**************************************/
void Master_Loop()
{
uchar Sta=0;
switch (Game_isGo)
{
case 0:
Game_isGo=Game_result(); //游戏结果函数
break;
case 1:
Sta=Game_Right();
if(Sta==YES){
Game_isGo=NO;
}
else if(Sta==second){
Game_isGo=3;
}
break;
case 2:
if(Game_Wrong())Game_isGo=NO;
break;
default:
break;
}
}
```