|
发表于 2015-3-3 20:12:07
|
显示全部楼层
找了只按键,试了一下。很成功呢。
按键没有接电阻,直接用Uno的内部上拉电阻。
亦没有接LED,就用Uno上D13的LED吧。
LED的闪动,没有用delay()功能做计时。
取而代之,采用了millis()功能做计时,从而避免了漏读按键的问题。
按键的抖动,就简单的用了delay()功能去处理。效果还不错呢。
const int buttonPin = 12; //button pin number
const int ledPin = 13; //LED pin number
int buttonState = 3; //button state 1,2,3
unsigned long currentMillis; //record the current time for blinking
long previousMillis = 0; //store the last time LED was updated
long interval = 1000; //interval at which to blink (milliseconds)
/////////////////////////////////////////////////////////////////////////////////////////
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH); //use internal pull up resistor
}////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
void loop()
{
if (digitalRead(buttonPin) == LOW) //Not pressed - HIGH; Pressed - LOW
{
buttonState++;
if (buttonState > 3) buttonState = 1; //button State from 1 to 3
//
delay(450); /////handle debouncing//////////////
}// end if digitalRead(buttonPin)
///////////////////////////////////
switch (buttonState)
{
case 1:
digitalWrite(ledPin, HIGH);
break;
case 2:
currentMillis = millis(); //start the timer
if (currentMillis - previousMillis > interval) //timer moved forward by the preset interval
{
previousMillis = currentMillis;
digitalWrite( ledPin, digitalRead( ledPin ) ^ 1 ); //read the state of the Led, reverse it and turn it on or off accordingly
}
break;
case 3:
digitalWrite(ledPin, LOW);
break;
}//end switch
}/////end loop
/////////////////////////////////////////////////////////////////////////////
试试看{:soso_e100:}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|