單片機學習——獨立按鍵基礎(自用)
原理:
輕觸按鍵,相當于一種電子開關,按下使開關接通,松開時開關斷開,K1、K2、K3、K4公共端接GND,另一端分別接單片機I/O口的P3^0到P3^3,因為單片機4組I/O口P0—P3都是高電平有效,當按鍵按下時,將I/O口拉到低電平使按鍵有效。
按鍵抖動:
一個開關在閉合時不會馬上穩(wěn)定地接通,在斷開時也不會一下子斷開,所以在開關閉合及斷開的瞬間會伴隨一連串的抖動,單片機會檢測出來。
按鍵消抖:
(1)硬件消抖: 加一個電路,將總電路經(jīng)過觸發(fā)器之類的操作進行電路過濾。
(2)軟件消抖:?檢測按鍵按下時,延時時間,再繼續(xù)操作,松手也同樣道理。
軟件部分:
#include "reg52.h"
sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3; //定義按鍵IO端口
sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
sbit L4=P0^3;
sbit L5=P0^4;
sbit L6=P0^5; //定義LED燈IO端口
void selectHC573(unsigned char n)
{
switch(n)
?{
?case 4:
?P2=(P2 & 0x1f) | 0x80; ?
?break; ? ? ??
?case 5: ? ? ?
?P2=(P2 & 0x1f) | 0xa0;
?break;
?case 6:
?P2=(P2 & 0x1f) | 0xc0;
?break;
?case 7:
?P2=(P2 & 0x1f) | 0xe0;
?break;
}
}
void delayk(unsigned char t)
{
while(t--);
}
void Scankeys_alone() //掃描獨立按鍵
{
if(S7==0)? //判斷是否按下S7
{
? delayk(100);
? if(S7==0) ? //延時消抖后S7依然處于低電平,則確定按下
? {
? L1=0;
? while(S7==0); //判斷S7是否依然工作(神來之筆?。?/span>
? L1=1; //關燈,完成檢測
? }
}
if(S6==0)
{
? delayk(100);
? if(S6==0)
? {
? L2=0;
? while(S7==0);
? L2=1;
? }
}
if(S5==0)
{
? delayk(100);
? if(S5==0)
? {
? L3=0;
? while(S5==0);
? L3=1;
? }
}
if(S4==0)
{
? delayk(100);
? if(S4==0)
? {
? L4=0;
? while(S4==0);
? L4=1;
? }
}
}
void main()
{
?selectHC573(4);//選擇鎖存器處于打開狀態(tài)
?while(1)
?{
?Scankeys_alone();//不斷掃描是否有按鍵按下
?}
}