我们在上节课的案例中已经学会了如何使用LED灯。当然我们也可以使用按键来控制灯的开与关,就如生活中开关控制台灯、控制卧室灯客厅灯一样。本节课先使用板载的A和B按键分别作为控制LED灯的开与关,然后再尝试外接一个按键模块来控制LED灯的亮灭。
一、学习目标
l了解按键模块
l掌握按键模块按下与弹起两种状态的返回值
l程序编写与调试完成按键控制灯的开与关
二、硬件学习
这个模块可以作为开关使用。按键有“按下”和“弹起”两种状态。默认状态是“弹起”;当用手指按住按键帽往下按、并且保持不动的时候,就处于“按下”状态;松开手指,按键又会重回“弹起”状态。
三、硬件连接
首先将2根3P连接线分别连入1个按键模块和1个LED模块的接口中;然后将按键模块连入P0端口、LED模块插连入P1端口。好搭掌控开机,用Type-C线把主控板和计算机连接起来。
四、指令学习
4.1“读取引脚数字值“指令
这条指令在基础功能类别指令中,指令默认引脚是 “P0”。通过单击下拉列表,可以选择P0、P1、P15、P16;用于读取引脚的数字值,一般返回的数字值为0和1。
4.2“板载按键A被按下“指令
这条指令在板载功能传感器类别指令中,指令默认引脚是“A“,通过单击下拉列表,可以选择B或A+B。
五、程序实现
5.1板载A和B按键控制LED灯亮与灭
当好搭掌控的板载按键A被按下的时候,LED灯点亮;当B被按下时,LED灯熄灭。程序如下图所示。
5.2外接按键模块状态测试
外接按键有2种状态,分别是按下和弹起。通过程序来测试两种状态下的返回值为什么。使用OLED显示屏来显示返回值。程序如下图所示:
注意:OLED屏显示指令中现实的内容是文本,读取引脚数字值返回的是数字,所以需要为文本指令将数字值转为文本的数字。
测试得到如下所示:
5.3外接按键控制LED灯亮灭
通过上面的测试可以得到,当按键按下时,返回值为1,弹起返回值为0。这样我们就可以设置当按下按键的时候LED灯打开,松开也就是按键弹起时LED灯熄灭。程序如下图所示:
5.4结合变量控制LED灯的亮与灭
上面程序实现的效果是按钮一直按着时LED灯点亮,松开后LED灯熄灭,不符合日常生活中的控制灯的效果。接下来实现以下效果,按键按下松开一次,LED亮;再按下松开一次,LED灭;如此往复。需要结合变量来实现这一效果。
5.4.1记录按键按下松开的次数,并显示到OLED屏上
按下按键一次,不论按下多长时间,只要不松开,OLED上的数字只增加1。
设置一个num变量 ,记录按下松开的次数。
这个程序的运行结果是按下一次,OLED屏显示的数字增加的非常快。即使手速再快,每按一次,显示的数值都会至少增加几十。
这是因为:按键被按下的时间里,程序运行了很多次,变量num自增了很多次。
所以,问题的关键在于按键被按下时,如何让计数程序只运行一次。
这需要新建一个变量flag,用于记录按键的松开和按下状态,工程上这样的变量被称为“标志位”。
5.4.2点控LED 亮与灭
按键按下松开一次,LED亮;再按下松开一次,LED灭;如此往复。使用重复程序块和使用延时程序块一样,会阻断程序的运行。接下来介绍的才是真正正确的方法。
使用2个变量,变量flag用于按键状态标志位,变量mode用于控制LED灯的亮与灭。
当按下松开后mode变为1;再按下松开,mode变为0;如此往复,程序如下图所示:
按键按下松开一次,LED亮;再按下松开一次,LED灭;如此往复,修改程序如下图所示:
六、拓展与思考
在灯光打开和关闭时,让你的点阵屏也显示一定的效果,如何创意实现?想一想,编写程序,让你的开关灯更加有趣,试试吧!