1.3. 用按钮给计算机发指令

按钮(Button)是计算机系统最简单的一种输入设备,计算机键盘上有100个左右的按键(不同键盘的按键个数不同),每一个按键就是一个按钮, 每一个按钮赋予惟一的编号,如A按键的编号为0x41,B按键的编号为0x42,当我们按下按键的按钮时,键盘将对应按键的惟一编号发送给电脑 主机,实现人-机交互的输入。

绝大多数嵌入式系统的按键输入比较少,如电梯召唤按钮、轿箱内楼层按钮等都仅有几个或几十个按钮,这些按钮用于人向计算机系统发出指令, 按下电梯某楼层的召唤按钮告知电梯控制的计算机系统我需要乘坐电梯,电梯系统收到召唤后即让召唤按钮背后指示灯亮起,表示收到召唤,启动 响应。

BlueFi具有两个按钮,分别称作A按钮和B按钮,分别位于LCD显示屏的左右两侧,我们可以使用这两个按钮向BlueFi发指令,譬如开启白光灯、 关闭白光灯等。


1.3.1. 按钮代码积木块

按钮仅有两个状态:被按下和未被按下。也可以使用逻辑变量值来表示,按下时的状态记为“True”,未被按下时的状态记为“False”。

打开输入类代码块抽屉,找到按钮输入类代码块,可以看到四种不同的代码积木块:

../../_static/images/basics/button.png

这是最常用的按钮代码块,判断按钮是否被按下,下拉框中可以选择按钮A/B。此代码块需要和判断语句代码块一起使用,来判断按钮是否被按下。

../../_static/images/basics/button0.png

此积木块是判断按钮是否被长按,下拉框中可以选择按钮A/B,后面的输入框可以输入长按的时间长度数值。同样,此代码块需要和判断语句代码 块一起使用,来判断按钮是否被长按。

1.3.2. 用按钮开关白色LED

下面这个示例,我们使用按钮B被按下时切换白色LED的亮和灭:

../../_static/images/basics/button1.png

运行本示例程序时,你会发现程序的效果:每按下B按钮一次,白色LED状态就被切换一次。这个效果像是一个被轻触开关控制的照明灯。

示例代码分析:

  • 第1行,初始化程序,相当与程序下载进Bluefi之后告知Bluefi从此开始执行程序
  • 第2行,一个无穷循环的程序块
  • 第3行,(无穷循环程序块的第1行),更新A和B按钮的状态
  • 第4行,(无穷循环程序块的第2行),判断B按钮是否已被按下
  • 第5行,(无穷循环程序块的第3行),如果B按钮已被按下,切换白色LED的状态

第4行和第5行是一个简单的逻辑判断和逻辑程序块,当按钮B被按下时,执行切换白色led状态的程序。

1.3.3. 用按钮调节白色LED的亮度

我们将上面的程序稍作修改,即可实现“使用B按钮增加白色LED的亮度,使用A按钮减小白色LED的亮度”:

../../_static/images/basics/button2.png

在BlueFi上运行本示例程序,试一试按下按钮A或B,你将观察到白色LED的亮度变化。

示例代码分析:

  • 第1行,初始化程序,相当与程序下载进Bluefi之后告知Bluefi从此开始执行程序
  • 第2行,声明一个变量b,并赋初始值为32700
  • 第3行,一个无穷循环的程序块
  • 第4行(无穷循环程序块的第1行),用变量b的值更新白色LED的亮度
  • 第5行(无穷循环程序块的第2行),更新A和B按钮的状态
  • 第6行(无穷循环程序块的第3行),判断B按钮是否已被按下
  • 第7行(无穷循环程序块的第4行),如果B按钮已被按下,变量b的值增加10000
  • 第8行(无穷循环程序块的第5行),判断A按钮是否已被按下
  • 第9行(无穷循环程序块的第6行),如果A按钮已被按下,变量b的值减少10000
  • 第10行(无穷循环程序块的第7行),判断变量b的值是否小于0
  • 第11行(无穷循环程序块的第8行),如果变量b的值小于0,让变量b的值等于0
  • 第12行(无穷循环程序块的第9行),判断变量b的值是否大于65535
  • 第13行(无穷循环程序块的第10行),如果变量b的值大于65535,让变量b的值等于65535

本示例程序的最后4行非常重要,目的是确保变量b的值必须是在0~65535之间,如果小于0则等于0(亮度不能再小啦),如果 大于65535则等于65535(亮度不能更大啦)。这是因为,变量b的实际意义是白色LED的亮度,取值范围只能是0~65535。

你可以删除最后的4行程序,试一试效果,如果出现错误而终止程序运行时,你将看到错误提示,根据错误信息推断问题的原因。

1.3.4. 按钮的短按和长按

当你一直按着桌面计算机的某个按键时,相当于快速输入很多个相同的字母或数字,BlueFi的按钮也有相同的效果吗?

为了验证这一设想,我们可以修改前一个示例程序,如果发现长按A按钮时则直接让变量b的值变为0(最小亮度),如果长按A按钮时则直接 让变量b的值变为65535(最大亮度)。修改后的程序如下:

../../_static/images/basics/button3.png

修改后的程序仅仅增加最后的4行,即第14~17行。第14行是条件判断,条件是按钮A是否已按下超过2s?如果条件成立则执行第15行,让变量b等于0。 第16行仍是条件判断,条件是按钮B是否已按下超过2s?如果条件成立则执行第17行,让变量b等于65535。其他程序语句与前一示例程序完全相同, 此处不再赘述。

请在BlueFi上测试本示例,检验程序的执行效果是否达到设想:短按A和B按钮时白色LED的亮度将分别减小或增加,长按A按钮,白色LED亮度变为0; 长按B按钮,白色LED亮度变为最大(即65535)。然后试一试修改第14和第16行的长按时间参数,观察执行效果,并思考为什么是这样的效果。

总结:

  • 判断按钮A/B是否被按下的代码块
  • 判断按钮A/B是否被长按的代码块
  • 变量
  • 变量赋值
  • 变量自增/自减
  • 逻辑判断和逻辑程序块
  • 本节中,你总计完成了22行代码的编写工作

重要

出现的代码块

  • 判断按钮A/B是否被按下的代码块,与判断语句组合使用,判断按钮是否被按下的状态
  • 判断按钮A/B是否被长按的代码块,可以修改积木块中判断长按的时间数值来修改判断长按的时间
  • 更新BlueFi的两个按钮的状态, 必须放在循环体内调用