上圖為15單片機矩陣按鍵原理圖;
獨立按鍵按鍵必須使得J5中2和3兩個短接;那么如何判斷按鍵按下的的值呢?
原理:獨立按鍵:
使得J5中2與3短接則可以觀察原理圖
可以根據(jù)紅色標記發(fā)現(xiàn)2與3短接后只能使用S7,S6,S5,S4四個獨立按鍵且這四個獨立按鍵的一個端腳是接地的則一定為低電平“0”。那么我們就只能通過P30,P31,P32,P33四個引腳的高低電平。那么什么是引腳初始化,我們先得讓這四個引腳全部賦予高電平“1”,當按下按鍵的一瞬間這四個中的某個引腳將會通地,從而獲得低電平“0”,則我們就可以通過這四個引腳的哪個引腳變?yōu)榈碗娖綇亩袛喟存I值。
void Delay25ms() //@12.000MHz //15單片機延遲函數(shù)(功能按鍵消抖)
{
unsigned char i, j;
i = 49;
j = 160;
do
{
while (--j);
} while (--i);
}
void anjian_init()//按鍵初始化
{
P3=0xFF//可以直接使得P30=1,P31=1,P32=1,P33=1,此時應當確保其他P3口不會受影響
}
unsigned char KeyNumber()//按鍵判斷
{
unsigned char K;
anjian_init();
if(P30==0){Delay25ms();while(P30==0);Delay25ms();K=7;}
if(P31==0){Delay25ms();while(P31==0);Delay25ms();K=6;}
if(P32==0){Delay25ms();while(P32==0);Delay25ms();K=5;}
if(P33==0){Delay25ms();while(P33==0);Delay25ms();K=4;}
return K;
}
void main()
{
unsigned char K;
while(1)
{
K=keyNumber();//不斷檢測按鍵值
}
}
if(P30==0){Delay25ms();while(P30==0);Delay25ms();K=7;}判斷當P30為0時,開始消抖,當松下按下的手時消抖后給K賦值從而判斷為按鍵7被按下;
消抖:理想狀態(tài)下按鍵時序圖為:
你得知道現(xiàn)實一般非常殘酷,看看現(xiàn)實吧:
如果不用消抖延遲會出現(xiàn)按鍵識別出誤電壓不穩(wěn)定;消抖函數(shù)一般比10ms大就行不過一般不要太大30ms以內為好;
矩陣按鍵:
矩陣按鍵就必須使得J5中2和1兩個短接;
根據(jù)獨立按鍵的規(guī)則我們一般使得按鍵一端為0然后通過另一端檢測;這一次我們將下面紅色標記內得引腳逐個賦值為“0”(低電平);后使用下面的檢測按鍵值。
代碼如下:
void Delay25ms() //@12.000MHz //15單片機延遲函數(shù)(功能按鍵消抖)
{
unsigned char i, j;
i = 49;
j = 160;
do
{
while (--j);
} while (--i);
}
void anjian_init() //按鍵初始化
{
P3=0x3F; //0011 1111
P42==1;
P44==1;
}
unsigned char KeyNumber()//按鍵判斷
{
unsigned char K;
anjian_init();
P30=0;
if(P34==0){Delay25ms();while(P34==0);Delay25ms();K=19;}
if(P35==0){Delay25ms();while(P35==0);Delay25ms();K=15;}
if(P42==0){Delay25ms();while(P42==0);Delay25ms();K=11;}
if(P44==0){Delay25ms();while(P44==0);Delay25ms();K=7;}
anjian_init();
P31=0;
if(P34==0){Delay25ms();while(P34==0);Delay25ms();K=18;}
if(P35==0){Delay25ms();while(P35==0);Delay25ms();K=14;}
if(P42==0){Delay25ms();while(P42==0);Delay25ms();K=10;}
if(P44==0){Delay25ms();while(P44==0);Delay25ms();K=6;}
anjian_init();
P32=0;
if(P34==0){Delay25ms();while(P34==0);Delay25ms();K=17;}
if(P35==0){Delay25ms();while(P35==0);Delay25ms();K=13;}
if(P42==0){Delay25ms();while(P42==0);Delay25ms();K=9;}
if(P44==0){Delay25ms();while(P44==0);Delay25ms();K=5;}
anjian_init();
P33=0;
if(P34==0){Delay25ms();while(P34==0);Delay25ms();K=16;}
if(P35==0){Delay25ms();while(P35==0);Delay25ms();K=12;}
if(P42==0){Delay25ms();while(P42==0);Delay25ms();K=8;}
if(P44==0){Delay25ms();while(P44==0);Delay25ms();K=4;}
return K;
}
void main()
{
unsigned char K;
while(1)
{
K=keyNumber();//不斷檢測按鍵值
}
}
矩陣按鍵逐個賦值低電平為何都要初始化?先將按鍵初始化,給P30賦值為“0”若當S19按下經(jīng)過消抖以及判斷是否松手和再次消抖則P34立即賦值為“0”;K為19;若是接下來不進行按鍵初始化則P34仍然為“0”,則當P31賦值為“0”時,此時K又將賦值為18;最終賦值為16,從而造成按鍵判斷失誤;如果此時不給P30賦值為“1”則如果按下S18此時循環(huán)檢測時仍然會檢測為按下S19。
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站題目:單片機中按鍵的使用-創(chuàng)新互聯(lián)
文章URL:http://www.rwnh.cn/article34/jogse.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、Google、響應式網(wǎng)站、網(wǎng)站改版、外貿(mào)網(wǎng)站建設、標簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內容