上圖為15單片機(jī)矩陣按鍵原理圖;
獨(dú)立按鍵按鍵必須使得J5中2和3兩個(gè)短接;那么如何判斷按鍵按下的的值呢?
原理:獨(dú)立按鍵:
使得J5中2與3短接則可以觀察原理圖
可以根據(jù)紅色標(biāo)記發(fā)現(xiàn)2與3短接后只能使用S7,S6,S5,S4四個(gè)獨(dú)立按鍵且這四個(gè)獨(dú)立按鍵的一個(gè)端腳是接地的則一定為低電平“0”。那么我們就只能通過P30,P31,P32,P33四個(gè)引腳的高低電平。那么什么是引腳初始化,我們先得讓這四個(gè)引腳全部賦予高電平“1”,當(dāng)按下按鍵的一瞬間這四個(gè)中的某個(gè)引腳將會(huì)通地,從而獲得低電平“0”,則我們就可以通過這四個(gè)引腳的哪個(gè)引腳變?yōu)榈碗娖綇亩袛喟存I值。
void Delay25ms() //@12.000MHz //15單片機(jī)延遲函數(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,此時(shí)應(yīng)當(dāng)確保其他P3口不會(huì)受影響
}
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();//不斷檢測(cè)按鍵值
}
}
if(P30==0){Delay25ms();while(P30==0);Delay25ms();K=7;}判斷當(dāng)P30為0時(shí),開始消抖,當(dāng)松下按下的手時(shí)消抖后給K賦值從而判斷為按鍵7被按下;
消抖:理想狀態(tài)下按鍵時(shí)序圖為:
你得知道現(xiàn)實(shí)一般非常殘酷,看看現(xiàn)實(shí)吧:
如果不用消抖延遲會(huì)出現(xiàn)按鍵識(shí)別出誤電壓不穩(wěn)定;消抖函數(shù)一般比10ms大就行不過一般不要太大30ms以內(nèi)為好;
矩陣按鍵:
矩陣按鍵就必須使得J5中2和1兩個(gè)短接;
根據(jù)獨(dú)立按鍵的規(guī)則我們一般使得按鍵一端為0然后通過另一端檢測(cè);這一次我們將下面紅色標(biāo)記內(nèi)得引腳逐個(gè)賦值為“0”(低電平);后使用下面的檢測(cè)按鍵值。
代碼如下:
void Delay25ms() //@12.000MHz //15單片機(jī)延遲函數(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();//不斷檢測(cè)按鍵值
}
}
矩陣按鍵逐個(gè)賦值低電平為何都要初始化?先將按鍵初始化,給P30賦值為“0”若當(dāng)S19按下經(jīng)過消抖以及判斷是否松手和再次消抖則P34立即賦值為“0”;K為19;若是接下來不進(jìn)行按鍵初始化則P34仍然為“0”,則當(dāng)P31賦值為“0”時(shí),此時(shí)K又將賦值為18;最終賦值為16,從而造成按鍵判斷失誤;如果此時(shí)不給P30賦值為“1”則如果按下S18此時(shí)循環(huán)檢測(cè)時(shí)仍然會(huì)檢測(cè)為按下S19。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧