一.認識按鍵
如上圖所示爲直插式按鍵,按下按鍵後鬆手按鍵立即彈起。有4個引腳,可以看出4各引腳每兩個向內彎曲,彎曲的對立面兩個引腳導通,其餘不導通。即1和4之間是導通的,2和3之間是導通的,而1和2,3和4之間是不導通的,只有按下按鍵才能使其導通。
二.P3口的第二功能
在不使用第二功能時它就是普通的I/O口。
P3口第二功能表
引腳 | 第二功能 |
---|---|
P3.0 | RxD:串行口接收數據輸入端 |
P3.1 | TxD:串行口發送數據輸出端 |
P3.2 | TNT0:外部中斷申請輸入端0 |
P3.3 | TNT1:外部中斷申請輸入端1 |
P3.4 | T0:外部計數脈衝輸入端0 |
P3.5 | T1:外部計數脈衝輸入端1 |
P3.6 | WR:寫外設控制信號輸出端 |
P3.7 | RD:讀外設控制信號輸出端 |
三.按鍵消抖
鍵盤軟件消抖
按鍵一般是利用機械觸點的閉合、斷開作用,由於機械觸點的彈性作用,在其閉合、斷開瞬間均有抖動過程,抖動時間一般在5一10mS,穩定閉合時間由操作人員的按鍵動作決定,一般爲零點幾秒到幾秒。爲了保證單片機對一次閉合,僅作一次鍵輸入操作,必須在編程時候編寫必要的程序代碼來去除抖動影響,稱鍵盤軟件消抖。
判斷鍵一次按下的具體方法
先判斷鍵是否按下,若按下了延時10 ms,跳過按下抖動期,然後再判斷按鍵是否按下,若是說明按鍵真的按下了,否則說明是干擾信號,如果鍵真的按下了,則等待鍵釋放,如果鍵釋放了,延時10 ms,再判斷鍵是否釋放,若釋放了,說明按鍵真的釋放了,否則說明是干擾信號,如果按鍵真的釋放了,說明一次完整的按鍵過程完成了。在一次完整的按鍵後,可以連接該鍵對應的功能程序段,以實現特定的功能。
硬件消抖
利用電容的放電延時,採用並聯電容法,電路圖如下所示:
除了利用電容進行消抖,也可利用RS觸發器:
四.程序流程圖(程序思路)
五.實現代碼與電路
1.一個按鍵控制兩個LED燈
按鍵按下後,兩個燈亮起,按鍵鬆開,燈滅
代碼
//獨立鍵盤輸入
#include<reg51.h>
sbit led1=P1^0; //red
sbit led2=P1^1; //red
sbit k1=P3^4;
void main()
{
P1=0xff; //熄滅所有LED燈
while(1)
{
if(k1==0)
{
led1=0;
led2=0;
}
else
{
led1=1;
led2=1;
}
}
}
電路原理圖
2.四個按鍵控制八個LED燈
按鍵按下後,兩個燈亮起,按鍵鬆開,燈滅,以此對應4個按鍵
代碼
//獨立鍵盤輸入
#include<reg51.h>
sbit led1=P1^0; //red
sbit led2=P1^1; //red
sbit led3=P1^2; //blue
sbit led4=P1^3; //blue
sbit led5=P1^4; //yellow
sbit led6=P1^5; //yellow
sbit led7=P1^6; //green
sbit led8=P1^7; //green
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
sbit k4=P3^7;
void main()
{
P1=0xff;
while(1)
{
/* if(k1==0)
{
led1=0;
led2=0;
}
else
{
led1=1;
led2=1;
}
if(k2==0)
{
led3=0;
led4=0;
}
else
{
led3=1;
led4=1;
}if(k3==0)
{
led5=0;
led6=0;
}
else
{
led5=1;
led6=1;
}if(k4==0)
{
led7=0;
led8=0;
}
else
{
led7=1;
led8=1;
} */
//優化之後
led1=k1;
led2=k1;
led3=k2;
led4=k2;
led5=k3;
led6=k3;
led7=k4;
led8=k4;
}
}
電路原理圖
3.利用按鍵改變LED燈的狀態
按下第一個按鍵,鬆開按鍵後,第一個LED燈改變狀態
因爲此時要不管檢測是否有按下,因此要加防消抖編程代碼
代碼
#include<reg51.h>
#include"delay.h"
sbit led1=P1^0;
sbit k1=P3^4;
void main()
{
P1=0xff;
while(1)
{
if(k1==0) //判斷是否有按下按鍵的信號
{
delay(10); //延時10ms,消抖
if(k1==0) //再次判斷按鍵是否被按下
{
while(k1==0); //直到按鍵判斷鬆開,此處若k1==0,按鍵一直按下,則在此處程序死循環
led1=~led1; //取反即改變狀態
}
}
}
}
電路原理圖