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

標題: 關于單片機矩陣鍵盤程序的理解 求解釋,困惑了好長時間了 [打印本頁]

作者: 白的一匹    時間: 2021-1-15 20:54
標題: 關于單片機矩陣鍵盤程序的理解 求解釋,困惑了好長時間了
附件是矩陣鍵盤的原理圖
以下是矩陣鍵盤掃描程序以及在數碼管顯示0-f


請問如果第一個按鍵被按下,P1口應該是0x07,但進入到測試列的程序中時,P1口被重新賦值為0x0f,那么P1口怎么還會一直保留原來的0x07?到測試行時又被重新賦值為0xf0,怎么還會保留原來的值呢?
跪求大佬解答,詳細,感激不盡!!!!

單片機源程序如下:
#include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器

typedef unsigned int u16;          //對數據類型進行聲明定義
typedef unsigned char u8;

#define GPIO_DIG P0
#define GPIO_KEY P1


u8 KeyValue;        //用來存放讀取到的鍵值


u8 code smgduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                                        0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//顯示0~F的值共陰
void delay(u16 i)
{
        while(i--);        
}
void KeyDown(void)
{
        char a=0;
        GPIO_KEY=0x0f;
        if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
        {
                delay(1000);//延時10ms進行消抖
                if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
                {        
                        //測試列
                        GPIO_KEY=0X0F;
                        switch(GPIO_KEY)
                        {
                                case(0X07):        KeyValue=0;break;
                                case(0X0b):        KeyValue=1;break;
                                case(0X0d): KeyValue=2;break;
                                case(0X0e):        KeyValue=3;break;
                        }
                        //測試行
                        GPIO_KEY=0XF0;
                        switch(GPIO_KEY)
                        {
                                case(0X70):        KeyValue=KeyValue;break;
                                case(0Xb0):        KeyValue=KeyValue+4;break;
                                case(0Xd0): KeyValue=KeyValue+8;break;
                                case(0Xe0):        KeyValue=KeyValue+12;break;
                        }
                        
                }
        }
        while((a<50)&&(GPIO_KEY!=0xf0))         //檢測按鍵松手檢測
        {
                delay(100);
                a++;
        }
}
void main()
{        

        while(1)
        {        
                KeyDown();                   //按鍵判斷函數
                GPIO_DIG=~smgduan[KeyValue];          //
        }               
}

作者: 人人學會單片機    時間: 2021-1-16 00:56

這就是矩陣鍵盤掃描的代碼,主函數循環調用本函數就行 不能有死等延遲。必須計數延遲。定時器調用也行(有些浪費不建議)。

作者: wulin    時間: 2021-1-16 07:04
預置P1口0x0f,如果第一個按鍵被按下,P1口應該是0x07,此時P1的低4位當前狀態已讀取,以鍵值的方式保存在變量KeyValue中,進入到測試列的步驟時,P1口被重新賦值為0xf0,此時P1的高4位當前狀態0X70再被讀取并與低4位相加。測試得到的結果是0x77。最終輸出KeyValue=0。
作者: 心有浮生    時間: 2021-1-16 09:12
按鍵抖動
作者: yousir    時間: 2021-1-16 10:11
你想啊。單片機執行速度非常的快,你按下按鍵的時候(按下的時間很短但對于單片機來說很長了,單片機的處理速度很快)這些操作都已經進行完了,意思就是你雖然進行了賦值,但你還按下了按鍵,按鍵改變了你的賦值,然后switch case語句去判斷你按下了哪個按鍵,
作者: yousir    時間: 2021-1-16 10:18
單片機的處理速度很快(按鍵時間雖短,但在按鍵的時間內,單片機已經將這些處理進行完畢,意思就是你還按著那個鍵,賦予新的初值只是軟件上的改變,而你還按著這個鍵就是硬件上給io口改變了賦值)軟件上賦值給io口是為檢測硬件上的改變(到底按了哪個鍵)做準備,然后switch case語句去檢測到底按下了哪個鍵
作者: 白的一匹    時間: 2021-1-16 16:42
yousir 發表于 2021-1-16 10:18
單片機的處理速度很快(按鍵時間雖短,但在按鍵的時間內,單片機已經將這些處理進行完畢,意思就是你還按著 ...

感謝!!!!!!
作者: 梁廷明    時間: 2021-1-18 15:43
按鍵行做輸出,列做輸入,只需檢測列那邊電平即可
作者: xianfajushi    時間: 2021-1-19 09:22
可參https://blog.csdn.net/xianfajush ... 1018.2226.3001.4450




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