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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3676|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)矩陣鍵盤(pán)有行代碼不明白

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
50黑幣
就是標(biāo)準(zhǔn)紅色的那兩行,我不明白的是第一行已經(jīng)賦值給KEY_MATRIX_PORT了,那第二行里面的條件肯定是進(jìn)不去的啊,頭疼了一個(gè)下午,不知道是怎么回事,求指點(diǎn)



/*******************************************************************************
* 函 數(shù) 名       : key_matrix_ranks_scan
* 函數(shù)功能                 : 使用行列式掃描方法,檢測(cè)矩陣按鍵是否按下,按下則返回對(duì)應(yīng)鍵值
* 輸    入       : 無(wú)
* 輸    出             : key_value:1-16,對(duì)應(yīng)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);//等待按鍵松開(kāi)        
        
        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);//等待按鍵松開(kāi)        
        
        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);//等待按鍵松開(kāi)        
        
        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);//等待按鍵松開(kāi)
        
        return key_value;               
}

最佳答案

查看完整內(nèi)容

那你可能還沒(méi)弄懂準(zhǔn)雙向IO口的運(yùn)作 準(zhǔn)雙向IO口賦1時(shí)會(huì)設(shè)為高阻+弱上拉 準(zhǔn)雙向IO口賦0時(shí)會(huì)設(shè)為開(kāi)漏接地 并在任何時(shí)侯都可以讀取IO口的電平 即是說(shuō)對(duì)IO口賦值不單是設(shè)高低電平 同還改變了IO口的結(jié)構(gòu) P1=0xF7; S17按下(或者S17在P1=0xF7;前已被按下) P17的弱上拉不足以為持高電平 到 if(KEY_MATRIX_PORT!=0xf7)時(shí) 讀取到KEY_MATRIX_PORT的值是0x77 KEY_MATRIX_PORT!=0xf7成立
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:161164 發(fā)表于 2022-5-19 21:17 | 只看該作者
nanshancc 發(fā)表于 2022-5-20 10:09
s14按下,P17就是0,P1就是 0111 1110=7E

我不太明白的地方是不管怎么按鍵,程序不都是循環(huán)掃描順序執(zhí) ...

那你可能還沒(méi)弄懂準(zhǔn)雙向IO口的運(yùn)作
準(zhǔn)雙向IO口賦1時(shí)會(huì)設(shè)為高阻+弱上拉
準(zhǔn)雙向IO口賦0時(shí)會(huì)設(shè)為開(kāi)漏接地
并在任何時(shí)侯都可以讀取IO口的電平
即是說(shuō)對(duì)IO口賦值不單是設(shè)高低電平
同還改變了IO口的結(jié)構(gòu)

P1=0xF7;
S17按下(或者S17在P1=0xF7;前已被按下)
P17的弱上拉不足以為持高電平
到 if(KEY_MATRIX_PORT!=0xf7)時(shí)
讀取到KEY_MATRIX_PORT的值是0x77
KEY_MATRIX_PORT!=0xf7成立

評(píng)分

參與人數(shù) 1黑幣 +12 收起 理由
nanshancc + 12 看來(lái)還要補(bǔ)一下一些基礎(chǔ)的東西,非常感謝!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:161164 發(fā)表于 2022-5-19 23:10 | 只看該作者

這是一個(gè)矩陣鍵盤(pán)
當(dāng)P1 = 0xFE時(shí)只有P10為低
如果這時(shí)S14按下P17的電平是什么?
P1的值又是多少?是否還是0xFE?

回復(fù)

使用道具 舉報(bào)

地板
ID:390416 發(fā)表于 2022-5-20 07:59 | 只看該作者

主函數(shù)不斷地掃描這個(gè)函數(shù)即可完成矩陣鍵盤(pán)的掃描,你的代碼太長(zhǎng)了點(diǎn)
回復(fù)

使用道具 舉報(bào)

5#
ID:584814 發(fā)表于 2022-5-20 08:23 | 只看該作者
只搞個(gè)片斷無(wú)法回答;只要程序運(yùn)行能得到想要的結(jié)果就沒(méi)問(wèn)題。
比如那個(gè)看似無(wú)解的,如果存在中斷且可以重新賦值的就呵呵呵。
可仔細(xì)研讀一下網(wǎng)文或圖書(shū)上關(guān)于矩陣鍵盤(pán)的敘述,會(huì)掃描就好。
回復(fù)

使用道具 舉報(bào)

6#
ID:123289 發(fā)表于 2022-5-20 09:05 | 只看該作者
按下任何一鍵,都會(huì)使某兩個(gè)IO口短路在一起,即等值!
例如:S14按下后:P17=P10。你要掌握一個(gè)關(guān)鍵點(diǎn),就是1服從于0。這也是掃描鍵盤(pán)的原理!!!
1、讓P14-P17=1111,理論上你再回讀也應(yīng)該是1111,如果不是0,如0110,則必是P14T和P17被接0了。
在這張圖上,只有下列情況出現(xiàn)P14T和P17才能為0:
以P14=0解說(shuō)。
S2-5中必至少有一個(gè)按下了,且按下的鍵的另一端是0。
這時(shí),如果事先你讓P10=0,則S2按下了。如果P13=0,則S5按下了。
這就是為何要讓P10、P11、P12、P13依次為0的目的,如果有兩個(gè)同時(shí)為0(P10和P13),就分不出是哪個(gè)鍵按下了(S2?S4?)。
如你所說(shuō):
P1=FE,即P10-17=01111111,這時(shí)P10=0。
這時(shí),S2按下,讀值為:01110111
S2S6S10S14,全部按下:01110000。
明白了嗎?
回頭再細(xì)想想,掃鍵的原理就清楚了。

評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
nanshancc + 5 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

7#
ID:965189 發(fā)表于 2022-5-20 09:06 | 只看該作者
while(KEY_MATRIX_PORT!=0xf7);//等待按鍵松開(kāi)。這是進(jìn)入下一行的條件。
回復(fù)

使用道具 舉報(bào)

8#
ID:1028013 發(fā)表于 2022-5-20 10:09 | 只看該作者
lkc8210 發(fā)表于 2022-5-19 23:10
這是一個(gè)矩陣鍵盤(pán)
當(dāng)P1 = 0xFE時(shí)只有P10為低
如果這時(shí)S14按下P17的電平是什么?

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

我不太明白的地方是不管怎么按鍵,程序不都是循環(huán)掃描順序執(zhí)行的嗎

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

我的意思就是不管怎么按鍵,但是在代碼里面都進(jìn)行了重新的賦值,那樣按鍵好像就沒(méi)起到作用(也不會(huì)進(jìn)入while)。。
回復(fù)

使用道具 舉報(bào)

9#
ID:369312 發(fā)表于 2022-5-20 10:09 | 只看該作者
應(yīng)該是按鍵按下的時(shí)候KEY_MATRIX_PORT的值會(huì)變化,進(jìn)入判斷
回復(fù)

使用道具 舉報(bào)

10#
ID:735831 發(fā)表于 2022-5-20 11:08 | 只看該作者
nanshancc 發(fā)表于 2022-5-20 10:09
s14按下,P17就是0,P1就是 0111 1110=7E

我不太明白的地方是不管怎么按鍵,程序不都是循環(huán)掃描順序執(zhí) ...

既然是順序執(zhí)行那就得按程序先后順序來(lái)。你這個(gè)程序明顯是先賦值后判斷,cpu是順序執(zhí)行,對(duì)應(yīng)的鍵值按照判斷應(yīng)該也是唯一的,也不存在誤判的問(wèn)題。對(duì)于隨時(shí)可能觸發(fā)的按鍵,賦值語(yǔ)句在你開(kāi)始供電的到你第一次按下按鍵的時(shí)候已經(jīng)被執(zhí)行了幾百乃至幾萬(wàn)次了,也不存在賦值語(yǔ)句沒(méi)有執(zhí)行的問(wèn)題,而且你按下按鍵的時(shí)候,不論怎么賦值,這個(gè)硬件位置的值始終會(huì)被拉低,對(duì)應(yīng)到程序上也是始終處于!0xf7。即使你重新賦值,硬件位的電壓已經(jīng)被拉低,那他也不會(huì)保持在0xf7狀態(tài)了。

評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
nanshancc + 5 可能這就是硬件程序和軟件程序的區(qū)別吧

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表