>[info]## **3-第一篇:硬件篇**..............................................................
>[info]實踐出真知,實驗平臺必不可少!本篇將介紹我們用來開發的硬件平臺。
通過該篇的介紹,你將了解我們Smart模塊的硬件資源以及外設接口。
>[info]### **3.1-實驗平臺介紹:**
>[info]#### **3.1.1-意想意創Smart模塊-資源初窺**......................................................
>[info]①-硬件平臺.................................................................................................

>[info]#### **3.1.2意想意創Smart模塊-資源說明**.......................................................

*****
*****
>[info]## **4-第二篇:軟件篇**.................................................................................
>本篇我們在軟件開發平臺TKStudio上介紹意想意創Smart模塊。
>[info]### **4.1-開發環境:TKStudio以及工程文件以介紹**................................
>?①-TKstudio下載地址:
②-工程文件下載地址:
③-工程文件夾介紹:

>[info]### **4.2-user_file文件**............................................................................

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;
}
}
```