首先看原理圖
1. 獨立按鍵:
注意:我們使用藍橋杯的闆子時候,寫代碼之前一定要将在闆子上将J5的2和3用跳線帽連接配接起來
檢測原理:
51單片機上電之後P3的8個IO口全部都是高電平,按鍵一端連接配接的是GND,按鍵按下電路接通使得另外一端的電平變成了低電平,也就是說我們隻要檢測對應的IO口是不是低電平就可以檢測按鍵是否按下。
從原理圖可以看到,當J5的2和3連接配接的時候,如果S7被按下,則P30會變成低電平,同樣的S6對應着P31,S5對應P32,S4對應P33
程式目的:将每次的鍵值在數位管上面顯示出來
程式測試:
我們隻需要看P3的低三位哪一個是低電平,就可以知道哪一個鍵被按下
下面程式就是用數位管将鍵值列印出來,當沒有獨立按鍵按下時數位管顯示0,有鍵按下的時候顯示鍵值.
//按鍵檢測函數
unsigned char key_scan(){
unsigned char key_value = 0;
//當獨立按鍵按下時,會使低三位有一個不是高電平
if((P3&0x0F)!=0x0F){
delay_ms(50); //延時消抖
if((P3&0x0F)!=0x0F){
switch(P3&0x0F){
case 0x0e:key_value = 7;break;
case 0x0d:key_value = 6;break;
case 0x0b:key_value = 5;break;
case 0x07:key_value = 4;break;
}
}
}
return key_value;
}
void main()
{
while(1){
//關于數位管的顯示的函數我有篇文章已經專門寫好
display_num(1,key_scan());
}
}
2. 矩陣按鍵
首先我們必須非常清楚獨立按鍵的原理,才能繼續玩矩陣按鍵,獨立按鍵是因為按鍵的一端連接配接GND,另一端連接配接IO口,當按鍵按下的時候電路接通,IO口為低電平判斷按鍵被按下.
我麼檢測矩陣按鍵也可以是同樣的思路,這個時候我們藍橋杯隻要将J5的1和2引腳連上就可以用矩陣按鍵了,當時唯一值得注意的是,如果我們用時藍橋杯的轉接闆有些引腳就不一樣,我們的P36被替換成了P42,P37替換成了P44.在這裡我們不考慮轉接闆的情況.
根據原理圖,我們循環給某一行或者循環給某一列低電平,加入我們循環給四列依次給其中一列低電平,其他的列給高電平,檢測行變化,某個鍵被按下會導緻相應的行産生低電平,注意單片機的電平變化是”與”的關系,隻有有一方為低電平,另外一方就會為低電平,這是單片機IO口内部結構決定的.我們根據相應的行和列出現低電平的位置就可以計算出被按下的鍵的位置
unsigned char key_code[] = {0x7f,0xbf,0xdf,0xef};
//按鍵掃描函數
unsigned char key_scan()
{
int i,key_value=0;
//判斷按鍵
for(i=0;i<4;i++)
{
P3 = key_code[i];
//如果檢測到按鍵被按下
if(P3!=key_code[i])
{
delay_ms(20);//延時消抖
if(P3!=key_code[i])//如果仍然檢測到按鍵被按下,則按鍵真的被按下
{
switch(P3&0x0f)
{
//檢測按鍵是不是松開
case(0x0e):{while(P3==(key_code[i]&0xfe));key_value=4*i+7;}break;
case(0x0d):{while(P3==(key_code[i]&0xfd));key_value=4*i+6;}break;
case(0x0b):{while(P3==(key_code[i]&0xfb));key_value=4*i+5;}break;
case(0x07):{while(P3==(key_code[i]&0xf7));key_value=4*i+4;}break;
}
}
}
}
return key_value;
}