本帖最后由 jxwns 于 2015-2-10 18:40 编辑
Pyrrhus 发表于 2015-2-10 14:13 
只要一个中断就可以了,
设一个全局变量,在外面控制是关还是开就行了。
感谢,这一点我已经明白了,我是在中断函数里设置一个逻辑变量,用if语句选择是开还是关,在中断函数末尾使逻辑变量状态取反,实现了一个中端函数完成开关的交替。
现在的问题是不论是FlexiTimer2库(Ms timer2)还是timer库(http://wiki.geek-workshop.com/doku.php?id=arduino:libraries:timer)他们在设置中断时间是总是放在set()函数里,但是我想要根据超声传感器的数值相应的改变定时时间,这就要将设定中断事件的语句放在loop()函数里。可是当我这么做的时候,定时器并没有正常工作。
- /*我上传的代码是整个代码的一部分,但是对于LED点阵来说他是完整的。运行的结果是闪烁的频率并没有根据超声传感器得到的结果作出改变。*/
- int delaytime = 2000;
- //定义超声波引脚
- #define TRIG_PIN 40
- #define ECHO_PIN 42
- //超声库库及定义超声类型
- #include "SR04.h"
- SR04 sr04 = SR04(ECHO_PIN, TRIG_PIN);
- long distance;
- //定义LED点阵类型
- #include "LedControl.h"
- //DIN(MOSI)/ CLK(SCK)/ CS(SS)/ 数量
- LedControl lc = LedControl(51, 52, 53, 1);
- //定时器库
- #include <Event.h>
- #include <Timer.h>
- Timer t;
- //❤形图案
- byte xin[] =
- {
- B00000000,
- B01100110,
- B11111111,
- B11111111,
- B01111110,
- B00111100,
- B00011000,
- B00000000
- };
- void setup() {
- //初始化LED点阵
- // do a wakeup call
- lc.shutdown(0, false);
- /* Set the brightness to a medium values */
- lc.setIntensity(0, 1);
- /* and clear the display */
- lc.clearDisplay(0);
- }
- void loop() {
- distance = sr04.Distance();
- delaytime = map(distance, 10, 200, 180, 2500);
- t.every(delaytime, heart);
- t.update();
- }
- //LED点阵显示函数
- void heart()
- {
- static boolean state = true;
- if (state == true)
- {
- lc.setRow(0, 0, xin[0]);
- lc.setRow(0, 1, xin[1]);
- lc.setRow(0, 2, xin[2]);
- lc.setRow(0, 3, xin[3]);
- lc.setRow(0, 4, xin[4]);
- lc.setRow(0, 5, xin[5]);
- lc.setRow(0, 6, xin[6]);
- lc.setRow(0, 7, xin[7]);
- }
- else
- lc.clearDisplay(0);
- state = !state;
- }
复制代码 |