資料介紹
一、獨立鍵盤檢測
1、按鍵的檢測原理
單片機的I/O口既可以作為輸出也可以作為輸入使用,檢測按鍵時用的是輸入功能。把按鍵的一端接地,另一端與單片機的某個I/O口相連,開始時先給該I/O口賦一個高電平,然后讓單片機不斷地檢測該I/O口是否變成了低電平,當按鍵閉合時,相當于該I/O口通過按鍵與地相連,變成低電平,程序一旦檢測到I/O口變?yōu)榈碗娖骄驼f明按鍵被按下,然后執(zhí)行相應(yīng)的指令。
2、實驗板原理圖
獨立按鍵S2,S3,S4,S5分別連接單片機的P3^4,5,6,7。
3、去抖動操作
由于使用的是彈性小按鍵,就是一個機械觸點的器件。在按下時會有微觀上的機械抖動,反應(yīng)到電平就是高,低,高,低,抖動的長短與機械特性有關(guān),一般在5~10ms。所以在檢測鍵盤是否按下時要加上去抖動操作。
4、用數(shù)碼管的前三位實現(xiàn)000~999的循環(huán)計時,按下S2時停止,再次按下開始;按下S3時數(shù)值加1,按下S4時數(shù)值減1;按下S5時數(shù)值清零。
#include
#define uint unsigned int
#define uchar unsigned char
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
int num=0;
char num1=0;
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void keyscan()//鍵盤掃描函數(shù)
{
if(key1==0)
{
delayms(10);
if(key1==0)
{
TR0=~TR0;//啟動或關(guān)閉定時器
}
while(!key1);
}
if(key2==0)
{
delayms(10);//去抖動操作,如果不加會出現(xiàn)num的值加了好多個,因為循環(huán)檢測速度非???/span>
if(key2==0)
{
num++;
if(num==1000)
num=0;
}
while(!key2);//等待按鍵釋放,因為人為手動按下的過程的時間比單片機檢測的時間長很多,
}//如果不加也會出現(xiàn)num的值加了很多次的現(xiàn)象
if(key3==0)
{
delayms(10);
if(key3==0)
{
num--;
if(num==-1)
num=999;
}
while(!key3);
}
if(key4==0)
{
delayms(10);
if(key4==0)
{
num=0;
}
while(!key4);
}
}
void display(uchar ge,uchar shi,uchar bai)
{
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;//打開第一個數(shù)碼管
wela=0;
delayms(1);
wela=1;//關(guān)閉數(shù)碼管,不然快速顯示時數(shù)碼管數(shù)字之外的二極管有微弱的亮度
P0=0xff;
wela=0;
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(1);
wela=1;
P0=0xff;
wela=0;
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(1);
wela=1;
P0=0xff;
wela=0;
}
void main()
{
dula=0;
wela=0;//數(shù)碼管初始化,開始時關(guān)閉所有數(shù)碼管
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
keyscan();//一直在while循環(huán)里檢測鍵盤是否被按下
display(num%10,num/10%10,num/100);
}
}
void timer0() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==20)//1s
{
num1=0;
num++;
if(num==1000)
num=0;
}
}
總結(jié):獨立鍵盤主要注意兩點(1)按下時的去抖動延時delayms函數(shù),大概10ms;(2)松手時的按鍵釋放檢測while(!key);等待按鍵釋放。
二、矩陣鍵盤檢測
1、矩陣鍵盤連接圖
結(jié)合上面的原理圖,實驗板上的4乘4的矩陣分別接單片機的P3^0到7口。行線和列線是線與的關(guān)系即0&1=0,只要兩根線有一根為0則整根線為低電平。獨立鍵盤和單片機連接時每個鍵盤都占有一個I/O口,當鍵盤數(shù)量較多時單片機的I/O口就不夠用了,就引入了矩陣鍵盤。試驗板上是16個按鍵的4乘4矩陣鍵盤即4行4列,每行每個按鍵的一端連接在一起構(gòu)成行線,每列每個按鍵的另一端連接在一起構(gòu)成列線,這樣就是4行4列的8根線,就連接到單片機的8個I/O口。
2、矩陣鍵盤的檢測原理
獨立鍵盤的一端固定為低電平,檢測時比較方便。矩陣鍵盤兩端都連接單片機的I/O口,就需要人為的通過單片機送出低電平。檢測的時候,先送一行為低電平,其余幾行為高電平,這就確定了哪一行,然后立即輪流檢測一次各列是否有低電平,如果檢測到某一列為低電平就確定了哪一列。用同樣的方法輪流送各行一次低電平,再輪流檢測一次各列是否變?yōu)榈碗娖剑@樣就可以檢測完所有的按鍵。(也可以將列線置低電平,掃描行線是否有低電平)
3、按下16個矩陣鍵盤依次在數(shù)碼管上顯示1-16的平方。如按下第一個顯示1,第二個顯示4,第三個顯示9…
#include
sbit dula=P2^6;
sbit wela=P2^7;
#define uint unsigned int
#define uchar unsigned char
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(int num)//將每個按鍵要顯示的數(shù)傳遞給形參
{
dula=1;
P0=table[num/100];//百位
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(1);
wela=1;
P0=0xff;
wela=0;
dula=1;
P0=table[num/10%10];//十位
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(1);
wela=1;
P0=0xff;
wela=0;
dula=1;
P0=table[num%10];//個位
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(1);
wela=1;
P0=0xff;
wela=0;
}
void keyscan()
{
uchar temp;
int key;
P3=0xfe;//將第一行置為0
temp=P3;
temp=temp&0xf0;//如果第一行有按鍵按下,與f0相與之后肯定不是f0,說明被按下
if(temp!=0xf0)
{
delayms(10);//去抖動
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;//將P3口重新賦值給temp,因為之前的temp是相與之后的結(jié)果
switch(temp)
{
case 0xee:key=1;break;
case 0xde:key=2*2;break;
case 0xbe:key=3*3;break;
case 0x7e:key=4*4;break;
}
}
while(temp!=0xf0)//檢測按鍵是否釋放
{
temp=P3;
temp=temp&0xf0;//比獨立按鍵麻煩一點,就是要一直檢測P3口
}
display(key);//顯示按鍵要顯示的值
}
P3=0xfd;//第二行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:key=5*5;break;
case 0xdd:key=6*6;break;
case 0xbd:key=7*7;break;
case 0x7d:key=8*8;break;
}
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
P3=0xfb;//第三行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:key=9*9;break;
case 0xdb:key=10*10;break;
case 0xbb:key=11*11;break;
case 0x7b:key=12*12;break;
}
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
P3=0xf7;//第四行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:key=13*13;break;
case 0xd7:key=14*14;break;
case 0xb7:key=15*15;break;
case 0x77:key=16*16;break;
}
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
display(key);
}
void main()
{
dula=0;
wela=0;
while(1)
{
keyscan();//在大循環(huán)里一直檢測按鍵
}
}
在按下第四行第四列的按鍵后顯示256
矩陣鍵盤關(guān)鍵的代碼在于分別將每行置0然后檢測每一列,去抖動之后,在檢測按鍵是否釋放要一直讀取P3口
P3=0xfe;//將第一行置為0
temp=P3;
temp=temp&0xf0;//如果第一行有按鍵按下,與f0相與之后肯定不是f0,說明被按下
if(temp!=0xf0)
{
delayms(10);//去抖動
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;//將P3口重新賦值給temp,因為之前的temp是相與之后的結(jié)果
switch(temp)
{
case 0xee:key=1;break;
case 0xde:key=2*2;break;
case 0xbe:key=3*3;break;
case 0x7e:key=4*4;break;
}
}
while(temp!=0xf0)//檢測按鍵是否釋放
{
temp=P3;
temp=temp&0xf0;//比獨立按鍵麻煩一點,就是要一直檢測P3口
}
- 51單片機矩陣鍵盤掃描程序 11次下載
- 51單片機矩陣鍵盤的原理圖 69次下載
- 51單片機按鍵檢測--獨立按鍵與矩陣鍵盤
- 實例制作一個51單片機連接PS2鍵盤講解
- 使用51單片機獨立鍵盤控制輸出脈沖信號的程序免費下載 19次下載
- 使用51單片機實現(xiàn)獨立鍵盤的簡單資料說明
- 使用51單片機進行鍵盤掃描的程序免費下載
- 使用51單片機實現(xiàn)矩陣鍵盤的代碼免費下載
- 51單片機的鍵盤掃描程序免費下載
- 使用51單片機實現(xiàn)矩陣式鍵盤的資料和程序免費下載
- 使用51單片機實現(xiàn)矩陣鍵盤的程序免費下載
- 51單片機匯編語言教程之單片機鍵盤接口程序設(shè)計的詳細資料說明 19次下載
- 使用51單片機進行矩陣鍵盤的程序免費下載
- 51單片機的鍵盤掃描程序資料免費下載 2次下載
- 51單片機3X44X4矩陣鍵盤,鍵盤掃描 39次下載
- 基于51單片機的矩陣鍵盤設(shè)計 2749次閱讀
- 如何實現(xiàn)基于單片機的鍵盤檢測 2008次閱讀
- 基于單片機的矩陣鍵盤檢測案例 1323次閱讀
- 基于51單片機的紅外檢測光照檢測智能臺燈仿真設(shè)計 1647次閱讀
- 基于51單片機的羽毛球計分器設(shè)計 2096次閱讀
- 基于51單片機的簡易電子琴設(shè)計 6526次閱讀
- 基于51單片機的籃球計分器設(shè)計 6593次閱讀
- 基于51單片機的甲醛濃度檢測儀設(shè)計 2399次閱讀
- 單片機鍵盤檢測與應(yīng)用 5393次閱讀
- 51單片機引腳簡介 5.4w次閱讀
- 如何對51單片機進行外部擴展 1.5w次閱讀
- 新手學(xué)習(xí)單片機的首選:51單片機 8836次閱讀
- 51單片機矩陣鍵盤與8051連接設(shè)計 7345次閱讀
- 單片機8x8矩陣鍵盤原理說明 2.6w次閱讀
- C51單片機矩陣鍵盤掃描去抖程序 1.3w次閱讀
下載排行
本周
- 1晶體三極管的電流放大作用詳細說明
- 0.77 MB | 30次下載 | 2 積分
- 2雙極型三極管放大電路的三種基本組態(tài)的學(xué)習(xí)課件免費下載
- 4.03 MB | 23次下載 | 1 積分
- 3多級放大電路的學(xué)習(xí)課件免費下載
- 1.81 MB | 20次下載 | 2 積分
- 4九陽豆?jié){機高清原理圖
- 2.47 MB | 8次下載 | 1 積分
- 5AIWA J470維修手冊 (可直接打?。?/a>
- 3.16 MB | 2次下載 | 10 積分
- 6基于51/32單片機按鍵控制步進電機正反轉(zhuǎn),A4988驅(qū)動
- 2.05 MB | 1次下載 | 1 積分
- 7STM32F10xxx單片機編程手冊
- 0.29 MB | 1次下載 | 免費
- 8STM32英文參考手冊
- 13.17 MB | 1次下載 | 免費
本月
- 1晶體三極管的電流放大作用詳細說明
- 0.77 MB | 30次下載 | 2 積分
- 2雙極型三極管放大電路的三種基本組態(tài)的學(xué)習(xí)課件免費下載
- 4.03 MB | 23次下載 | 1 積分
- 3第十一屆 藍橋杯 單片機設(shè)計與開發(fā)項目 省賽 程序設(shè)計試題及源碼
- 90.88KB | 23次下載 | 3 積分
- 4Python從入門到精通背記手冊
- 18.77 MB | 22次下載 | 1 積分
- 5多級放大電路的學(xué)習(xí)課件免費下載
- 1.81 MB | 20次下載 | 2 積分
- 6STM32F103C8T6開發(fā)板最小系統(tǒng)原理圖
- 0.78 MB | 17次下載 | 免費
- 7SX1308應(yīng)用電路圖與SX1308升壓電路圖
- 0.18 MB | 8次下載 | 1 積分
- 8東芝彩色電視機29SF6C維修說明書
- 4.86 MB | 8次下載 | 1 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935127次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
- 1.48MB | 420063次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191382次下載 | 10 積分
- 5十天學(xué)會AVR單片機與C語言視頻教程 下載
- 158M | 183337次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81585次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73814次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65988次下載 | 10 積分
評論