矩陣鍵盤掃瞄

2021-05-02 15:15:09 字數 3287 閱讀 7470

矩陣鍵盤掃瞄一般採取行列掃瞄法。比如先拉低所有列線,拉高行線,之後讀取行線狀態,如果行線有一行為低,則假設有按鍵按下,此時再延時20毫秒左右後判 斷行線的某一行是否仍然為低,若為低則確認有鍵按下。這時可以進行按鍵鍵值判斷,即判別在哪一行哪一列有按鍵按下。判斷的方法是通過拉高列線,依次置行線 的某一行為低,讀取列線值。如果列線有一列為低,則表示按鍵發生在該行,進而可以通過讀取到的列線值確定在哪一列,從而確定按鍵發生在具體的行和列。為了 防止按鍵按下後一直有按鍵被讀取,需要在程式中設定在按鍵被釋放後才能讀取具體的鍵值來避免這一問題。ia%is9

**如下:g7"2;47l

e-u|k9dg

#includeb*(kv;

#includegr.fno5+

#define key_port p2        //矩陣鍵盤埠,其中p2.0-p2.3為列線,p2.4-p2.7為行線}38c+ijc

typedef unsigned char uchar;l1g9�rt $

typedef unsigned int uint;q#:`q| /$

void serial_init(void)                       //串列埠初始化函式$@69?oq%

dd }-}j-+h

iitwj

key_port = 0xf0;                    //置低列線,以讀取行線判斷是不是有鍵按下i2yomr@1*

keypressed = key_port & 0xf0;        //讀取行線值oyhfd

if(keypressed == 0xf0)              //無鍵按下?l59a[d%

return 0;gvpz8yls

else}p<&vul>

return 1;                        //有鍵按下[&xb*>4k

}^l^/}~

uchar key_assert(void)        //鍵值判斷函式,第半位元組存列號,高半位元組存行號*w<

h pv}ue

key_port = 0xdf;                         //拉低第二行do edgr�zs

if((keyvalue = key_port & 0x0f) != 0x0f) //第二行的鍵被按下#29v/sq

?a(uu`ti

key_port = 0xbf;                         //拉低第三行nl*"2) gw

if((keyvalue = key_port & 0x0f) != 0x0f) //第三行的鍵被按下lu#a*$`$/

8@b3? ~

while((key_port & 0x0f) != 0x0f);         //等待按鍵釋放9*/:/ma|

return (keyvalue | 0xb0);s`5/|fc

}b'/+/dp=

key_port = 0x7f;                         //拉低第四行(+7|$.

if((keyvalue = key_port & 0x0f) != 0x0f) //第四行的鍵被按下negbdy/

ygg 2b

}hbll2#91]

void hardware_delay_1ms(void)            //硬體定時器延時1ms函式~[$;

hf tmod &=0xf0;odo9wgr

tmod |=0x01;  //t0——16位定時器器模yf*m2,

84|-za

th0 = 0xfc;9>srrb6a

tl0 =0x18;    //64536&vbau_jf

2c`(h%no

tf0=0;        //清除定時器溢位標誌?(kj^hab

tr0=1;         //啟動定時器    edqm&nk8

while(tf0==0);//等待計數完成2_%$hm|

tr0=0;         //停止定時器9!l/3v) *

}]@4!o~/*q

void delay_nms(uint n)                    //延時n毫秒函式tn"vnuo;

w7_y'ai%l

void main(void)i#(fz6;d

($9uqh"

l`fms^<

case 0xdd:f}]1/~d

printf("key 6 pressed!/n");)l,2s}auj

break;}"q@m`fj

case 0xdb:y^saq2+

printf("key 7 pressed!/n");=ld.g]=

break;gtg]6k%q0

case 0xd7:ri(2?[hj

printf("key 8 pressed!/n");@s,; f't

break;1no*e7"

case 0xbe:u]*c5 +2@6

printf("key 9 pressed!/n");6fjtwh#j

break;sbpmhd `z

case 0xbd:"wni|iy

printf("key 10 pressed!/n");6_5!_g$x

break;#v;l}c&-y!

case 0xbb:% hnz�:'

printf("key 11 pressed!/n");2vifwx

break;mdm^)l

case 0xb7:riqt3/

printf("key 12 pressed!/n");5 j&_g(

break;,p%>_=aj

case 0x7e:yq0ix|1dy>

printf("key 13 pressed!/n");n -:k%b

break;51r d-$^z

case 0x7d:]sa2mkqc

printf("key 14 pressed!/n");}@7omyzk

break;ey|>$lk

case 0x7b:kbq)>rt j_

printf("key 15 pressed!/n");i@v~.]f

break;j�-odad4go

case 0x77:sijb@|r

printf("key 16 pressed!/n");x9b.odl

break;l4&/s/cq7#;dfy

}^hilv

}uimhpfg6

}

矩陣鍵盤掃瞄

矩陣鍵盤掃瞄 module matrix keyboard input clk 50m,50m時鐘 input rst n,復位 input 3 0 row,矩陣鍵盤行輸入 output reg 3 0 col,矩陣鍵盤列輸出 output reg key flag,按鍵按下標誌 output re...

矩陣鍵盤掃瞄

根據矩陣鍵盤的原理圖可知,當沒有按鍵按下時,p1 0xf0 然後依次將p1 0 p1 3單獨置低電平,其他置高,再掃瞄各列的狀態,來判斷是哪個按鍵按下,比如,將p1 0輸出低電平,其他的引腳都輸出高電平,即p1 0xfe,那麼當第1行有按鍵按下時p1的相應值為,1x1 01111110 0x7e 1...

矩陣鍵盤掃瞄原理

當乙個按鍵兩端分別接乙個io口,乙個io口置高電平另乙個置低電平,當按下按鍵時高電平io口電平被拉低,另一端還是為低電平,這時檢測io口值就是兩個低電平。把上述方法應用到矩陣鍵盤上,如果把4個行引腳接p2前4位io口 p2.0 p2.3 都置低電平,把4個列引腳接p2後4位io口 p2.4 p2.7...