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

QQ登錄

只需一步,快速開始

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

關(guān)于矩陣鍵盤多按鍵同時(shí)按下的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:516612 發(fā)表于 2021-1-27 13:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我是初學(xué)51單片機(jī)和C語(yǔ)言,前段時(shí)間學(xué)過矩陣按鍵后就有一個(gè)關(guān)于電腦鍵盤多按鍵的問題。
就是一般教程里面的矩陣鍵盤的程序都是行列掃描反轉(zhuǎn)來(lái)檢測(cè)位的,然后松開按鍵通過while程序來(lái)檢測(cè),但是遇到多按鍵的問題就無(wú)解了。比如我想按下1鍵的時(shí)候1數(shù)碼管顯示1,不松手再按下4則4數(shù)碼管顯示4,再不松手按7數(shù)碼管7顯示7,哪個(gè)按鍵松開則關(guān)掉哪個(gè)。
再比如像電腦鍵盤,要輸入大寫A,如果只按照教程的按鍵程序,當(dāng)我們按下shift的時(shí)候,由于沒有松手,那程序會(huì)一直卡在while,那么按下A和其他鍵的時(shí)候是無(wú)法檢測(cè)的。如果不寫松手檢測(cè)程序,我查了一下現(xiàn)在鍵盤大多使用的是第二套掃描碼,也就是通斷都發(fā)數(shù)據(jù),那如果不寫松手檢測(cè),也就不會(huì)發(fā)送斷碼,那輸入也是有問題的。更不用說(shuō)Ctrl+Alt+這種組合按鍵了,那更沒法用了。
想了幾天也沒有頭緒,希望有經(jīng)驗(yàn)的大神能幫我解惑。謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:516612 發(fā)表于 2021-1-27 16:06 | 只看該作者
自頂一下
回復(fù)

使用道具 舉報(bào)

板凳
ID:158375 發(fā)表于 2021-1-27 16:59 | 只看該作者
首先說(shuō)說(shuō)你想做什么?
按鍵掃描有很多種方式的,按需來(lái)完成既定功能。
回復(fù)

使用道具 舉報(bào)

地板
ID:872416 發(fā)表于 2021-1-27 17:07 來(lái)自手機(jī) | 只看該作者
還有長(zhǎng)按短按
回復(fù)

使用道具 舉報(bào)

5#
ID:516612 發(fā)表于 2021-1-27 17:18 | 只看該作者
本帖最后由 18674201426 于 2021-1-27 18:25 編輯
笨笨兔 發(fā)表于 2021-1-27 16:59
首先說(shuō)說(shuō)你想做什么?
按鍵掃描有很多種方式的,按需來(lái)完成既定功能。

我寫的您可能沒看太清楚,就比如我想按下1鍵的時(shí)候1數(shù)碼管顯示1,不松手再按下4則4數(shù)碼管顯示4,再不松手按7數(shù)碼管7顯示7,哪個(gè)按鍵松開則關(guān)掉哪個(gè)。其實(shí)實(shí)現(xiàn)什么功能倒是次要的,數(shù)碼管顯示無(wú)非就是段選。我主要是想知道怎樣在按鍵1按下后,按下其他按鍵不會(huì)有沖突,因?yàn)橛醚h(huán)函數(shù)判斷鍵位是否松開會(huì)卡住cpu直到按鍵松開為止。就像電腦鍵盤一樣,截圖就是Ctrl+Alt+A的3鍵組合,用循環(huán)函數(shù)判斷鍵位是否松開,根本無(wú)法實(shí)現(xiàn)這個(gè)功能。
回復(fù)

使用道具 舉報(bào)

6#
ID:516612 發(fā)表于 2021-1-27 17:23 | 只看該作者
盧盧 發(fā)表于 2021-1-27 17:07
還有長(zhǎng)按短按

長(zhǎng)按短按應(yīng)該還是能直接用延時(shí)函數(shù)實(shí)現(xiàn)的,直接在短按后面繼續(xù)延時(shí)就可以了,如果不需要短按的功能,可以在長(zhǎng)按程序開始時(shí)關(guān)掉短按相關(guān)的處理
回復(fù)

使用道具 舉報(bào)

7#
ID:332444 發(fā)表于 2021-1-27 19:28 | 只看該作者
設(shè)計(jì)組合鍵是輕而易舉的事,組合鍵也對(duì)應(yīng)一個(gè)鍵值。
回復(fù)

使用道具 舉報(bào)

8#
ID:332444 發(fā)表于 2021-1-27 19:29 | 只看該作者
組合鍵可以同時(shí)按下也可分開按下
回復(fù)

使用道具 舉報(bào)

9#
ID:516612 發(fā)表于 2021-1-27 21:16 | 只看該作者
xianfajushi 發(fā)表于 2021-1-27 19:28
設(shè)計(jì)組合鍵是輕而易舉的事,組合鍵也對(duì)應(yīng)一個(gè)鍵值。

輕而易舉的事嗎?額,,,,您能抽空幫我寫一個(gè)簡(jiǎn)單的我學(xué)習(xí)一下嗎,怎么實(shí)現(xiàn)的。
就比如1,2,3,4這四個(gè)鍵,組成2x2的矩陣鍵盤,1按下 燈1亮,2按下 燈2亮,,3按下 燈3亮,4按下 4燈亮。
重點(diǎn)是:按下任意鍵在不松開的情況下,按下其他鍵,相應(yīng)的燈都會(huì)亮,松開哪個(gè)按鍵,哪個(gè)燈就熄滅。
只有這樣,當(dāng)1鍵和2鍵同時(shí)按下的時(shí)候,經(jīng)過延時(shí),設(shè)定燈5亮,這樣的組合鍵才能實(shí)現(xiàn)。
希望能幫我寫個(gè)程序看看,謝謝大神!
回復(fù)

使用道具 舉報(bào)

10#
ID:332444 發(fā)表于 2021-1-28 07:44 | 只看該作者
很簡(jiǎn)單檢測(cè)沒有按鍵釋放就重新掃描,把對(duì)應(yīng)的值定義為需要的即可,寫代碼似乎不需要看你悟性。
回復(fù)

使用道具 舉報(bào)

11#
ID:89217 發(fā)表于 2021-1-28 08:21 | 只看該作者
真正寫按鍵程序是沒人用while的,一般一個(gè)程序里面只有一個(gè)主while,其他地方基本不用到,一些初學(xué)者總是容易被一些低級(jí)教程坑害,按鍵設(shè)計(jì)可以這樣,當(dāng)你按鍵按下時(shí)系統(tǒng)里面就生成標(biāo)識(shí),抬起時(shí)就抹除標(biāo)識(shí),這樣無(wú)論什么時(shí)候只要標(biāo)識(shí)還在就可以直接屏蔽當(dāng)前操作,這樣你做其他操作也不會(huì)影響當(dāng)前值,因?yàn)槟愕陌讣䴖]有抬起相當(dāng)于屏蔽了此按鍵,如果是組合按鍵寫法是不一樣的,需要在一定的時(shí)間內(nèi)完成和一直都生效是兩種不同的寫法,根據(jù)邏輯功能設(shè)置是必要的,不能一概而論
回復(fù)

使用道具 舉報(bào)

12#
ID:592807 發(fā)表于 2021-1-28 08:43 | 只看該作者
18674201426 發(fā)表于 2021-1-27 21:16
輕而易舉的事嗎?額,,,,您能抽空幫我寫一個(gè)簡(jiǎn)單的我學(xué)習(xí)一下嗎,怎么實(shí)現(xiàn)的。
就比如1,2,3 ...


按鍵掃描會(huì)嗎?
簡(jiǎn)單點(diǎn):掃描到第一個(gè)按鍵A后直接退出延時(shí)10ms再次掃描重復(fù)3次,若是后三次沒出現(xiàn)新的按鍵值就直接輸出A,掃描到其他按鍵就組合。
延時(shí)10ms和重復(fù)3次這個(gè)你可以看情況自己決定是否要
復(fù)雜點(diǎn):4個(gè)按鍵值做一個(gè)4位的數(shù)組,從頭到尾掃描一次,有檢測(cè)被按下就對(duì)應(yīng)的數(shù)組位置置1,然后檢測(cè)有少少個(gè)1,就知道按了幾個(gè)按鍵了。或者
回復(fù)

使用道具 舉報(bào)

13#
ID:158375 發(fā)表于 2021-1-28 08:47 | 只看該作者
18674201426 發(fā)表于 2021-1-27 17:18
我寫的您可能沒看太清楚,就比如我想按下1鍵的時(shí)候1數(shù)碼管顯示1,不松手再按下4則4數(shù)碼管顯示4,再不松手 ...

這個(gè)很好實(shí)現(xiàn)。
按鍵用定時(shí)器查詢,定時(shí)中斷消抖。
兩次查詢的不同,把那個(gè)多出來(lái)的發(fā)送出去即可。
按鍵可不管抬起。
回復(fù)

使用道具 舉報(bào)

14#
ID:743654 發(fā)表于 2021-1-28 08:49 | 只看該作者
程序能傳上來(lái)研究嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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