在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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)用 > 51單片機(jī)工程實(shí)踐--第3章 74HC595+ULN200

            51單片機(jī)工程實(shí)踐--第3章 74HC595+ULN200

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

            void timer0_interrupt(void) interrupt 1
            {
            ET0 = 0;
            EA = 0; // 經(jīng)測(cè)試 這里不關(guān)閉定時(shí)器中斷也沒(méi)有問(wèn)題 鴻哥這里關(guān)閉定時(shí)器中斷不知道是PIC單片機(jī)的特點(diǎn)還是其它原因

            key_scan(); // 按鍵掃描函數(shù)

            if(buzzer_time_cnt) // 控制蜂鳴器聲音的長(zhǎng)短
            {
            BUZZER_OUT = 0; // 開啟蜂鳴器
            --buzzer_time_cnt; // 蜂鳴器聲音長(zhǎng)短的計(jì)數(shù)延時(shí)
            }
            else
            {
            BUZZER_OUT = 1; // 關(guān)閉蜂鳴器
            }

            TH0 = 0xfe;
            TL0 = 0x33;

            ET0 = 1;
            EA = 1; // 前面關(guān)閉定時(shí)器中斷,這里當(dāng)然需要開啟
            }

            void interrupt_init(void)
            {
            TMOD = TMOD | 0x01;
            TMOD = TMOD & 0xFD;

            TH0 = 0xfe;
            TL0 = 0x33; // 定時(shí)0.5ms
            TR0 = 1;

            ET0 = 1; // 開啟外部中斷
            EA = 1; // 開啟總中斷
            }

            void key_scan(void)
            {

            switch(key_step)
            {
            case 1:// 按鍵掃描 1、2 號(hào)按鍵
            KEY_OUT1 = 0;// 按鍵列掃描 第一列輸出低電平
            KEY_OUT2 = 1;// 第二列輸出高電平
            delay_cnt2 = 0; // 延時(shí)計(jì)數(shù)器清零
            key_step++;// 切換到下一個(gè)步驟運(yùn)行

            break;

            case 2:
            delay_cnt2++;
            if(delay_cnt2>CNT_DELAY_CNT2)// 小延時(shí),但不是去抖動(dòng)延時(shí) 保證列輸出信號(hào)穩(wěn)定
            {
            delay_cnt2 = 0;
            key_step++;// 切換到下一個(gè)步驟運(yùn)行
            }

            break;

            case 3:
            if((1==KEY_IN1)&&(1==KEY_IN2))// 如果沒(méi)有按鍵按下,則2個(gè)IO輸入都是高電平
            {
            key_step++;// 如果沒(méi)有按鍵按下,下一個(gè)中斷掃描另外2個(gè)按鍵
            key_lock1 = 0;// 按鍵自鎖標(biāo)志清零
            delay_cnt1 = 0;// 按鍵去抖動(dòng)延時(shí)計(jì)數(shù)器清零,此處設(shè)計(jì)很巧妙
            }
            else if((0==KEY_IN1)&&(1==KEY_IN2)&&(0==key_lock1))
            {

            ++delay_cnt1;// 延時(shí)計(jì)數(shù)器

            if(delay_cnt1>CNT_DELAY_CNT1)// 延時(shí)計(jì)數(shù)器超過(guò)閥值
            {
            delay_cnt1 = 0;
            key_lock1 = 1;// 自鎖按鍵置位,避免一直觸發(fā),只有松開按鍵,才會(huì)被清零
            key_sec = 1;// 觸發(fā) 1 號(hào)按鍵
            }
            }

            else if((1==KEY_IN1)&&(0==KEY_IN2)&&(0==key_lock1))
            {
            ++delay_cnt1;
            if(delay_cnt1>CNT_DELAY_CNT1)
            {
            delay_cnt1 = 0;
            key_lock1 = 1;// 自鎖按鍵置位,避免一直觸發(fā),只有松開按鍵,才會(huì)被清零
            key_sec = 2;// 觸發(fā) 2 號(hào)按鍵
            }
            }

            break;

            case 4:// 掃描 3、4 號(hào)按鍵
            KEY_OUT1 = 1;// 第一列輸出高電平
            KEY_OUT2 = 0;// 按鍵列掃描,第二列輸出低電平
            delay_cnt2 = 0;// 延時(shí)計(jì)數(shù)器清零
            key_step++;// 切換到下一步運(yùn)行

            break;

            case 5:
            delay_cnt2++;
            if(delay_cnt2>CNT_DELAY_CNT2)// 小延時(shí),但不是去抖動(dòng)延時(shí) 保證列輸出信號(hào)穩(wěn)定
            {
            delay_cnt2 = 0;
            key_step++;// 切換到下一步運(yùn)行
            }

            break;

            case 6:
            if((1==KEY_IN1)&&(1==KEY_IN2))
            {
            key_step++;
            key_lock1 = 0;
            delay_cnt1 = 0;
            }
            else if((0==KEY_IN1)&&(1==KEY_IN2)&&(0==key_lock1))
            {
            ++delay_cnt1;
            if(delay_cnt1>CNT_DELAY_CNT1)
            {
            delay_cnt1 = 0;
            key_lock1 = 1;
            key_sec = 3;// 觸發(fā) 3 號(hào)按鍵
            }
            }
            else if((1==KEY_IN1)&&(0==KEY_IN2)&&(0==key_lock1))
            {
            ++delay_cnt1;
            if(delay_cnt1>CNT_DELAY_CNT1)
            {
            delay_cnt1 = 0;
            key_lock1 = 1;
            key_sec = 4;// 觸發(fā) 4 號(hào)按鍵
            }
            }

            break;
            }

            if(key_step>6)// 判斷,第一組與第二組按鍵反復(fù)輪流掃描
            {
            key_step = 1;
            }
            }

            void key_service(void)
            {
            switch(key_sec)
            {
            case 1:// 1 號(hào)按鍵
            relay_status_clear();// 把relay_status清零
            relay_status_set_1();// 把relay_status對(duì)應(yīng)的第一個(gè)繼電器啟動(dòng)
            relay_drive();// 把relay_status的狀態(tài)通過(guò)595驅(qū)動(dòng)出來(lái)
            buzzer_time_cnt = CNT_BUZZER_TIME;
            key_sec = 0;// 處理完相應(yīng)按鍵程序后,把按鍵選擇變量清零,避免一直觸發(fā)

            break;

            case 2: // 2 號(hào)按鍵
            relay_status_clear();// 把relay_status清零
            relay_status_set_2();// 把relay_status對(duì)應(yīng)的第一個(gè)繼電器啟動(dòng)
            relay_drive();// 把relay_status的狀態(tài)通過(guò)595驅(qū)動(dòng)出來(lái)
            buzzer_time_cnt = CNT_BUZZER_TIME;
            key_sec = 0;

            break;

            case 3:// 3 號(hào)按鍵
            relay_status_clear();// 把relay_status清零
            relay_status_set_3();// 把relay_status對(duì)應(yīng)的第一個(gè)繼電器啟動(dòng)
            relay_drive();// 把relay_status的狀態(tài)通過(guò)595驅(qū)動(dòng)出來(lái)
            buzzer_time_cnt = CNT_BUZZER_TIME;
            key_sec = 0;

            break;

            case 4:// 4 號(hào)按鍵
            relay_status_clear();// 把relay_status清零
            relay_status_set_4();// 把relay_status對(duì)應(yīng)的第一個(gè)繼電器啟動(dòng)
            relay_drive();// 把relay_status的狀態(tài)通過(guò)595驅(qū)動(dòng)出來(lái)
            buzzer_time_cnt = CNT_BUZZER_TIME;
            key_sec = 0;

            break;
            }
            }

            void relay_status_clear(void)
            {
            relay_status = 0;
            }

            void relay_status_set_1(void)
            {
            relay_status |= 0x0001;
            }

            void relay_status_set_2(void)
            {
            relay_status |= 0x0002;
            }

            void relay_status_set_3(void)
            {
            relay_status |= 0x0004;
            }

            void relay_status_set_4(void)
            {
            relay_status |= 0x0008;
            }

            void relay_drive(void)
            {
            u8 tempdata = 0;
            //u16 relay_status_temp = 0;

            HC595_SCK_OUT = 0;
            HC595_RCK_OUT = 0;

            //relay_status_temp = relay_status;

            for(tempdata=0; tempdata<16; tempdata++)
            {
            if(relay_status & 0x8000)
            {
            HC595_SI_OUT = 1;
            }
            else
            {
            HC595_SI_OUT = 0;
            }

            HC595_SCK_OUT = 0;
            _nop_();
            _nop_();
            HC595_SCK_OUT = 1;
            _nop_();
            _nop_();
            relay_status <<= 1;
            }

            HC595_RCK_OUT = 0;
            _nop_();
            _nop_();
            HC595_RCK_OUT = 1;
            _nop_();
            _nop_();

            HC595_SCK_OUT = 0;// 拉低,增強(qiáng)抗干擾
            HC595_RCK_OUT = 0;
            HC595_SI_OUT = 0;
            }

            void delay(void)
            {
            u8 t = 0;

            for(t=0; t<0x0F; t++)
            {;}
            }


            上一頁(yè) 1 2 下一頁(yè)

            關(guān)鍵詞: 51單片機(jī)74HC595ULN20

            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉