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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3339|回復: 9
收起左側

51單片機矩陣鍵盤有行代碼不明白

[復制鏈接]
ID:1028013 發表于 2022-5-19 21:17 | 顯示全部樓層 |閱讀模式
50黑幣
就是標準紅色的那兩行,我不明白的是第一行已經賦值給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;               
}

最佳答案

查看完整內容

那你可能還沒弄懂準雙向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成立
回復

使用道具 舉報

ID:161164 發表于 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成立

評分

參與人數 1黑幣 +12 收起 理由
nanshancc + 12 看來還要補一下一些基礎的東西,非常感謝!

查看全部評分

回復

使用道具 舉報

ID:161164 發表于 2022-5-19 23:10 | 顯示全部樓層
81d504bbc68a2e31e081a0431edee34a.jpg
這是一個矩陣鍵盤
當P1 = 0xFE時只有P10為低
如果這時S14按下P17的電平是什么?
P1的值又是多少?是否還是0xFE?

回復

使用道具 舉報

ID:390416 發表于 2022-5-20 07:59 | 顯示全部樓層
代碼 矩陣鍵盤.jpg
主函數不斷地掃描這個函數即可完成矩陣鍵盤的掃描,你的代碼太長了點
回復

使用道具 舉報

ID:584814 發表于 2022-5-20 08:23 | 顯示全部樓層
只搞個片斷無法回答;只要程序運行能得到想要的結果就沒問題。
比如那個看似無解的,如果存在中斷且可以重新賦值的就呵呵呵。
可仔細研讀一下網文或圖書上關于矩陣鍵盤的敘述,會掃描就好。
回復

使用道具 舉報

ID:123289 發表于 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。
明白了嗎?
回頭再細想想,掃鍵的原理就清楚了。

評分

參與人數 1黑幣 +5 收起 理由
nanshancc + 5 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:965189 發表于 2022-5-20 09:06 | 顯示全部樓層
while(KEY_MATRIX_PORT!=0xf7);//等待按鍵松開。這是進入下一行的條件。
回復

使用道具 舉報

ID:1028013 發表于 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)。。
回復

使用道具 舉報

ID:369312 發表于 2022-5-20 10:09 | 顯示全部樓層
應該是按鍵按下的時候KEY_MATRIX_PORT的值會變化,進入判斷
回復

使用道具 舉報

ID:735831 發表于 2022-5-20 11:08 | 顯示全部樓層
nanshancc 發表于 2022-5-20 10:09
s14按下,P17就是0,P1就是 0111 1110=7E

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

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

評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91久久精品国产91久久 | 99re视频在线观看 | 欧洲亚洲精品久久久久 | 日韩免费网 | 殴美黄色录像 | h免费观看 | 中文字幕第二十页 | 久久久夜色精品亚洲 | 国产精品亚洲精品日韩已方 | 免费一级黄色 | 夜夜骑综合 | 国产精品国产三级国产aⅴ入口 | 81精品国产乱码久久久久久 | 欧美日韩在线观看视频 | 久久久夜色精品亚洲 | 一区二区三区四区在线视频 | 国产一区二 | 中日韩欧美一级片 | 一区二区三区在线观看免费视频 | 欧美福利 | 国产精品久久精品 | 日韩在线一区二区三区 | 国产精品久久久久久久午夜 | 欧美久久综合 | 怡红院免费的全部视频 | 国产一级电影在线观看 | 成人超碰 | 成人午夜精品一区二区三区 | 日韩av在线中文字幕 | 国产精品福利视频 | 国产午夜精品一区二区 | 日韩中文字幕在线免费 | 成人福利影院 | 亚洲最新在线视频 | 中文字幕成人 | 亚洲一区二区视频在线播放 | 岛国一区 | 亚洲aⅴ一区二区 | 精品一区av | 91在线视频播放 | www免费视频 |