如果LED是典型的IOout,那么按键就是IN的入门了。这次的实验首先熟悉mbed的两种按键控制例程,然后和上次的呼吸灯结合,利用按键来控制LED的亮度变化。
在mbed的例程中提供了两种按键检测方式,一个是IO口扫描,由于整个while里面就是按键扫描,所以用wait(0.2)就是大大足够的消抖了,如果自己用,恐怕还是要消抖的。这个例子长按,LED就会闪烁,因为不断检测到按键。
除了扫描,自然就是中断了,stm32应该是每个IO都能响应外中断的吧。mbed中,首先用InterruptIn mybutton(USER_BUTTON);注册了一个外中断,然后定义了中断函数 pressed(),而中断和中断函数的联系用mybutton.fall(&pressed);实现。小白猜测这个应该是个回调函数?因为刚刚再看这个概念,请高手指点。pressed里面主要就是更改LED闪烁快慢的。这个整体看下来,思路很清晰。效果是,按下(不管是否抬起),闪烁频率就改变,但是不抬起,是不会连续改变的。如果需要的只是单击,应该用中断比较好。
试着把又写了一个released(),然后注册到按键抬起,mybutton.rise(&released);效果不错
然后就是今天的主角出场,按键一次,duty增加10%,到100%后,又变成0。代码继续很短,直接贴上来吧。继续赞一下mbed。不过矩阵键盘咋办呢?
#include "mbed.h"
InterruptIn mybutton(USER_BUTTON);
PwmOut myled(LED1);
unsigned char i=0;
void pressed()
{ i++;
if (i>10) i=0;
}
int main()
{
mybutton.fall(&pressed);
myled.period_ms(10);
myled.pulsewidth_ms(i);
while (1) {
myled.pulsewidth_ms(i);
}
}