概要
==说明:B1012之后的版本支持按键模式与触摸屏共存,同时最多支持8key;该版本之前只有非触摸屏才支持:==
系统除触摸屏以外,还支持非触摸屏,在非触摸屏的模式下,系统允许将E1~E6这6个扩展IO扩展为按钮,并在底层对按钮做了支持;
对于每个界面来说,按键的定义是可以不一样的,比如对于常规界面,1号按键的功能是“进入设置界面” 而到了设置界面,1号按键的可能可能就是“退出”,因此按键的处理逻辑应该是放在每个页面中,而非控件中,这点请大家预先理解;
其次就是按键有很多事件,常见的有按下和弹起两个事件,为了让按键的声明周期完整,一般我们把功能放在弹起事件中,这样比较稳定可靠;通过多重事件,我们可以实现:
- 单键按下,弹起处理
- 单键长按
- 双键齐按
- A键按下不放,B键再按下
- .....
因此,6个按键可以组合很多功能;
电路接法:
直接按钮接地即可:
可以参考:
- 2.8吋屏幕 接5个按键的图纸,含PCB:
https://lceda.cn/zhqsoft/shmictrl-28-wifi-5key
- 3.5吋屏幕 接5个按键的图纸,含PCB:
https://lceda.cn/zhqsoft/shmictrl-35-wifi-5key
软件使用:
- 第一步,确保page控件升级到最新版本,可用菜单:控件-->与服务器同步控件,确保page控件中有void onkey(int t,int k){} 这一行
- 第二步,在第一页的start()语句前加:gpio_key(1); 这一句,目的是打开键盘模式,系统默认是关闭键盘模式的,这主要考虑一些用户扩展接口可能作为它用;
- 第三步,在需要处理按键反馈的页面,继承page.onkey事件,即在页面代码中增加:
void page.onkey(int t,int k){
str s;
s="k:"+int2hex(k,4)+" t:"+t+"\r\n";
echo(s);
}
- 然后系统会出现以下情况:
- k:3F3D t:0 2号按钮按下
- k:3D3D t:1 2号按钮长按
- k:3D3C t:3 2号按钮未松开,3号按钮又被按下
- k:3C3D t:3 3号按钮松开
- k:3D3F t:2 2号按钮松开
其中,k是按钮状态,是2byte模式,高位是事件前的按钮状态,低位时事件当前的按钮状态;具体见下表:(bit=0 表示按钮被按下,否则上拉为1)
Bit n | 描述 |
---|---|
15 | null =0;8key模式下8号按钮前状态 |
14 | null =0;8key模式下7号按钮前状态 |
13 | 6号按钮的事件前状态 |
12 | 5号按钮的事件前状态 |
11 | 4号按钮的事件前状态 |
10 | 3号按钮的事件前状态 |
9 | 2号按钮的事件前状态 |
8 | 1号按钮的事件前状态 |
7 | null =0;8key模式下8号按钮当前状态 |
6 | null =0;8key模式下7号按钮当前状态 |
5 | 6号按钮的当前状态 |
4 | 5号按钮的当前状态 |
3 | 4号按钮的当前状态 |
2 | 3号按钮的当前状态 |
1 | 2号按钮的当前状态 |
0 | 1号按钮的当前状态 |
t是按键事件标志:
t | 描述 |
---|---|
0 | 按钮被按下 |
1 | 按钮被长按(按钮长按不放,先会出现t=0的按下事件,大约2秒后会出现长按事件) |
2 | 按钮被松开,弹起事件 |
3 | 按钮状态发生变化,常用于检测某个按钮按着不放,组合其他按钮实现特殊功能的场合 |
当然,您可以使用下面代码方便简单的获取某个按键被按下的事件;
void page.onkey(int t,int k)
{
if (t==2){
//按钮弹起事件
k=k>>8; //t=2弹起事件,使用高八位获取哪个按钮被按下
//t=0按下事件,使用低八位获取哪个按钮被按下
if ((k&1)==0){
echo ("1号按钮被按下\r\n");
}
if ((k&2)==0){
echo ("2号按钮被按下\r\n");
}
if ((k&4)==0){
echo ("3号按钮被按下\r\n");
}
if ((k&8)==0){
echo ("4号按钮被按下\r\n");
}
if ((k&16)==0){
echo ("5号按钮被按下\r\n");
}
if ((k&32)==0){
echo ("6号按钮被按下\r\n");
}
}
}