久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求大神給資源,矩陣鍵盤遇到了問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:222622 發表于 2017-8-4 15:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
剛接觸單片機,矩陣鍵盤遇到了問題,哪位大神給個詳細的單片機矩陣鍵盤那方面的知識點。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2017-8-4 18:26 | 只看該作者
給你一個4*4矩陣鍵盤例程,有詳細注釋。
#include <AT89X52.H>
#define uint unsigned int                 //宏定義無符號整型數據
#define uchar unsigned char         //宏定義無符號字符型數據
uchar key=0;                                        //定義鍵值變量

void keyscan()                                        //按鍵掃描程序
{
        static bit sign=0;                        //按鍵有效標志
        static uchar count=0;                //消抖計數變量                       
        uchar num=0;
        P3=0xf0;                                        //賦值P3 1111 0000
        if((P3!=0xf0)&&(sign==0))        //檢測按鍵如果為0
        {
                count++;                                //消抖計數
                if(count>=100)                        //100次檢測按鍵如果為0
                {                       
                        count=100;                        //防止溢出
                        sign=1;                                //按鍵有效標志置1
                        num=P3;                                //保存P3值xxxx 0000,x為0或1
                        num=num|0x0f;                //保存num按位或0x0f值xxxx 1111
                        P3=num;                                //賦值P3 xxxx 1111
                        num=P3;                                //保存P3值xxxx xxxx
                        switch(num)
                        {
                                case 0xee: key= 1; break;
                                case 0xde: key= 2; break;
                                case 0xbe: key= 3; break;
                                case 0x7e: key= 4; break;
                                case 0xed: key= 5; break;
                                case 0xdd: key= 6; break;
                                case 0xbd: key= 7; break;
                                case 0x7d: key= 8; break;
                                case 0xeb: key= 9; break;
                                case 0xdb: key=10; break;
                                case 0xbb: key=11; break;
                                case 0x7b: key=12; break;
                                case 0xe7: key=13; break;
                                case 0xd7: key=14; break;
                                case 0xb7: key=15; break;
                                case 0x77: key=16; break;
                        }
                }
        }
        else
        {
                sign=0;                                        //按鍵有效標志清0
                count=0;                                //消抖計數清0
        }
}
void main()                                                //主函數
{
        while(1)
        {
                keyscan();                                //按鍵掃描程序
                P1=~key;                                //LED顯示鍵碼1~16,低電平亮
        }
}
回復

使用道具 舉報

板凳
ID:193899 發表于 2017-8-4 19:46 | 只看該作者
     51單片機之獨立按鍵和矩陣鍵盤(概念及原理)
1.按鍵分類與輸入原理

        按鍵按照結構原理科分為兩類,一類是觸點式開關按鍵,如機械式開關、導電橡膠式開關燈;另一類是無觸點式開關按鍵,如電氣式按鍵,磁感應按鍵等。前者造價低,后者壽命長。目前,微機系統中最常見的是觸點式開關按鍵。

        在單片機應用系統中,除了復位按鍵有專門的復位電路及專一的復位功能外,其他按鍵都是以開關狀態來設置控制功能或輸入數據的。當所設置的功能鍵或數字鍵按下時,計算機應用系統應完成該按鍵所設定的功能,鍵信息輸入時與軟件結構密切相關的過程。


         對于一組鍵或一個鍵盤,總有一個接口電路與CPU相連。CPU可以采用查詢或中斷方式了解有無將按鍵輸入,并檢查是哪一個按鍵按下,將該鍵號送人累加器,然后通過跳轉指令轉入執行該鍵的功能程序,執行完成后再返回主程序。


        2.按鍵結構與特點

        微機鍵盤通常使用機械觸點式按鍵開關,其主要功能式把機械上的通斷轉換為電氣上的邏輯關系。也就是說,它能提供標準的TTL邏輯電平,以便于通用數字系統的邏輯電平相容。機械式按鍵再按下或釋放時,由于機械彈性作用的影響,通常伴隨有一定的時間觸點機械抖動,然后其觸點才穩定下來。其抖動過程如下圖1所示,抖動時間的長短與開關的機械特性有關,一般為5-10ms。在觸點抖動期間檢測按鍵的通與斷,可能導致判斷出錯,即按鍵一次按下或釋放錯誤的被認為是多次操作,這種情況是不允許出現的。為了克服你、按鍵觸點機械抖動所致的檢測誤判,必須采取消抖措施。按鍵較少時,可采用硬件消抖;按鍵較多式,采用軟件消抖。




圖1  按鍵觸點機械抖動

        (1)按鍵編碼

         一組按鍵或鍵盤都要通過I/O口線查詢按鍵的開關狀態。根據鍵盤結構的不同,采用不同的編碼。無論有無編碼,以及采用什么編碼,最后都要轉換成為與累加器中數值相對應的鍵值,以實現按鍵功能程序的跳轉。

       (2)鍵盤程序

         一個完整的鍵盤控制程序應具備以下功能:

          a.檢測有無按鍵按下,并采取硬件或軟件措施消抖。

          b.有可靠的邏輯處理辦法。每次只處理一個按鍵,期間對任何按鍵的操作對系統不產生影響,且無論一次按鍵時間有多長,系統僅執行一次按鍵功能程序。

          c.準確輸出按鍵值(或鍵號),以滿足跳轉指令要求。

        3.獨立按鍵與矩陣鍵盤

       (1)獨立按鍵

        單片機控制系統中,如果只需要幾個功能鍵,此時,可采用獨立式按鍵結構。

        獨立按鍵式直接用I/O口線構成的單個按鍵電路,其特點式每個按鍵單獨占用一根I/O口線,每個按鍵的工作不會影響其他I/O口線的狀態。獨立按鍵的典型應用如圖所示。獨立式按鍵電路配置靈活,軟件結構簡單,但每個按鍵必須占用一個I/O口線,因此,在按鍵較多時,I/O口線浪費較大,不宜采用。獨立按鍵如圖2所示。




圖2  獨立鍵盤

        獨立按鍵的軟件常采用查詢式結構。先逐位查詢沒跟I/O口線的輸入狀態,如某一根I/O口線輸入為低電平,則可確認該I/O口線所對應的按鍵已按下,然后,再轉向該鍵的功能處理程序。

       (2)矩陣鍵盤

        單片機系統中,若使用按鍵較多時如電子密碼鎖、電話機鍵盤等一般都至少有12到16個按鍵,通常采用矩陣鍵盤。

矩陣鍵盤又稱行列鍵盤,它是用四條I/O線作為行線,四條I/O線作為列線組成的鍵盤。在行線和列線的每個交叉點上設置一個按鍵。這樣鍵盤上按鍵的個數就為4*4個。這種行列式鍵盤結構能有效地提高單片機系統中I/O口的利用率。



    矩陣鍵盤的工作原理

    最常見的鍵盤布局如圖3所示。一般由16個按鍵組成,在單片機中正好可以用一個P口實現16個按鍵功能,這也是在單片機系統中最常用的形式,4*4矩陣鍵盤的內部電路如圖4所示。



圖3 矩陣鍵盤布局圖




圖4 矩陣鍵盤內部電路圖         

   


    當無按鍵閉合時,P3.0~P3.3與P3.4~P3.7之間開路。當有鍵閉合時,與閉合鍵相連的兩條I/O口線之間短路。判斷有無按鍵按下的方法是:第一步,置列線P3.4~P3.7為輸入狀態,從行線P3.0~P3.3輸出低電平,讀入列線數據,若某一列線為低電平,則該列線上有鍵閉合。第二步,行線輪流輸出低電平,從列線P3.4~P3.7讀入數據,若有某一列為低電平,則對應行線上有鍵按下。綜合一二兩步的結果,可確定按鍵編號。但是鍵閉合一次只能進行一次鍵功能操作,因此須等到按鍵釋放后,再進行鍵功能操作,否則按一次鍵,有可能會連續多次進行同樣的鍵操作。  


   


    識別按鍵的方法很多其中,最常見的方法是掃描法

    按鍵按下時,與此鍵相連的行線與列線導通,行線在無按鍵按下時處在高電平。如果所有的列線都處在高電平,則按鍵按下與否不會引起行線電平的變化,因此必須使所有列線處在電平。這樣,當有按鍵按下時,改鍵所在的行電平才回由高變低。才能判斷相應的行有鍵按下。

    獨立按鍵數量少,可根據實際需要靈活編碼。矩陣鍵盤,按鍵的位置由行號和列號唯一確定,因此可以分別對行號和列號進行二進制編碼,然后兩值合成一個字節,高4位是行號,低4位是列號。

    4.鍵盤的工作方式

    對鍵盤的響應取決于鍵盤的工作方式,鍵盤的工作方式應根據實際應用系統中的CPU的工作狀況而定,其選取的原則是既要保證CPU能及時響應按鍵操作,又不要過多占用CPU的工作時間。通常鍵盤的工作方式有三種,編程掃描、定時掃描和中斷掃描。

    (1)編程掃描方式

    編程掃描方式是利用CPU完成其它工作的空余時間,調用鍵盤掃描子程序來響應鍵盤輸入的要求。在執行鍵功能程序時,CPU不再響應鍵輸入要求,直到CPU重新掃描鍵盤為止。

    (2)定時掃描方式

    定時掃描方式就是每隔一段時間對鍵盤掃描一次,它利用單片機內部的定時器產生一定時間(例如10ms)的定時,當定時時間到就產生定時器溢出中斷。CPU響應中斷后對鍵盤進行掃描,并在有按鍵按下時識別出該鍵,再執行該鍵的功能程序。

    (3)中斷掃描方式

    上述兩種鍵盤掃描方式,無論是否按鍵,CPU都要定時掃描鍵盤,而單片機應用系統工作時,并非經常需要鍵盤輸入,因此,CPU經常處于空掃描狀態。

    為提高CPU工作效率,可采用中斷掃描工作方式。其工作過程如下:當無按鍵按下時,CPU處理自己的工作,當有按鍵按下時,產生中斷請求,CPU轉去執行鍵盤掃描子程序,并識別鍵號。
回復

使用道具 舉報

地板
ID:224854 發表于 2017-8-4 22:58 | 只看該作者
樓上大神,給的很詳細
回復

使用道具 舉報

5#
ID:222622 發表于 2017-8-5 13:04 | 只看該作者
wulin 發表于 2017-8-4 18:26
給你一個4*4矩陣鍵盤例程,有詳細注釋。
#include  
#define uint unsigned int                 //宏定義無符號整型數 ...

請問這段程序怎樣理解?

uchar keyscan()
{
    P2=0xfe;
    temp=P2;
    temp=temp&0xf0;
    while(temp!=0xf0)
     {
      delay(5);
      temp=P2;
      temp=temp&0xf0;
      while(temp!=0xf0)
      {
       temp=P2;
      switch(temp)
       {
        case 0xee:num=1;
         break;
        case 0xde:num=2;
         break;
        case 0xbe:num=3;
         break;
        case 0x7e:num=4;
         break;
       }
      while(temp!=0xf0)
       {
        temp=P2;
        temp=temp&0xf0;
       }
      }
     }
回復

使用道具 舉報

6#
ID:223754 發表于 2017-8-5 13:07 | 只看該作者
二樓的程序你可以下載編譯后下到板子里試試,如果能行,就說明之前是你的軟件除了問題,如果還是不行,那么就是硬件接口有問題,看看連線是否正確,在使用時候,最好用LED燈作指示,現象明了。
回復

使用道具 舉報

7#
ID:222622 發表于 2017-8-5 13:22 | 只看該作者
Baby_a 發表于 2017-8-5 13:07
二樓的程序你可以下載編譯后下到板子里試試,如果能行,就說明之前是你的軟件除了問題,如果還是不行,那么 ...

程序都有例子,正確是沒有問題的,我就是對于矩陣按鍵寫出來的程序不明白。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩视频精品在线 | 岛国在线免费观看 | 欧美一级电影免费观看 | a级黄色片视频 | 欧美啊v在线观看 | 午夜网站视频 | 精品久久99 | 午夜免费观看网站 | 91视视频在线观看入口直接观看 | 久久久www成人免费无遮挡大片 | 久久久久久亚洲 | 亚洲成人中文字幕 | 亚洲性在线 | 亚洲一区自拍 | 在线成人 | 亚洲天堂成人在线视频 | www日日日 | 亚洲欧美一区二区三区1000 | 黄视频免费观看 | 一区二区在线看 | 羞羞色影院 | 久久99深爱久久99精品 | 91国产精品| 国产一区二区精品在线 | 日本超碰在线 | 在线观看亚洲专区 | 久久午夜国产精品www忘忧草 | 日韩欧美一区二区在线播放 | 欧美综合自拍 | 在线观看国产91 | 日韩字幕 | 欧美精品一区二区三区蜜桃视频 | 国产成人精品视频 | 天天射夜夜操 | 一区视频| av国产精品 | 午夜精品久久久久99蜜 | 国产欧美一区二区三区日本久久久 | 欧美一级视频免费看 | 欧美日韩成人在线 | 久草视频在线播放 |