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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

矩陣鍵盤原理與結構

作者:佚名   來源:本站原創   點擊數:  更新時間:2013年12月02日   【字體:

矩陣式結構的鍵盤識別要復雜一些,列線通過電阻接正電源,并將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當按鍵沒有按下時,所有的輸入端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態就可得知是否有鍵按下了。

在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數越多,區別越明顯,比如再多加一條線就可以構成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數比較多時,采用矩陣法來做鍵盤是合理的。

  <1>確定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”。

  行掃描法 行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法,如上圖所示鍵盤,介紹過程如下。

  1、判斷鍵盤中有無鍵按下 將全部行線Y0-Y3置低電平,然后檢測列線的狀態。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。

  2、判斷閉合鍵所在的位置 在確認有鍵按下后,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。

  <2>確定矩陣式鍵盤上何鍵被按下介紹一種“高低電平翻轉法”。

  首先讓P1口高四位為1,低四位為0,。若有按鍵按下,則高四位中會有一個1翻轉為0,低四位不會變,此時即可確定被按下的鍵的行位置。

  然后讓P1口高四位為0,低四位為1,。若有按鍵按下,則低四位中會有一個1翻轉為0,高四位不會變,此時即可確定被按下的鍵的列位置。
  最后將上述兩者進行或運算即可確定被按下的鍵的位置。


 

CODE:

/*矩陣4*3按鍵*/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code dutable[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0xc7,0x88};//段選0~9+L+A
uchar num,temp,flag;//flag標記在沒有按鍵之前不顯示任何數字
void delay(uint z);
void display(uchar num);
uchar keyscan();
void main()
{
while(1)
{
display(keyscan());
}
}
void delay(uint z)

uint x,y;
for(x=z;x>0;x--)
{
for(y=0;y<=110;y++)
{
}
}
}
void display(uchar num)
{
if(flag==0)
{
P0=0xff;
}
else
{
P0=dutable[num];
}
}
uchar keyscan()
{
P1=0xfd;//11111101
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)//有按鍵
{
delay(10);//消除抖動,確定有按鍵
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
flag=1;
switch(temp)
{
case 0xed: num=0;
break;
case 0xdd: num=1;
break;
case 0xbd: num=2;
break;
case 0x7d: num=3;
break;
}
if(temp!=0xf0)
{
delay(10);//消除抖動,確定有按鍵已經松開
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0; 
}
}

}

P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)//有按鍵
{
delay(10);//消除抖動,確定有按鍵
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
flag=1;
temp=P1;
switch(temp)
{
case 0xeb: num=4;
break;
case 0xdb: num=5;
break;
case 0xbb: num=6;
break;
case 0x7b: num=7;
break;
}
if(temp!=0xf0)
{
delay(10);//消除抖動,確定有按鍵已經松開
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0; 
}
}
}

P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)//有按鍵
{
delay(10);//消除抖動,確定有按鍵
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
flag=1;
temp=P1;
switch(temp)
{
case 0xe7: num=8;
break;
case 0xd7: num=9;
break;
case 0xb7: num=10;
break;
case 0x77: num=11;
break;
}
if(temp!=0xf0)
{
delay(10);//消除抖動,確定有按鍵已經松開
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0; 
}
}

}
return num;
}

 

關閉窗口

相關文章

主站蜘蛛池模板: 亚洲成人福利在线观看 | 国产免费一区二区三区 | 色成人免费网站 | 综合自拍| 视频一区二区三区中文字幕 | 国产精品一区二区三 | 中文在线播放 | 日韩午夜电影在线观看 | 成人av高清在线观看 | 日本免费在线 | 一区二区在线不卡 | 亚洲网站在线观看 | 伊人一区 | 国产91久久精品一区二区 | 欧美在线一二三 | 国产精品一区二区三区久久久 | 日韩电影中文字幕 | 色天堂影院 | 国产精品高清一区二区三区 | 国产a级黄色录像 | 欧美一级片在线 | 看片国产 | 在线日韩福利 | 91免费在线 | av一级| 国产视频一区在线观看 | 成年人黄色免费视频 | 午夜影院在线观看免费 | 黑人精品 | 高清人人天天夜夜曰狠狠狠狠 | 四虎影视免费观看 | 九九热国产视频 | 一区二区三区亚洲 | 国产精品福利网 | 97超碰在线播放 | 偷拍第一页 | 91精品国产91久久久久久密臀 | 欧美日韩黄色一级片 | 日本天天操 | av毛片| 91免费小视频 |