1、按鍵的使用
<1>獨立按鍵的原理圖
按鍵所對應的引腳為P3的0、1、2、3引腳口,并且這里總共有四個獨立按鍵,它們公共的一段都接到了GND電源的負極。這樣我們就知道按鍵上電的默認電平為高電平。所以我們只需要控制按鍵按下時給一個低電平0,不按下時默認高電平1就行。
?<2>按鍵控制LED燈的亮滅
按鍵消抖:抖動是機械按鍵存在的現(xiàn)象,是必須要進行處理的。一般處理有兩種方式:一種是硬件消抖,另一種是軟件消抖。硬件消抖不僅會增加開發(fā)成本,而且有時不穩(wěn)定。一般都會選擇軟件消抖。
#include "reg51.h"
sbit LED = P2^0;//LED燈引腳定義
sbit KEY = P3^1;//按鍵引腳定義
void delay(int x)//延時函數(shù)(ms)
{
int i,j;
for(i=0;i<x;i++)
for(j=0;j<100;j++);
}
void main()
{
while(1)
{
if(!KEY)//當按鍵按下時
{
delay(15);//按鍵消抖
if(!KEY)//確定按鍵按下
{
LED = !LED;//LED燈的狀態(tài)取反
}
}
}
}
if(!KEY)的含義:因為按鍵默認高電平,所以!KEY的值為0,當按下按鍵電平變?yōu)榈碗娖剑?KEY的值也就變?yōu)?非0";這樣就可以做出判斷了。
注意:獨立按鍵K1按鍵與K2按鍵按鍵網(wǎng)絡編號是相反的,K1=P3^1、K2=P3^0。
2、獨立按鍵控制LED燈
根據(jù)上一章流水燈、走馬燈代碼結(jié)合:文章來源:http://www.zghlxwxcb.cn/news/detail-511043.html
?LED流動正反方向中的type()函數(shù)與LED燈狀態(tài)切換文章來源地址http://www.zghlxwxcb.cn/news/detail-511043.html
#include "reg51.h"
#define LED P2
sbit KEY = P3^1;
bit direction;
char i;
void delay(int x)//延時函數(shù)(ms)
{
int i,j;
for(i=0;i<x;i++)
for(j=0;j<100;j++);
}
void type() //流水燈的翻轉(zhuǎn)
{
if(!direction)
{
if(++i>8) //正向移動
i=0;
}
else
{
if(--i<0) //反向移動
i=8;
}
}
void main()
{
LED = buf[i];//LED燈的默認流向
while(1)
{
if(!KEY)
{
delay(15);
if(!KEY)
direction = !direction;
}
}
}
#include "reg52.h"
#define LED P2 //宏定義LED引腳
sbit K0=P3^1; //定義按鍵引腳口
sbit K1=P3^0;
sbit K2=P3^2;
sbit K3=P3^3;
bit key_mark,direction; //兩個標志位,key_mark用于結(jié)束循環(huán);direction用于LED燈亮滅的翻轉(zhuǎn)
char Buf[] = {0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; //第一種流水燈方式,燈亮個數(shù)依次增加
char Puf[] = {0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //第二種流水燈方式,燈依次位移一位
char i; //全局標量i,用于各個循環(huán)的使用
int n = 100; //全局變量n用于延時的使用
void delay(int x)//延時函數(shù)(ms)
{
int i,j;
for(i=0;i<x;i++)
for(j=0;j<100;j++);
}
void speed() //延時的加減
{
if(!K1)
{
delay(15);
if(!K1)
{
n += 100; //加100ms
if(n>1000)
n=1000;
}
}
if(!K2)
{
delay(15);
if(!K2)
{
n -= 100; //減100ms
if(n<300)
n=300;
}
}
}
void type() //流水燈的翻轉(zhuǎn)
{
if(!direction)
{
if(++i>8) //正向移動
i=0;
}
else
{
if(--i<0) //反向移動
i=8;
}
}
void mode1() //模式1,當按下K0時,流水燈進行翻轉(zhuǎn)
{
if(!K0)
{
delay(15);
if(!K0)
{
direction = !direction;//標志位direction狀態(tài)取反
}
}
}
void mode2() //模式2,當按下K1時流水燈使用第一種流水燈方式
{
type();
LED = Buf[i];
delay(n); //延時n ms
}
void mode3() //模式3,當按下K2時流水燈使用第二種流水燈方式
{
type();
LED = Puf[i];
delay(n);
}
void mode4() //模式4,當按下K3時,key_mark置為1,退出循環(huán)(在程序中起到一個暫停作用,用于流水燈狀態(tài)切換的使用)
{
if(!K3)
{
delay(15);
if(!K3)
key_mark = 1;
}
}
void main()
{
while(1)
{
if(!K1 && !key_mark)//判斷按鍵是否按下K1,以及標志位key_mark是否為0(當key_mark不為0時說明此函數(shù)在其他循環(huán)中,則無法進入新循環(huán))
{
delay(15);
if(!K1)
{
while(!key_mark)
{
speed(); //引用函數(shù),節(jié)省代碼量以及書寫的規(guī)范
mode1();
mode2();
mode4();
}
}
}
if(!K2 && !key_mark)//判斷按鍵是否按下K2,以及標志位key_mark是否為0(當key_mark不為0時說明此函數(shù)在其他循環(huán)中,則無法進入新循環(huán))
{
delay(15);
if(!K2)
{
while(!key_mark)
{
speed();
mode1();
mode3();
mode4();
}
}
}
if(K0 || K1 || K2 ||K3)//沒有按鍵按下時,標志位key_mark自動置0
key_mark=0;
}
}
到了這里,關(guān)于51單片機按鍵控制流水燈的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!