在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 8051單片機(jī)搶答器C程序

            8051單片機(jī)搶答器C程序

            作者: 時(shí)間:2016-11-13 來(lái)源:網(wǎng)絡(luò) 收藏
            #include

            /******************************************************************

            本文引用地址:http://www.biyoush.com/article/201611/316477.htm

            * 自定義Macro

            *******************************************************************/

            //編碼的均為反向編碼

            #define CLEAR 0x7f //定義清空的反碼

            #define LED_BEGIN 0x01 // 定義開(kāi)始時(shí)數(shù)碼管的顯示

            #define LED_FOUL 0x38 // 犯規(guī)后顯示字母"F",數(shù)碼管編碼

            #define LED_C 0x31 // 字母"C"的編碼

            #define LED_L 0x71 // 字母"L"的編碼,兩個(gè)用來(lái)在主持人取消之后顯示"CL"--cancel

            #define GET 1 // 這個(gè)是作為一個(gè)函數(shù)的參數(shù)來(lái)混的,就是成功搶答的意思

            #define FOUL 0 // 和上面的參數(shù)一起混的,犯規(guī)---這兩個(gè)的用法在后面體現(xiàn)

            #define READY 0x7e

            /******************************************************************

            * 自定義數(shù)據(jù)類(lèi)型

            *******************************************************************/

            typedef unsigned char Byte; // 一個(gè)字節(jié)

            typedef unsigned int Word; // 一個(gè)字,兩個(gè)字節(jié)

            typedef bit Bool; // 模仿布爾型變量

            //typedef sbit Port; // 本想用自定義一個(gè)端口類(lèi)型的變量,比較方便,但是這句話步知道為何通不過(guò)編譯

            /******************************************************************

            * 定義MAX7219寄存器

            *******************************************************************/

            #define REG_NO_OP 0x00 // 定義空操作 register

            #define DIG_1 0x01 // 定義數(shù)碼管1 register

            #define DIG_2 0x02 // 定義數(shù)碼管2 register

            #define DIG_3 0x03 // 定義數(shù)碼管3 register

            #define DIG_4 0x04 // 定義數(shù)碼管4 register

            #define DIG_5 0x05 // 定義數(shù)碼管5 register

            #define DIG_6 0x06 // 定義數(shù)碼管6 register

            #define DIG_7 0x07 // 定義數(shù)碼管7 register

            #define DIG_8 0x08 // 定義數(shù)碼管8 register

            #define REG_DECODE 0x09 // 定義解碼控制 register

            #define REG_INTENSITY 0x0a // 定義顯示亮度 register

            #define REG_SCAN_LIMIT 0x0b // 定義掃描限制 register

            #define REG_SHUTDOWN 0x0c // 定義"shutdown"模式 register

            #define REG_DISPLAY_TEST 0x0f // 定義"display test"模式 register

            #define INTENSITY_MIN 0x00 // 定義最低顯示亮度

            #define INTENSITY_MAX 0x0f // 定義最高顯示亮度

            /*********************************************************************

            * 定義硬件引腳連接

            **********************************************************************/

            sbit DATA=P2^0; // MAX7219的數(shù)據(jù)口

            sbit LOAD=P2^1; // MAX7219的鎖存端口

            sbit CLK=P2^2; // MAX7219的時(shí)鐘端口

            //sbit HOST_SWITCH=P0^0; // 主持人開(kāi)關(guān)的接口

            sbit HOST_START=P0^0; //主持人按鍵,用來(lái)重新開(kāi)始的按鍵 start

            sbit HOST_CANCEL=P0^1; //主持人用來(lái)取消搶答的按鍵 clear

            sbit SWITCH1_3=P1^4; // 調(diào)節(jié)倒計(jì)時(shí)時(shí)間的撥碼開(kāi)關(guān),下劃線前面的號(hào)代表開(kāi)關(guān)的序號(hào),下劃線后面的號(hào)代表該開(kāi)關(guān)的數(shù)值

            sbit SWITCH2_2=P1^5; // 同上

            sbit SWITCH3_2=P1^6; // 同上

            sbit SWITCH4_1=P1^7; // 同上

            sbit BEEP=P0^7; //定義蜂鳴器端口

            sbit LS138_C=P2^4; //定義譯碼器輸入端

            sbit LS138_B=P2^5; //同上

            sbit LS138_A=P2^6; //同上

            sbit LS138_E1=P2^7; //定義譯碼器使能端

            /*********************************************************************

            * 定義全局變量

            **********************************************************************/

            Byte data intrCounter; // 計(jì)時(shí)器中斷次數(shù)

            Byte data beginNum; // 開(kāi)始倒計(jì)時(shí)的時(shí)間

            Byte data counterBack; // 將中斷次數(shù)放在里面以備后用

            Byte data showNum; // 數(shù)碼管正在顯示的時(shí)間

            Bool data isStart; // 是否開(kāi)始搶答

            Bool data isFoul; // 是否犯規(guī)

            Bool data isPressed; // 是否有搶答的鍵按下

            Byte data number_temp; // 用來(lái)記錄P1口上次狀態(tài)的一個(gè)變量

            code unsigned char C51BOX2[3] _at_ 0x43;

            /***********************************************************************

            * 共陰極七段數(shù)碼管顯示對(duì)應(yīng)段查詢(xún)表(數(shù)字0-9分別對(duì)應(yīng)code_table[0]-[9])

            ***********************************************************************/

            Byte code code_table_zheng[10]=

            {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b};

            Byte code code_table[10]=

            {0x01,0x4f,0x12,0x06,0x4c,0x24,0x20,0x0f,0x00,0x04};

            /***********************************************************************

            * 函數(shù)聲明

            ***********************************************************************/

            void MAX7219_SendByte (Byte dataout);

            void MAX7219_Write (Byte reg_number, Byte dataout);

            void MAX7219_DisplayChar(Byte digit, Byte character);

            void MAX7219_Clear (void);

            void MAX7219_SetBrightness (Byte brightness);

            void MAX7219_DisplayTestStart (void);

            void MAX7219_DisplayTestStop (void);

            void MAX7219_ShutdownStart (void);

            void MAX7219_ShutdownStop (void);

            void MAX7219_Init (void);

            void Delay10ms(void);

            Bool GetHostStartKey (void);

            Bool GetHostCancelKey (void);

            void GetCounter(void);

            Byte GetPressed(Byte KeyState);

            void IT0_Init(void);

            void Timer0_Overflow();

            void PressedHandle(Byte keyPressed);

            void GetOrFoulHandle(Bool state);

            void CancelHandle();

            void SPEAKER_count (void); //聲明倒計(jì)時(shí)聲音函數(shù)

            void SPEAKER_start(void); //聲明開(kāi)始搶答聲音函數(shù)

            void SPEAKER_get(void); //聲明搶到聲音函數(shù)

            void SPEAKER_foul(void); // 聲明犯規(guī)聲音函數(shù)

            /***********************************************************************

            * MAX7219_SendByte()

            *

            * 描述: 向MAX7219傳送一個(gè)字節(jié)的數(shù)據(jù)

            * Arguments : dataout = data to send

            * Returns : none

            *************************************************************************/

            void MAX7219_SendByte (Byte dataout)

            {

            Byte i;

            for (i=8;i>0;i--)

            {

            Byte mask=1<<(i-1);//mask是個(gè)掩碼,取位使用

            CLK=0;//MAX7219的位傳入是在時(shí)鐘的上升沿之前,所以在每發(fā)一位之前都要變?yōu)榈碗娖?/p>

            if (dataout&mask)

            DATA=1;

            else

            DATA=0;

            CLK=1;//八個(gè)bit都傳遞完成后變?yōu)楦唠娖?鎖存

            }

            }

            /***********************************************************************

            * MAX7219_Write()

            *

            * 描述: 向 MAX7219 寫(xiě)命令

            * Arguments : reg_number = register to write to

            * dataout = data to write to MAX7219

            * Returns : none

            未完~

            ***************************************************************************/

            void MAX7219_Write (Byte reg_number, Byte dataout)

            {

            LOAD=0;//也是鎖存上升沿之前的,發(fā)這兩個(gè)字節(jié)之前要變?yōu)榈碗娖?/p>

            MAX7219_SendByte(reg_number);//發(fā)送寄存器地址

            MAX7219_SendByte(dataout);//發(fā)送數(shù)據(jù)

            LOAD=1;//變?yōu)楦唠娖?鎖存

            }

            /**************************************************************************

            * MAX7219_DisplayChar()

            *

            * 描述: 使某一位顯示一個(gè)數(shù)字

            * Arguments : digit = digit number (0-7)

            * character = character to display (0-9, A-Z)

            * Returns : none

            **************************************************************************/

            void MAX7219_DisplayChar(Byte digit, Byte character)

            {

            MAX7219_Write(digit, character);

            }

            /**************************************************************************

            * MAX7219_Clear()

            *

            * 描述: 清除所有位的顯示

            * Arguments : none

            * Returns : none

            ***************************************************************************/

            void MAX7219_Clear (void)

            {

            Byte i;

            for (i=1; i<=2; i++)

            MAX7219_Write(i, CLEAR);//把八個(gè)數(shù)碼管全都清零了,已經(jīng)寫(xiě)反了^_^

            }

            /**************************************************************************

            * MAX7219_SetBrightness()

            *

            * 描述: 設(shè)置數(shù)碼管顯示亮度

            * Arguments : brightness (0-15)

            * Returns : none

            ***************************************************************************/

            void MAX7219_SetBrightness (Byte brightness)

            {

            brightness &= 0x0f;

            MAX7219_Write(REG_INTENSITY, brightness);

            }

            /**************************************************************************

            * MAX7219_DisplayTestStart()

            *

            * 描述: 進(jìn)入 test 模式

            * Arguments : none

            * Returns : none

            ***************************************************************************/

            void MAX7219_DisplayTestStart (void)

            {

            MAX7219_Write(REG_DISPLAY_TEST, 1);

            }

            /**************************************************************************

            * MAX7219_DisplayTestStop()

            *

            * 描述: 退出 test 模式

            * Arguments : none

            * Returns : none

            ***************************************************************************/

            void MAX7219_DisplayTestStop (void)

            {

            MAX7219_Write(REG_DISPLAY_TEST, 0);

            }

            /**************************************************************************

            * MAX7219_ShutdownStart()

            *

            * 描述: 進(jìn)入 shutdown 模式

            * Arguments : none

            * Returns : none

            ***************************************************************************/

            void MAX7219_ShutdownStart (void)

            {

            MAX7219_Write(REG_SHUTDOWN, 0);

            }

            /**************************************************************************

            * MAX7219_ShutdownStop()

            *

            * 描述: 退出 shutdown 模式

            * Arguments : none

            * Returns : none

            ***************************************************************************/

            void MAX7219_ShutdownStop (void)

            {

            MAX7219_Write(REG_SHUTDOWN, 1);

            }

            /**************************************************************************

            * MAX7219_Init()

            *

            * Description: MAX7219初始化模塊; 應(yīng)該先于其他MAX7219函數(shù)而被調(diào)用

            * Arguments : none

            * Returns : none

            ***************************************************************************/

            void MAX7219_Init (void)

            {

            DATA=1;

            CLK=1;

            LOAD=1;

            MAX7219_Write(REG_SCAN_LIMIT,1);//這里設(shè)置的是掃描兩個(gè)數(shù)碼管

            MAX7219_Write(REG_DECODE, 0x00);

            MAX7219_SetBrightness(INTENSITY_MAX);//設(shè)置最大亮度顯示

            MAX7219_DisplayTestStart();

            MAX7219_DisplayTestStop();

            MAX7219_ShutdownStop();

            MAX7219_Clear();

            }

            /**************************************************************************

            * Delay_100us()

            *

            * 描述: 延時(shí)100us,主要用在消除開(kāi)關(guān)抖動(dòng)時(shí)

            * Arguments : none

            * Returns : none

            ***************************************************************************/

            void Delay10ms(void)

            {

            unsigned char i,j;

            for(i=20;i>0;i--)

            for(j=248;j>0;j--);

            }

            /**************************************************************************

            * GetHostStartKey()

            *

            * Description: 取得主持人開(kāi)始按鍵的鍵值

            * Arguments : none

            * Returns : 1-->主持人按鍵; 0-->主持人未按鍵

            ***************************************************************************/

            Bool GetHostStartKey (void)

            {

            if (HOST_START ==1)

            return 0;

            else

            Delay10ms ();//如果發(fā)現(xiàn)主持人按鍵接通,要先延時(shí)100us,防止抖動(dòng)

            if (HOST_START==1)

            return 0;

            else

            return 1;//延時(shí)時(shí)候還是接通,則判斷為該鍵確實(shí)按下

            }

            /**************************************************************************

            * GetHostCancelKey()

            *

            * Description: 取得主持人取消按鍵的鍵值

            * Arguments : none

            * Returns : 1-->主持人按鍵; 0-->主持人未按鍵

            ***************************************************************************/

            Bool GetHostCancelKey (void)

            {

            if (HOST_CANCEL ==1)

            return 0;

            else

            Delay10ms ();//如果發(fā)現(xiàn)主持人按鍵接通,要先延時(shí)100us,防止抖動(dòng)

            if (HOST_CANCEL ==1)

            return 0;

            else

            return 1;//延時(shí)時(shí)候還是接通,則判斷為該鍵確實(shí)按下

            }

            /**************************************************************************

            * GetCounter

            *

            * Description: 取得預(yù)先設(shè)置的倒計(jì)時(shí)時(shí)間

            * Arguments : none

            * Returns : none

            ***************************************************************************/

            void GetCounter(void)

            {

            beginNum=1;//在所有開(kāi)關(guān)都沒(méi)有撥動(dòng)的時(shí)候倒計(jì)時(shí)為1秒,比設(shè)置為0秒要好

            intrCounter=20;//每一秒對(duì)應(yīng)的中斷次數(shù)為20次

            if (SWITCH1_3==1)

            {

            beginNum+=3;

            }

            if (SWITCH2_2==1)

            {

            beginNum+=2;

            }

            if (SWITCH3_2==1)

            {

            beginNum+=2;

            }

            if (SWITCH4_1==1)

            {

            beginNum+=1;

            }//以上判斷語(yǔ)句為判斷撥碼開(kāi)關(guān)狀態(tài)

            intrCounter=20*beginNum;//計(jì)算總掃描次數(shù)

            }

            /**************************************************************************

            * GetPressed

            *

            * Description: 從P1口連接搶答端的四位來(lái)判斷搶答情況

            * Arguments : Byte KeyState-->P1 state

            * Returns : 搶答端的號(hào)碼 ; 0-->沒(méi)人搶答

            ***************************************************************************/

            Byte GetPressed(Byte KeyState)

            {

            Byte key;//記錄搶答端的號(hào)碼

            KeyState&=0x0f;//取P1口的低四位

            switch (KeyState)

            {

            case 0x0f: key=0;break;//全高,無(wú)人搶答

            case 0x0e: key=1;break;//只有P1.1,key1搶答

            case 0x0d: key=2;break;//只有P1.2,key2搶答

            case 0x0b: key=3;break;//只有P1.3,key3搶答

            case 0x07: key=4;break;//只有P1.4,key4搶答

            }

            /*

            switch (KeyState)

            {

            case 0x00: key=0;break;//全高,無(wú)人搶答

            case 0x01: key=1;break;//只有P1.0,key1搶答

            case 0x02: key=2;break;//只有P1.1,key2搶答

            case 0x04: key=3;break;//只有P1.2,key3搶答

            case 0x08: key=4;break;//只有P1.3,key4搶答

            }

            */

            //上面是在用高電平來(lái)判斷搶答狀態(tài)時(shí)的程序,經(jīng)證明不知道為何無(wú)效

            return key;

            }

            /**************************************************************************

            * IT0_Init

            *

            * Description: 初始化計(jì)時(shí)器T0的狀態(tài)

            * Arguments : none

            * Returns : none

            ***************************************************************************/

            void IT0_Init(void)

            {

            TMOD=0x01;//設(shè)置T0在方式1下工作

            TH0=0x3C;

            TL0=0xAF;//這兩個(gè)寄存器存的是計(jì)數(shù)器的計(jì)數(shù)開(kāi)始的值,計(jì)算發(fā)現(xiàn)這兩個(gè)值累加至溢出后正好是50ms

            ET0=1;//使T0中斷可以溢出

            EA=1;//開(kāi)啟總中斷

            TF0=0;//溢出位清零

            TR0=1;//開(kāi)啟T0

            }

            /**************************************************************************

            * Timer0_Overflow() interrupt 1

            *

            * Description: 中斷溢出服務(wù)程序, 采用的是中斷方式1, 后面最好不加using選擇寄存器組以免與系統(tǒng)用在主程序的寄存器沖突

            * Arguments : none

            * Returns : none

            ***************************************************************************/

            void Timer0_Overflow() interrupt 1

            {

            static Byte second=20;//用20次中斷來(lái)判斷1秒

            TH0=0x3C;

            TL0=0xAF;

            second--;

            intrCounter--;

            /*

            if (second==0)//每隔一秒的操作

            {

            MAX7219_DisplayChar(DIG_2,code_table[--showNum]); //要避免用上面的會(huì)造成顯示"0"后面一秒鐘,才進(jìn)入開(kāi)始

            second=20;//重新賦值每秒計(jì)數(shù)器

            if (intrCounter==0)

            {

            TR0=0;//關(guān)閉T0計(jì)數(shù)器

            isStart=1;//計(jì)時(shí)結(jié)束,進(jìn)入正常搶答

            //SPEAKER_start();//開(kāi)始搶答的聲音

            }

            //待顯示"0"以后就開(kāi)始搶答

            else

            {

            //SPEAKER_count();//倒計(jì)時(shí)聲音

            }

            }

            */

            if (second==0)//每隔一秒的操作

            {

            //if (showNum!=1) SPEAKER_count();//倒計(jì)時(shí)聲音

            //else SPEAKER_start();//開(kāi)始搶答的聲音

            MAX7219_DisplayChar(DIG_2,code_table[--showNum]);//顯示數(shù)字

            second=20;//重新賦值每秒計(jì)數(shù)器

            }//待顯示"0"以后就開(kāi)始搶答

            if (intrCounter==0)

            {

            TR0=0;//關(guān)閉T0計(jì)數(shù)器

            isStart=1;//計(jì)時(shí)結(jié)束,進(jìn)入正常搶答

            }

            }

            /**************************************************************************

            * PressedHandle

            *

            * Description: 按鍵處理

            * Arguments : Byte keyPressed-->按下的按鍵

            * Returns : none

            ***************************************************************************/

            void PressedHandle(Byte keyPressed)

            {

            MAX7219_Clear();//LED clear

            MAX7219_DisplayChar(DIG_2,code_table[keyPressed]);//在右側(cè)數(shù)碼管顯示搶答選手號(hào)碼,此時(shí)沒(méi)有去判斷是否犯規(guī)

            }

            /**************************************************************************

            * GetOrFoulHandle(Bool state)

            *

            * Description: 正常搶答或是犯規(guī)處理

            * Arguments : Bool state-->是GET和FOUL兩個(gè)宏的取之之一

            * Returns : none

            ***************************************************************************/

            void GetOrFoulHandle(Bool state)

            {

            if (!state)

            {

            MAX7219_DisplayChar(DIG_1,LED_FOUL);//如果是犯規(guī)的話左邊的LED要顯示"F",foul

            }

            }

            /**************************************************************************

            * CancelHandle()

            *

            * Description: 處理主持人取消倒計(jì)時(shí)

            * Arguments : none

            * Returns : none

            ***************************************************************************/

            void CancelHandle()

            {

            MAX7219_DisplayChar(DIG_1,LED_C);

            MAX7219_DisplayChar(DIG_2,LED_L);//主持人取消倒計(jì)時(shí)之后,兩個(gè)數(shù)碼管顯示"CL"-->cancel

            }

            /**************************************************************************

            * delayus()

            *

            * Description: 延時(shí)程序

            * Arguments : t-->us

            * Returns : time delayed

            ***************************************************************************/

            void delayus(unsigned char t )

            {

            unsigned char j;

            for(;t>0;t--)

            for(j=19;j>0;j--);

            }

            /**************************************************************************

            * SPEAKER_count/start/foul/get()

            *

            * Description: speaker發(fā)聲程序->計(jì)數(shù)/開(kāi)始/犯規(guī)/搶答 四種聲音

            * Arguments : none

            * Returns : none

            ***************************************************************************/

            void SPEAKER_count(void)

            {

            unsigned char i;

            for (i=0;i<10;i++)

            {

            BEEP =1; //點(diǎn)亮

            delayus(20);

            BEEP =0; //熄滅

            delayus(20);

            }

            }

            void SPEAKER_start(void)

            {

            unsigned char i;

            for(i=0;i<200;i++)

            {

            BEEP =1; //點(diǎn)亮

            delayus(10);

            BEEP =0; //熄滅

            delayus(10);

            }

            }

            void SPEAKER_foul(void)

            {

            unsigned char i;

            for(i=0;i<250;i++)

            {

            BEEP =1; //點(diǎn)亮

            delayus(15);

            BEEP =0; //熄滅

            delayus(17);

            }

            }

            void SPEAKER_get(void)

            {

            unsigned char i;

            for(i=0;i<250;i++)

            {

            BEEP =1; //點(diǎn)亮

            delayus(10);

            BEEP =0; //熄滅

            delayus(10);

            }

            for(i=0;i<250;i++)

            {

            BEEP =1; //點(diǎn)亮

            delayus(20);

            BEEP =0; //熄滅

            delayus(20);

            }

            }

            /**************************************************************************

            * 主程序

            ***************************************************************************/

            void main()

            {

            Byte keyPressed,i;//選手按鍵號(hào)碼,沒(méi)有的話為0

            Bool hostPressed;//用來(lái)記錄主持人按鍵取消,0為沒(méi)有動(dòng)作,1為取消

            number_temp=P1&0xf0;//P1口上次的狀態(tài),在調(diào)整倒計(jì)時(shí)時(shí)間的時(shí)候用到的

            LS138_E1=1; //譯碼器初始化

            MAX7219_Init();//數(shù)碼管初始化

            GetCounter();//獲取開(kāi)始時(shí)候設(shè)置的倒計(jì)時(shí)時(shí)間

            MAX7219_DisplayChar(DIG_1,code_table[beginNum]);//顯示開(kāi)始時(shí)設(shè)置的倒計(jì)時(shí)時(shí)間,在左位設(shè)置

            MAX7219_DisplayChar(DIG_2,READY);//調(diào)時(shí)間的時(shí)候右位的顯示

            //while(1);

            while(GetHostStartKey()==0)//當(dāng)主持人沒(méi)有按鍵的時(shí)候進(jìn)入循環(huán)

            {

            if (number_temp!=(P1&0xf0))//若調(diào)整了倒計(jì)時(shí)時(shí)間,則P1口狀態(tài)變了,就要重新設(shè)置和顯示

            {

            GetCounter();//獲取調(diào)整以后的倒計(jì)時(shí)時(shí)間

            MAX7219_DisplayChar(DIG_1,code_table[beginNum]);//顯示調(diào)整以后的倒計(jì)時(shí)時(shí)間

            number_temp=P1&0xf0;//記錄下來(lái)現(xiàn)在P1口的狀態(tài),以備后面的比較

            }

            } //當(dāng)主持人按鍵以后就結(jié)束調(diào)整進(jìn)入搶答倒計(jì)時(shí)

            MAX7219_DisplayChar(DIG_1,READY);

            while(GetHostCancelKey()==0);

            MAX7219_DisplayChar(DIG_1,READY);//清空右邊一位數(shù)碼管

            MAX7219_DisplayChar(DIG_2,code_table[beginNum]);

            for (i=100;i--;i>0)

            Delay10ms();//防止后面出現(xiàn)連讀的情況..

            //調(diào)整好倒計(jì)時(shí)時(shí)間后,按下start顯示"--",再按下cancel則顯示倒計(jì)時(shí)時(shí)間,此時(shí)可以開(kāi)始倒計(jì)時(shí)了.

            counterBack=intrCounter;

            //這里原來(lái)寫(xiě)的是while(1),寫(xiě)上后就不行了,不知道為何..

            while(1)//這里要用自己加的循環(huán)來(lái)把程序束縛在這里運(yùn)行

            {

            showNum=beginNum;//設(shè)置要顯示的時(shí)間,當(dāng)然時(shí)從倒計(jì)時(shí)時(shí)間開(kāi)始

            intrCounter=counterBack;//設(shè)置總中斷的次數(shù)

            TR0=0;//禁用計(jì)時(shí)器0

            isPressed=0;//記錄是否有人按鍵

            isStart=0;//沒(méi)有開(kāi)始搶答

            while(GetHostStartKey()==0);

            IT0_Init();//初始化計(jì)時(shí)器0, 啟用.

            MAX7219_DisplayChar(DIG_1,CLEAR);//清空左邊一位數(shù)碼管

            MAX7219_DisplayChar(DIG_2,code_table[beginNum]);

            while(!isPressed)//如果沒(méi)有記錄到有人按鍵就進(jìn)入

            {

            keyPressed=GetPressed(P1);//查詢(xún)一下P1口的狀態(tài),即按鍵情況

            hostPressed=GetHostCancelKey();

            if (!keyPressed&&!hostPressed)//如果沒(méi)有人按鍵,就進(jìn)入下次循環(huán)

            continue;

            else

            {

            TR0=0;//關(guān)閉定時(shí)器

            isPressed=1;//記錄到有人按鍵,提供條件跳出循環(huán)

            }

            }

            if (keyPressed!=0)

            {

            if (isStart)//如果已經(jīng)開(kāi)始搶答

            {

            PressedHandle(keyPressed);//處理按鍵,即顯示搶答選手號(hào)碼

            GetOrFoulHandle(GET);//處理?yè)尨?/p>

            LS138_E1=0; //譯碼器準(zhǔn)備工作

            switch (keyPressed)

            {

            case 1: LS138_A=0;LS138_B=0;LS138_C=0;break; //1號(hào)成功燈亮

            case 2: LS138_A=0;LS138_B=1;LS138_C=0;break; //2號(hào)成功燈亮

            case 3: LS138_A=1;LS138_B=0;LS138_C=0;break; //3號(hào)成功燈亮

            case 4: LS138_A=1;LS138_B=1;LS138_C=0;break; //4號(hào)成功燈亮

            default : break;

            }

            //SPEAKER_get();//處理?yè)尨?/p>

            }

            else//否則,沒(méi)有開(kāi)始搶答

            {

            PressedHandle(keyPressed);//處理按鍵,即顯示搶答選手號(hào)碼

            GetOrFoulHandle(FOUL);//處理犯規(guī),必須要放在后面,因?yàn)轱@示數(shù)字的里面有一個(gè)clear

            LS138_E1=0; //譯碼器準(zhǔn)備工作

            switch (keyPressed)

            {

            case 1: LS138_A=0;LS138_B=0;LS138_C=1;break; //1號(hào)犯規(guī)燈亮

            case 2: LS138_A=0;LS138_B=1;LS138_C=1;break; //2號(hào)犯規(guī)燈亮

            case 3: LS138_A=1;LS138_B=0;LS138_C=1;break; //3號(hào)犯規(guī)燈亮

            case 4: LS138_A=1;LS138_B=1;LS138_C=1;break; //4號(hào)犯規(guī)燈亮

            default : break;

            }

            //SPEAKER_foul();//犯規(guī)發(fā)聲

            }

            }

            if (hostPressed==1)

            {

            CancelHandle();

            for (i=100;i--;i>0)

            Delay10ms();//防止后面出現(xiàn)連讀的情況..

            }

            while(GetHostCancelKey()==0);//如果主持人沒(méi)有按鍵再次開(kāi)始,則停在次死循環(huán)處

            LS138_E1=1; //關(guān)閉譯碼器

            MAX7219_DisplayChar(DIG_1,READY);//清空右邊一位數(shù)碼管

            MAX7219_DisplayChar(DIG_2,code_table[beginNum]);//左位顯示設(shè)置的倒計(jì)時(shí)時(shí)間

            //到這里一次循環(huán)結(jié)束

            }

            }



            關(guān)鍵詞: 8051單片機(jī)搶答

            評(píng)論


            技術(shù)專(zhuān)區(qū)

            關(guān)閉