?? main.c
字號:
//*************************************************************************************************
//*************************************************************************************************
//**<程 序 名>:俄羅斯方塊游戲 **
//**<版本說明>:正式版,完成俄羅斯方塊基本的全部功能。 **
//**<仿真說明>: 本程序在Proteus7.1SP2上仿真成功,編譯后內(nèi)存約為14.5K,單片機(jī)可以選用at89c51RB2, **
//** 內(nèi)存為16K,由于Proteus仿真問題,液晶豎立時會產(chǎn)生錯誤,所以漢字和數(shù)字采用的字模 **
//** 在實際使用時需要改正,數(shù)字顯示函數(shù)也需改正,液晶驅(qū)動可能也需要隨控制器的不同而 **
//** 做適當(dāng)修改,鍵盤掃描可能也許根據(jù)實際情況修改,其他的函數(shù)均與硬件無關(guān)。 **
//**<缺 陷>:方塊類型不是隨機(jī)產(chǎn)生,記分部分過于簡單,游戲規(guī)則尚且貧乏,待改進(jìn)。雖經(jīng)不斷測試 **
//** 消除大量bug,但仍需改進(jìn)修正,懇請您的指正和合理建議。由于本人不熟悉C高級語法, **
//** 故程序中基本沒有出現(xiàn)高級語法,由于開始程序機(jī)構(gòu)和算法設(shè)計欠考慮,故程序有冗累贅, **
//** 效率低下的地方較多,請多多包涵,我對很大一部分已想出新算法。有改本程序或者想自 **
//** 寫本游戲者,我愿意無償提供技術(shù)支持。歡迎交流! **
//**<完成時間>:2007年9月5日 **
//**<作 者>:LastRitter **
//**<聯(lián)系方式>:E-mail:superyongzhe@163.com;QQ:314665354。 **
//*************************************************************************************************
//*************************************************************************************************
//*************************************************************************************************
//* *
//* ******************************頭文件及宏定義************************** *
//* *
//*************************************************************************************************
#include "includes.h"
#define TIME1H 0x3C
#define TIME1L 0xB0 //定時器1溢出時間:50ms
#define SCANPORT P1 //鍵盤接口。
//*************************************************************************************************
//* *
//* ******************************全局變量************************************ *
//* *
//*************************************************************************************************
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖動標(biāo)志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bit b_KeyShock=0; //鍵盤防抖動標(biāo)志位。
//當(dāng)按鍵中斷產(chǎn)生時,首先判斷此位。
//0--執(zhí)行鍵盤掃描及鍵碼處理程序;1--不執(zhí)行。
bit b_KillShock=0; //防抖標(biāo)志清除位:0--不清除;1--清除。
unsigned char uc_KillCount=0; //抖動標(biāo)志清除計數(shù),使用定時器1。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<鍵盤掃描開啟標(biāo)志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bit b_KeyScan=0; //0--不掃描;
//1--掃描。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<方塊定時下降>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bit b_BlockDown=0; //0-關(guān)閉定時器定時下降置位;1-開啟定時器定時下降置位。
bit b_DownStart=0; //0-關(guān)閉下降置位;1-開啟下降置位。
unsigned char uc_DownCount=0; //定時器定時計數(shù)。
//*************************************************************************************************
//* *
//* ********************************主函數(shù)****************************** *
//* *
//*************************************************************************************************
void main(void)
{
SCANPORT=0x0F; //初始化鍵盤。
vLCDInitialize(); //初始化LCD。
vGameInitialize(); //初始化游戲。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<外部中斷0,用于開啟鍵盤掃描及鍵碼處理標(biāo)志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IT0=1; // 中斷方式:下降沿。
EX0=1; // 開啟外部中斷。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時器1,用于防抖動標(biāo)志清除 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH1=TIME1H;
TL1=TIME1L;
TR1=1; //開啟定時器1
ET1=1; //開定時器1中斷
EA=1;
while(1)
{
if(b_KeyScan) //如果有按鍵按下,則進(jìn)行按鍵掃描和鍵碼處理。
{
b_KeyScan=0;
vKeyProcess(ucKeyScan());
}
if(b_BlockDown) //方塊定時下降。
{
b_BlockDown=0;
vBlockAction(ACTIONDOWN);
}
}
}
//*************************************************************************************************
//* *
//* ******************************外部中斷0,用于開啟鍵盤掃描及鍵碼處理****************** *
//* *
//*************************************************************************************************
void vINT0(void) interrupt 0
{
if(b_KeyShock==0)
{
b_KeyScan=1; //開啟鍵盤掃描標(biāo)志。
b_KeyShock=1; //設(shè)置防抖動標(biāo)志。
}
else b_KeyShock=0; //如果有抖動則不執(zhí)行鍵掃描,恢復(fù)防抖動標(biāo)志。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<設(shè)置防抖動清除標(biāo)志位 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(b_KeyShock==1)
b_KillShock=1; //如果防抖動標(biāo)志位開啟則開啟防抖動標(biāo)志清除位,
//300ms后清除防抖動標(biāo)志。
}
//*************************************************************************************************
//* *
//* **********************定時器1中斷,用于方塊定時下降和防抖動標(biāo)志清除****************** *
//* *
//*************************************************************************************************
void vTimer1(void) interrupt 3
{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<方塊定時下降>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(b_DownStart)
{
if(uc_DownCount==100)
{
uc_DownCount=0;
b_BlockDown=1;
}
else
uc_DownCount++;
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖動標(biāo)志清除>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(b_KillShock==1)
{
if(uc_KillCount==5) //當(dāng)防抖動標(biāo)志位為1時,計時300ms后清除抖動標(biāo)志位。
{
b_KeyShock=0;
b_KillShock=0;
uc_KillCount=0;
}
else uc_KillCount++;
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢復(fù)定時器1溢出時間>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH1=TIME1H;
TL1=TIME1L;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -