資料介紹
一、獨(dú)立鍵盤檢測(cè)
1、按鍵的檢測(cè)原理
單片機(jī)的I/O口既可以作為輸出也可以作為輸入使用,檢測(cè)按鍵時(shí)用的是輸入功能。把按鍵的一端接地,另一端與單片機(jī)的某個(gè)I/O口相連,開始時(shí)先給該I/O口賦一個(gè)高電平,然后讓單片機(jī)不斷地檢測(cè)該I/O口是否變成了低電平,當(dāng)按鍵閉合時(shí),相當(dāng)于該I/O口通過(guò)按鍵與地相連,變成低電平,程序一旦檢測(cè)到I/O口變?yōu)榈碗娖骄驼f(shuō)明按鍵被按下,然后執(zhí)行相應(yīng)的指令。
2、實(shí)驗(yàn)板原理圖
獨(dú)立按鍵S2,S3,S4,S5分別連接單片機(jī)的P3^4,5,6,7。
3、去抖動(dòng)操作
由于使用的是彈性小按鍵,就是一個(gè)機(jī)械觸點(diǎn)的器件。在按下時(shí)會(huì)有微觀上的機(jī)械抖動(dòng),反應(yīng)到電平就是高,低,高,低,抖動(dòng)的長(zhǎng)短與機(jī)械特性有關(guān),一般在5~10ms。所以在檢測(cè)鍵盤是否按下時(shí)要加上去抖動(dòng)操作。
4、用數(shù)碼管的前三位實(shí)現(xiàn)000~999的循環(huán)計(jì)時(shí),按下S2時(shí)停止,再次按下開始;按下S3時(shí)數(shù)值加1,按下S4時(shí)數(shù)值減1;按下S5時(shí)數(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;//啟動(dòng)或關(guān)閉定時(shí)器
}
while(!key1);
}
if(key2==0)
{
delayms(10);//去抖動(dòng)操作,如果不加會(huì)出現(xiàn)num的值加了好多個(gè),因?yàn)檠h(huán)檢測(cè)速度非常快
if(key2==0)
{
num++;
if(num==1000)
num=0;
}
while(!key2);//等待按鍵釋放,因?yàn)槿藶槭謩?dòng)按下的過(guò)程的時(shí)間比單片機(jī)檢測(cè)的時(shí)間長(zhǎng)很多,
}//如果不加也會(huì)出現(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;//打開第一個(gè)數(shù)碼管
wela=0;
delayms(1);
wela=1;//關(guān)閉數(shù)碼管,不然快速顯示時(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ù)碼管初始化,開始時(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)里檢測(cè)鍵盤是否被按下
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é):獨(dú)立鍵盤主要注意兩點(diǎn)(1)按下時(shí)的去抖動(dòng)延時(shí)delayms函數(shù),大概10ms;(2)松手時(shí)的按鍵釋放檢測(cè)while(!key);等待按鍵釋放。
二、矩陣鍵盤檢測(cè)
1、矩陣鍵盤連接圖
結(jié)合上面的原理圖,實(shí)驗(yàn)板上的4乘4的矩陣分別接單片機(jī)的P3^0到7口。行線和列線是線與的關(guān)系即0&1=0,只要兩根線有一根為0則整根線為低電平。獨(dú)立鍵盤和單片機(jī)連接時(shí)每個(gè)鍵盤都占有一個(gè)I/O口,當(dāng)鍵盤數(shù)量較多時(shí)單片機(jī)的I/O口就不夠用了,就引入了矩陣鍵盤。試驗(yàn)板上是16個(gè)按鍵的4乘4矩陣鍵盤即4行4列,每行每個(gè)按鍵的一端連接在一起構(gòu)成行線,每列每個(gè)按鍵的另一端連接在一起構(gòu)成列線,這樣就是4行4列的8根線,就連接到單片機(jī)的8個(gè)I/O口。
2、矩陣鍵盤的檢測(cè)原理
獨(dú)立鍵盤的一端固定為低電平,檢測(cè)時(shí)比較方便。矩陣鍵盤兩端都連接單片機(jī)的I/O口,就需要人為的通過(guò)單片機(jī)送出低電平。檢測(cè)的時(shí)候,先送一行為低電平,其余幾行為高電平,這就確定了哪一行,然后立即輪流檢測(cè)一次各列是否有低電平,如果檢測(cè)到某一列為低電平就確定了哪一列。用同樣的方法輪流送各行一次低電平,再輪流檢測(cè)一次各列是否變?yōu)榈碗娖剑@樣就可以檢測(cè)完所有的按鍵。(也可以將列線置低電平,掃描行線是否有低電平)
3、按下16個(gè)矩陣鍵盤依次在數(shù)碼管上顯示1-16的平方。如按下第一個(gè)顯示1,第二個(gè)顯示4,第三個(gè)顯示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)//將每個(gè)按鍵要顯示的數(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];//個(gè)位
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,說(shuō)明被按下
if(temp!=0xf0)
{
delayms(10);//去抖動(dòng)
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;//將P3口重新賦值給temp,因?yàn)橹暗膖emp是相與之后的結(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)//檢測(cè)按鍵是否釋放
{
temp=P3;
temp=temp&0xf0;//比獨(dú)立按鍵麻煩一點(diǎn),就是要一直檢測(cè)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)里一直檢測(cè)按鍵
}
}
在按下第四行第四列的按鍵后顯示256
矩陣鍵盤關(guān)鍵的代碼在于分別將每行置0然后檢測(cè)每一列,去抖動(dòng)之后,在檢測(cè)按鍵是否釋放要一直讀取P3口
P3=0xfe;//將第一行置為0
temp=P3;
temp=temp&0xf0;//如果第一行有按鍵按下,與f0相與之后肯定不是f0,說(shuō)明被按下
if(temp!=0xf0)
{
delayms(10);//去抖動(dòng)
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;//將P3口重新賦值給temp,因?yàn)橹暗膖emp是相與之后的結(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)//檢測(cè)按鍵是否釋放
{
temp=P3;
temp=temp&0xf0;//比獨(dú)立按鍵麻煩一點(diǎn),就是要一直檢測(cè)P3口
}
- 51單片機(jī)矩陣鍵盤掃描程序 6次下載
- 51單片機(jī)矩陣鍵盤的原理圖 66次下載
- 51單片機(jī)按鍵檢測(cè)--獨(dú)立按鍵與矩陣鍵盤
- 實(shí)例制作一個(gè)51單片機(jī)連接PS2鍵盤講解
- 使用51單片機(jī)獨(dú)立鍵盤控制輸出脈沖信號(hào)的程序免費(fèi)下載 19次下載
- 使用51單片機(jī)實(shí)現(xiàn)獨(dú)立鍵盤的簡(jiǎn)單資料說(shuō)明
- 使用51單片機(jī)進(jìn)行鍵盤掃描的程序免費(fèi)下載
- 使用51單片機(jī)實(shí)現(xiàn)矩陣鍵盤的代碼免費(fèi)下載
- 51單片機(jī)的鍵盤掃描程序免費(fèi)下載
- 使用51單片機(jī)實(shí)現(xiàn)矩陣式鍵盤的資料和程序免費(fèi)下載
- 使用51單片機(jī)實(shí)現(xiàn)矩陣鍵盤的程序免費(fèi)下載
- 51單片機(jī)匯編語(yǔ)言教程之單片機(jī)鍵盤接口程序設(shè)計(jì)的詳細(xì)資料說(shuō)明 19次下載
- 使用51單片機(jī)進(jìn)行矩陣鍵盤的程序免費(fèi)下載
- 51單片機(jī)的鍵盤掃描程序資料免費(fèi)下載 2次下載
- 51單片機(jī)3X44X4矩陣鍵盤,鍵盤掃描 39次下載
- 基于51單片機(jī)的矩陣鍵盤設(shè)計(jì) 1919次閱讀
- 如何實(shí)現(xiàn)基于單片機(jī)的鍵盤檢測(cè) 1394次閱讀
- 基于單片機(jī)的矩陣鍵盤檢測(cè)案例 925次閱讀
- 基于51單片機(jī)的紅外檢測(cè)光照檢測(cè)智能臺(tái)燈仿真設(shè)計(jì) 1291次閱讀
- 基于51單片機(jī)的羽毛球計(jì)分器設(shè)計(jì) 1811次閱讀
- 基于51單片機(jī)的簡(jiǎn)易電子琴設(shè)計(jì) 5923次閱讀
- 基于51單片機(jī)的籃球計(jì)分器設(shè)計(jì) 6253次閱讀
- 單片機(jī)鍵盤檢測(cè)與應(yīng)用 5183次閱讀
- 51單片機(jī)引腳簡(jiǎn)介 5.4w次閱讀
- 如何對(duì)51單片機(jī)進(jìn)行外部擴(kuò)展 1.5w次閱讀
- 新手學(xué)習(xí)單片機(jī)的首選:51單片機(jī) 8536次閱讀
- 51單片機(jī)矩陣鍵盤與8051連接設(shè)計(jì) 7218次閱讀
- 單片機(jī)8x8矩陣鍵盤原理說(shuō)明 2.5w次閱讀
- 51單片機(jī)學(xué)習(xí)感悟與51單片機(jī)上拉電阻心得 4229次閱讀
- C51單片機(jī)矩陣鍵盤掃描去抖程序 1.3w次閱讀
下載排行
本周
- 1TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 2開關(guān)電源基礎(chǔ)知識(shí)
- 5.73 MB | 6次下載 | 免費(fèi)
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設(shè)計(jì)
- 0.60 MB | 3次下載 | 免費(fèi)
- 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 0.61 MB | 2次下載 | 免費(fèi)
- 651單片機(jī)窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費(fèi)
- 751單片機(jī)大棚環(huán)境控制器仿真程序
- 1.10 MB | 2次下載 | 免費(fèi)
- 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6653次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191185次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多