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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2208|回復: 1
打印 上一主題 下一主題
收起左側

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)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:366752 發表于 2018-7-8 02:27 來自觸屏版 | 只看該作者
謝謝分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表