欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 51單片機按鍵的幾種驅動方法 以藍橋杯的單片機板子作為參考 [打印本頁]

作者: sinply    時間: 2018-7-5 14:56
標題: 51單片機按鍵的幾種驅動方法 以藍橋杯的單片機板子作為參考
這里以藍橋杯的單片機板子作為參考
法一:查詢方式
    只要查詢其引腳電平是否發生變化,就可以判斷按鍵是否被按下。


其具體的實現函數為:
//按鍵掃描函數
uchar key_scan(void)
{
        uchar key;
        P3 &= 0x0F;
        switch (P3)
        {
                case 0x0E:
                        key = 7;
                        break;
                case 0x0D:
                        key = 6;
                        break;
                case 0x0B:
                        key = 5;
                        break;
                case 0x07:
                        key = 4;
                        break;
                default:
                        key = 0x0F;        
                        break;
        }
        return key;
}

void key_action(void)
{
        uchar key;
        key = key_scan();
        if(key != 0x0F)
        {
                delay_ms(10);
                key = key_scan();
                if(key != 0x0F)
                {
                        switch(key)
                        {
                                case 7:
                                        led_on();
                                        break;
                                case 6:
                                        led_off();
                                        break;
                                case 5:
                                        relay_on();
                                        break;
                                case 4:
                                        relay_off();
                                        break;
                                default:
                                        break;
                        }
                        while(P3 != 0x0F);
                }
               
        }
}

法二:中斷方式
    中斷方式的區別在于對改端口的引腳變化進行實時檢測,從而及時地判斷引腳是否被按下。
其具體的實現函數為:
void int0_handler(void) interrupt 1
{
        static ms_count = 0;
        if(++ms_count == 10)                //10ms進行按鍵檢測
        {
                ms_count = 0;
                key_flag = 1;
        }
        display();
}

void key_check(void)
{
        uchar key = 0;
        static bit key_ready = 0;                //按鍵數據存儲完畢標志位
        static uchar key_save = 0;                //保存鍵值
        static uchar key_time = 0;                //記錄按鍵的次數
        if(key = key_scan())
        {
                key_time ++;
                if(key_time == KEY_LAST)
                {
                        key_time = 0;
                        key_ready = 1;
                        key_save = key;
                }
        }
        else if(!(key_scan()) && (key_ready == 1))        //wait for key up
        {
                key_ready = 0;
                key_action(key_save);
        }
}

具體工程情況詳見附件。

7.int_control_display.zip (35.55 KB, 下載次數: 7) 3.key.zip (29.64 KB, 下載次數: 5)


作者: zhd000    時間: 2018-7-8 02:27
謝謝分享




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1