弘毅 发表于 2012-2-10 16:55
这个按键实验中,有按一下开始,按一下停止的代码,你把里面的这个代码和数码管的结合一下,就ok了
http ...
这是后来写的:- int led = 13;
- int Button = 11;
- boolean on = LOW;
- long randNumber;
- int pin[] = {1,2,4,5,6,7,9,10};
- int digit[16][8]={
- {1,1,1,0,1,1,1,0},
- {0,0,1,0,1,0,0,0},
- {1,1,0,0,1,1,0,1},
- {0,1,1,0,1,1,0,1},
- {0,0,1,0,1,0,1,1},
- {0,1,1,0,0,1,1,1},
- {1,1,1,0,0,1,1,1},
- {0,0,1,0,1,1,0,0},
- {1,1,1,0,1,1,1,1},
- {0,1,1,0,1,1,1,1}
- };
- void setup()
- {
- pinMode(Button, INPUT);
- pinMode(led, OUTPUT);
- for(int i = 0; i < 8; i++)
- {
- pinMode(pin[i], OUTPUT);
- }
- }
- void rad() //随机产生0-9
- {
- randNumber = random(0,10);
- for(int j = 0; j < 8; j++)
- {
- if(digit[randNumber][j] == 1)
- digitalWrite(pin[j], HIGH);
- else
- digitalWrite(pin[j], LOW);
- }
- }
- void loop()
- {
- if(digitalRead(Button) == LOW) //第一个if——if_1
- {
- delay(10); //第一个delay——delay_1
- if(digitalRead(Button) == HIGH) //第二个if——if_2
- {
- digitalWrite(led, on);
- on = !on;
- delay(10); //第二个delay——delay_2
- while(digitalRead(Button) == HIGH)
- {
- delay(1);
- }
- }
- if(on == HIGH) //if_3
- {
- rad();
- delay(10); //第三个delay——delay_3。当delay_3取0或者很小的值时,反应正常,但取50及更大时则按键没效果即无论怎么按,数字都不会停止跳动,而且led13也不会亮。
- }
- }
- }
复制代码 我的分析是这样的:
当delay_3=0时,数码管急速地变化,即整个loop执行地很快,由delay_1知道每隔10ms就检查一次有没有上升沿;而当delay_3取50或者更大的值时,delay_3这段时间的比重就占得很大,倘若在这段时间按下开关,就不能检查到有上升沿事件,进而跳过if_2继续执行if_3。
我在做实验时发现,当delay_3越小,按键灵敏度越高。当delay_3取50时,偶尔还能改变一下on的值,即使数字停止跳动,当取500时,按键就完全没反应了,数字始终按照510ms的频率跳动,led始终灭(led亮时说明数字停止跳动)。
所以想问问lz和各位高手,有没有办法使delay_3想设多大就设多大。 |