<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 4*4矩陣鍵盤(pán)制作電路+鍵盤(pán)掃描法89c52c程序驅動(dòng)數碼管

4*4矩陣鍵盤(pán)制作電路+鍵盤(pán)掃描法89c52c程序驅動(dòng)數碼管

作者: 時(shí)間:2016-11-26 來(lái)源:網(wǎng)絡(luò ) 收藏
這里介紹最常用的4*4矩陣鍵盤(pán),其他的更多鍵在此基礎上拓展。

一般我們用的電路就如下,此圖我隨手畫(huà)下,看懂意思就好了

本文引用地址:http://dyxdggzs.com/article/201611/321689.htm

如果你有興趣可以按照此電路制作,下面附上焊接實(shí)物圖

矩陣鍵盤(pán)的識別方法一般有掃描法,線(xiàn)反轉法

掃描法:

矩陣式鍵盤(pán)結構:輸出行線(xiàn)鎖存器,輸入列線(xiàn)緩沖器。

工作過(guò)程:

1.CPU先使行線(xiàn)P1.0為低,其余行線(xiàn)為高
2.CPU讀入輸入緩沖器的狀態(tài),以確定哪條列線(xiàn)為0狀態(tài),若此時(shí)P1.7為0,則"C"鍵按下;若P1.5為0,則"E"鍵按下
3.若輸入緩沖器(列線(xiàn))狀態(tài)全部為1,說(shuō)明P1.0行沒(méi)有鍵盤(pán)按下,CPU急繼續使P1.1為0,其余行線(xiàn)為高,再讀入輸入緩沖器的狀態(tài),以確定哪條列線(xiàn)為0,從而判斷是哪個(gè)鍵盤(pán)按下
4.當判斷那個(gè)鍵盤(pán)按下后,程序轉入相應的鍵盤(pán)處理程序

把每個(gè)鍵都分成水平和垂直的兩端接入,比如說(shuō)掃描碼是從垂直的入,那就代表那一行所接收到的掃描碼是同一個(gè)bit,而讀入掃描碼的則是水平,掃描的動(dòng)作是先輸入掃描碼,再去讀取輸入的值,經(jīng)過(guò)比對之后就可知道是哪個(gè)鍵被按下。

比如說(shuō)掃描碼送入01111111,前面的0111是代表此時(shí)掃描第一行P1.0列,而后面的1111是讓讀取的4行接腳先設為VDD,若此時(shí)第一行的第三列按鍵被按下,那讀取的結果就會(huì )變成01111101(注意1111變成1101),其中LSB的第三個(gè)bit會(huì )由1變成0,這是因為這個(gè)按鍵被按下之后,會(huì )被垂直的掃描碼電位short,而把讀取的LSB的bit電位拉到0,此即為掃描原理。

線(xiàn)反轉法:僅需兩步:(即控制器的接口必須是雙向I/O口)

Step 1:將列線(xiàn)作為輸出線(xiàn),行線(xiàn)作為輸入線(xiàn)。置輸出線(xiàn)全部為0,此時(shí)行線(xiàn)中呈低電平0的為按鍵所在行,如果全部都不是0,則沒(méi)有按鍵按下。

Step 2:將第一步反過(guò)來(lái),即將行線(xiàn)作為輸出線(xiàn),列線(xiàn)作為輸入線(xiàn)。置輸出線(xiàn)全部為0,此時(shí)列線(xiàn)呈低電平的為按鍵所在的列。這樣,就可以確定了按鍵的位置(X,Y)。

當然還要注意軟件去抖動(dòng),另外此法需要在行線(xiàn)上上拉電阻,就是焊接電路中的四個(gè)電阻。

今天這里以?huà)呙璺ㄗ鼋榻B,不用到上拉電阻。

此程序是按鍵后,在數碼管上顯示此鍵的序號從第一行開(kāi)始一次是1,2,3,4,5,6,7,8,9,H,F,L,-,后三位為關(guān)數碼管,當然顯示什么呢自己可以隨意的修改,為以后的擴展使用。

我按下第二行第二列的鍵,顯示的是6(1*4+2=6)

,明白了程序功能,下來(lái)你讀起來(lái)就輕松了

程序中的keyscan()函數就是掃描法

這是我花了周末下午的美好時(shí)光編好的程序啊,在板子上的效果圖,經(jīng)檢測無(wú)誤,奉上

#include
#include
#define uchar unsigned char
#define unit unsigned int
#definea 0x04//AAAA
#defineb 0x01// FB
#definec 0x10// FB
#defined 0x40//GGGG
#definee 0x80// ECh
#definef 0x02// EC
#define g 0x08//DDDDH
#defineh 0x20

unsigned char code LED_table[]={
a+b+c+d+e+f,//"0"
b+c,//"1"
a+b+d+e+g,//"2"
a+b+c+d+g,//"3"
b+c+f+g,//"4"
a+c+d+f+g,//"5"
a+c+d+e+f+g,//"6"
a+b+c,//"7"
a+b+c+d+e+f+g,//"8"
a+b+c+d+f+g,//"9"
b+c+e+f+g,//"H"
a+f+e+g,//"C"
d+e+f,//"F"
g,//"-"
0x00//black
};

uchar keyscan(void);

sbit COM1=P2^3;
sbit COM3=P2^1;
sbit COM4=P2^2;
sbit COM2=P2^0;

sbit CLK=P2^7;
void delayms(unit);

void main()
{uchar k=0;
CLK=1;
P0=0;
COM1=0;
COM2=1;
COM3=1;
COM4=1;
while(1)
{
while(k==0)
{
k=keybscan();
}
P0=LED_table[k];
k=0;
}
}
uchar keyscan(void)
{
uchar row,re,m=1,n=0;
P1=0xf0;//置所有行為低電平,行掃描,列線(xiàn)輸入(此時(shí))
if((P1&0xf0)!=0xf0)//判斷是否有有鍵按下(讀取列的真實(shí)狀態(tài),若第4列有鍵按下則P1的值會(huì )變成0111 0000),有往下執行
{
delayms(10);//延時(shí)去抖動(dòng)(10ms)
if((P1&0xf0)!=0xf0)//再次判斷列中是否是干擾信號,不是則向下執行
{
row=0xFE;//逐行掃描初值(即先掃描第1行)
while((row&0x10)!=0) //行掃描完成時(shí)(即4行已經(jīng)全部掃描完成)row為1110 1111停止while
{
P1=row;//輸出行掃描碼
if ((P1&0xf0)!=0xf0)//本行有鍵按下(即P1(真實(shí)的狀態(tài))的高四位不全為1)
{
re=((P1&0xf0)>>0x04); //輸出列掃描碼 按位或運算
re=(~re)&0x0f;//列值
while(re!=1)
{
re/=2;
m++;
}

return(n*4+m); //返回行和列
}
else

{
row=(row<<1)|0x01;//行掃描碼左移一位
n++;
}
}
}
else
{
return 0;//無(wú)鍵按下,返回0
}

}
}

void delayms(unit i)
{
unit j;
for(;i>0;i--)
for(j=227;j>0;j--);
}

提到擴展使用,做這個(gè)鍵盤(pán)絕對不是這么簡(jiǎn)單的應用,我有了很多想法,可以和前面一篇文章中的液晶顯示器結合起來(lái),編寫(xiě)一個(gè)模擬手機鍵盤(pán)的

程序,做一個(gè)相互通信的短信發(fā)送器,很有意思的哦,如果加上無(wú)線(xiàn)傳輸模塊,就可以短距離相互發(fā)短信,免費的哦,很有創(chuàng )意把,將學(xué)校的情侶間推銷(xiāo)一下說(shuō)不定很有市場(chǎng)前景呢,吼吼~~



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>