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

標題: 51單片機矩陣鍵盤有行代碼不明白 [打印本頁]

作者: nanshancc    時間: 2022-5-19 21:17
標題: 51單片機矩陣鍵盤有行代碼不明白
就是標準紅色的那兩行,我不明白的是第一行已經賦值給KEY_MATRIX_PORT了,那第二行里面的條件肯定是進不去的啊,頭疼了一個下午,不知道是怎么回事,求指點



/*******************************************************************************
* 函 數 名       : key_matrix_ranks_scan
* 函數功能                 : 使用行列式掃描方法,檢測矩陣按鍵是否按下,按下則返回對應鍵值
* 輸    入       : 無
* 輸    出             : key_value:1-16,對應S1-S16鍵,
                                   0:按鍵未按下
*******************************************************************************/
u8 key_matrix_ranks_scan(void)
{
        u8 key_value=0;

        KEY_MATRIX_PORT=0xf7;//給第一列賦值0,其余全為1
        if(KEY_MATRIX_PORT!=0xf7)//判斷第一列按鍵是否按下
        {
                delay_10us(1000);//消抖
                switch(KEY_MATRIX_PORT)//保存第一列按鍵按下后的鍵值        
                {
                        case 0x77: key_value=1;break;
                        case 0xb7: key_value=5;break;
                        case 0xd7: key_value=9;break;
                        case 0xe7: key_value=13;break;
                }
        }
        while(KEY_MATRIX_PORT!=0xf7);//等待按鍵松開        
        
        KEY_MATRIX_PORT=0xfb;//給第二列賦值0,其余全為1
        if(KEY_MATRIX_PORT!=0xfb)//判斷第二列按鍵是否按下
        {
                delay_10us(1000);//消抖
                switch(KEY_MATRIX_PORT)//保存第二列按鍵按下后的鍵值        
                {
                        case 0x7b: key_value=2;break;
                        case 0xbb: key_value=6;break;
                        case 0xdb: key_value=10;break;
                        case 0xeb: key_value=14;break;
                }
        }
        while(KEY_MATRIX_PORT!=0xfb);//等待按鍵松開        
        
        KEY_MATRIX_PORT=0xfd;//給第三列賦值0,其余全為1
        if(KEY_MATRIX_PORT!=0xfd)//判斷第三列按鍵是否按下
        {
                delay_10us(1000);//消抖
                switch(KEY_MATRIX_PORT)//保存第三列按鍵按下后的鍵值        
                {
                        case 0x7d: key_value=3;break;
                        case 0xbd: key_value=7;break;
                        case 0xdd: key_value=11;break;
                        case 0xed: key_value=15;break;
                }
        }
        while(KEY_MATRIX_PORT!=0xfd);//等待按鍵松開        
        
        KEY_MATRIX_PORT=0xfe;//給第四列賦值0,其余全為1
        if(KEY_MATRIX_PORT!=0xfe)//判斷第四列按鍵是否按下
        {
                delay_10us(1000);//消抖
                switch(KEY_MATRIX_PORT)//保存第四列按鍵按下后的鍵值        
                {
                        case 0x7e: key_value=4;break;
                        case 0xbe: key_value=8;break;
                        case 0xde: key_value=12;break;
                        case 0xee: key_value=16;break;
                }
        }
        while(KEY_MATRIX_PORT!=0xfe);//等待按鍵松開
        
        return key_value;               
}


作者: lkc8210    時間: 2022-5-19 21:17
nanshancc 發表于 2022-5-20 10:09
s14按下,P17就是0,P1就是 0111 1110=7E

我不太明白的地方是不管怎么按鍵,程序不都是循環掃描順序執 ...

那你可能還沒弄懂準雙向IO口的運作
準雙向IO口賦1時會設為高阻+弱上拉
準雙向IO口賦0時會設為開漏接地
并在任何時侯都可以讀取IO口的電平
即是說對IO口賦值不單是設高低電平
同還改變了IO口的結構

P1=0xF7;
S17按下(或者S17在P1=0xF7;前已被按下)
P17的弱上拉不足以為持高電平
到 if(KEY_MATRIX_PORT!=0xf7)時
讀取到KEY_MATRIX_PORT的值是0x77
KEY_MATRIX_PORT!=0xf7成立
作者: lkc8210    時間: 2022-5-19 23:10

這是一個矩陣鍵盤
當P1 = 0xFE時只有P10為低
如果這時S14按下P17的電平是什么?
P1的值又是多少?是否還是0xFE?


作者: 人人學會單片機    時間: 2022-5-20 07:59

主函數不斷地掃描這個函數即可完成矩陣鍵盤的掃描,你的代碼太長了點

作者: man1234567    時間: 2022-5-20 08:23
只搞個片斷無法回答;只要程序運行能得到想要的結果就沒問題。
比如那個看似無解的,如果存在中斷且可以重新賦值的就呵呵呵。
可仔細研讀一下網文或圖書上關于矩陣鍵盤的敘述,會掃描就好。
作者: yzwzfyz    時間: 2022-5-20 09:05
按下任何一鍵,都會使某兩個IO口短路在一起,即等值!
例如:S14按下后:P17=P10。你要掌握一個關鍵點,就是1服從于0。這也是掃描鍵盤的原理!!!
1、讓P14-P17=1111,理論上你再回讀也應該是1111,如果不是0,如0110,則必是P14T和P17被接0了。
在這張圖上,只有下列情況出現P14T和P17才能為0:
以P14=0解說。
S2-5中必至少有一個按下了,且按下的鍵的另一端是0。
這時,如果事先你讓P10=0,則S2按下了。如果P13=0,則S5按下了。
這就是為何要讓P10、P11、P12、P13依次為0的目的,如果有兩個同時為0(P10和P13),就分不出是哪個鍵按下了(S2?S4?)。
如你所說:
P1=FE,即P10-17=01111111,這時P10=0。
這時,S2按下,讀值為:01110111
S2S6S10S14,全部按下:01110000。
明白了嗎?
回頭再細想想,掃鍵的原理就清楚了。


作者: 君工創    時間: 2022-5-20 09:06
while(KEY_MATRIX_PORT!=0xf7);//等待按鍵松開。這是進入下一行的條件。
作者: nanshancc    時間: 2022-5-20 10:09
lkc8210 發表于 2022-5-19 23:10
這是一個矩陣鍵盤
當P1 = 0xFE時只有P10為低
如果這時S14按下P17的電平是什么?

s14按下,P17就是0,P1就是 0111 1110=7E

我不太明白的地方是不管怎么按鍵,程序不都是循環掃描順序執行的嗎

KEY_MATRIX_PORT=0xf7;//給第一列賦值0,其余全為1
        if(KEY_MATRIX_PORT!=0xf7)//判斷第一列按鍵是否按下
        {
難道說如果有按鍵按下了,不會去執行第一句的賦值語句,直接就進入if判斷語句了?
按鍵按下了,賦值語句沒起作用?

我的意思就是不管怎么按鍵,但是在代碼里面都進行了重新的賦值,那樣按鍵好像就沒起到作用(也不會進入while)。。
作者: 君莫笑1    時間: 2022-5-20 10:09
應該是按鍵按下的時候KEY_MATRIX_PORT的值會變化,進入判斷
作者: hzhehe    時間: 2022-5-20 11:08
nanshancc 發表于 2022-5-20 10:09
s14按下,P17就是0,P1就是 0111 1110=7E

我不太明白的地方是不管怎么按鍵,程序不都是循環掃描順序執 ...

既然是順序執行那就得按程序先后順序來。你這個程序明顯是先賦值后判斷,cpu是順序執行,對應的鍵值按照判斷應該也是唯一的,也不存在誤判的問題。對于隨時可能觸發的按鍵,賦值語句在你開始供電的到你第一次按下按鍵的時候已經被執行了幾百乃至幾萬次了,也不存在賦值語句沒有執行的問題,而且你按下按鍵的時候,不論怎么賦值,這個硬件位置的值始終會被拉低,對應到程序上也是始終處于!0xf7。即使你重新賦值,硬件位的電壓已經被拉低,那他也不會保持在0xf7狀態了。




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