新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機學習之5-獨立按鍵和矩陣鍵盤

        51單片機學習之5-獨立按鍵和矩陣鍵盤

        作者: 時間:2016-11-30 來源:網絡 收藏

        第一步,我們先確定列,給P3口賦值0xF0=11110000,那么P37、P36、P35、P34都被置1,P33、P32、P31、P30都被置0,當S6被按下時,由于S6按鈕的一邊P31為0,所以跟S6另一邊相連的P35被拉低,即等于0。如下圖

        此時得到列的值P3=11010000=0xD0,在程序中只需要判斷P3是否等于0xF0,不等說明有按鍵按下。

        第二步,不改變高四位的狀態:1101將低四位全部置1(P3=P3|0x0F)。這時候就變成了11011111,由于單片機掃描列的時候速度非常快,到現在掃描行的時候,按鍵仍處在按下狀態(人的反應沒有單片機快)。S6被按下,由于與S6相連的P35為低電平(即0),所以P31由高電平(即1)變成低電平(即0)如下圖

        此時得到的值為P3=11011101=S6被按下。這就是檢測原理。

        完整程序:

        #include

        #defineuintunsignedint

        #defineucharunsignedchar

        sbitLed=P1^0;

        sbitLed1=P1^1;

        voiddelay(uintz);

        /********主函數********/

        voidmain()

        {

        ucharKey_Temp;

        ucharKey;//Key鍵值

        while(1)

        {

        Key=0;//清0

        P3=0xF0;

        Key_Temp=P3;

        Key_Temp&=0xF0;//只取高四位這句需要,因為51IO只是準雙向要使其具備輸入功能需要用置1

        if(0xF0!=Key_Temp)//判斷是否有按鍵按下

        {

        delay(10);//延時一段時間跳過抖動的時間

        Key_Temp=P3&0xF0;//先取P3然后和0xF0與運算得到高四位

        if(0xF0!=Key_Temp)//再次判斷是否確實按下

        {

        P3=Key_Temp|0x0F;//保留高四位將低四位全部置1并輸出

        Key=P3;//再讀入

        }

        }

        switch(Key)

        {

        case0xEE:Led=0;break;//S1

        case0xDE:Led1=0;break;

        case0xBE:break;

        case0x7E:break;

        case0xED:break;

        case0xDD:break;

        case0xBD:break;

        case0x7D:break;

        case0xEB:break;

        case0xDB:break;

        case0xBB:break;

        case0x7B:break;

        case0xE7:break;

        case0xD7:break;

        case0xB7:break;

        case0x77:break;//S16

        default:

        Led=Led1=1;

        }

        }

        }

        voiddelay(uintz)

        {

        uintx,y;

        for(x=z;x>0;x--)

        for(y=110;y>0;y--);

        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 黎城县| 沾化县| 颍上县| 石景山区| 四会市| 惠水县| 诸城市| 屏东县| 启东市| 许昌市| 改则县| 甘谷县| 常熟市| 大同县| 内丘县| 大厂| 青河县| 乌兰浩特市| 武汉市| 巴彦淖尔市| 台中县| 余庆县| 瓮安县| 弥勒县| 宝坻区| 武陟县| 布尔津县| 石渠县| 新化县| 上虞市| 葵青区| 金寨县| 华宁县| 闻喜县| 明水县| 南雄市| 江川县| 弥渡县| 永靖县| 九龙城区| 额尔古纳市|