实验10 物理按键实验

1. 实验目的

本实验演示了,不用屏幕自带的触摸板时,使用外接的串口按键板来控制串口屏的显示。如使用按键板的上、下、左、右,确认键实现切页、参数配置、参数输入等功能。

本实验配套的例程有两个工程,【物理按键_三个键值.pix】演示了按键板使用左、右和确认三个按键的实现方式;【物理按键_五个键值.pix】演示了按键板使用左、右、确认、上、下五个按键的实现方式,本实验以【物理按键_三个键值.pix】详细说明。本实验的这种物理按键实现方式比较灵活,弄清楚本实验的实现方式后,用户可根据这种方式自行调整以达到实现用户自己项目的预期效果。

本实验基于2.4寸串口屏,若要验证其他尺寸的串口屏,可在VP软件里修改项目型号(文件->编辑项目)。

2. 页面设计

本实验为演示物理按键的控制功能,一共有8个页面可供切换,如下:

(1) home:主页面。一共6个按钮,点击每个按钮可切换到相应的页面。

(2) light:亮度控制页面。

3个按钮,”-”按钮(控制系统亮度-10) ,”+”按钮(控制系统亮度+10),“回到主页面”按钮(点击时返回主界面)。

1个整数控件(显示具体的亮度值)。

1个滑块控件(用滑块的位置来指示亮度值)。

(3) hand:汽车速度指针页面。

3个按钮,”打开”按钮(启动定时器2,指针开始顺时针转动),”关闭”按钮(指针指向零刻度),“回到主页面”按钮(点击时返回主界面)。

3个指针控件,分别用于指示转速、速度、油表。

(4) battery:电池充放电模拟页面。

3个按钮,”充电”按钮(启动定时器,电池和环形充电池的电量值增长),”放电”按钮(启动定时器,电池和环形充电池的电量值减少),“回到主页面”按钮(点击时返回主界面)。

1个进度条控件,指示电池电量。

1个环形进度条控件,指示环形充电池电量。

(5) uart:串口发送页面。

3个按钮,”上发送”按钮(发送整数),”下发送”按钮(发送浮点数),“回到主页面”按钮(点击时返回主界面)。

1个整数控件。

1个浮点数控件。

(6) gif:动图显示页面。

3个按钮,”播放”按钮(播放动图),”暂停”按钮(暂停动图),“回到主页面”按钮(点击时返回主界面)。

1个GIF控件,显示动图。

(7) qrcode:二维码显示页面。

3个按钮,”支付宝”按钮(设置二维码为zhifubao),”微信”按钮(设置二维码为weixin),“回到主页面”按钮(点击时返回主界面)。

1个二维码控件。

(8) keyboard:键盘页面。

15个按钮,0~9和小数点为普通功能按钮,”←”为退格功能,”清除”为清空输入框,”退出”为退出键盘,”确认”按键将输入框的内容赋值到指定控件。

1个文本控件,表现为输入框。

3. 串口屏脚本处理

工程【物理按键_三个键值.pix】一共需要处理三个键值 右(AA 01 BB),左(AA 02 BB),确认(AA 03 BB)。

工程【物理按键_五个键值.pix】一共需要处理五个键值 右(AA 01 BB),左(AA 02 BB),确认(AA 03 BB),下(AA 04 BB),上(AA 05 BB)。

脚本代码主要在协议解析器控件的数据接收事件里,选中home页面的协议解析器控件proc,可以看到处理的脚本。

【物理按键_三个键值.pix】如下:

/*
接收处理按键板发过来的键值,一共三个键值 右(AA 01 BB),左(AA 02 BB),确认(AA 03 BB)
cursor变量表示当前光标的位置,通过判断光标的位置,来设置按钮的背景图片,实现左右选中的效果。
注意:跨页访问控件属性时,需要指明页名称,并将要访问的控件设置成全局。
*/

if((proc.rxBuf[0] == 0xAA)&&(proc.rxBuf[2] == 0xBB))  //检测键值 帧头 帧尾
{
    if(sys_pid == home.id) //当前处于home页面
    {
    
        if((proc.rxBuf[1] == 1)||(proc.rxBuf[1] == 2))
        {
                //根据旧光标位置,设置按钮的背景图片 为 常态背景图片
                if(cursor.val == 1)     button1.bgImg = user.image.Main;    
                else if(cursor.val == 2)button2.bgImg = user.image.Main;
                else if(cursor.val == 3)button3.bgImg = user.image.Main;
                else if(cursor.val == 4)button4.bgImg = user.image.Main;
                else if(cursor.val == 5)button5.bgImg = user.image.Main;
                else if(cursor.val == 6)button6.bgImg = user.image.Main;
            
                //根据键值改变光标的位置
                if(proc.rxBuf[1]== 1)  //右
                {
                    if((++cursor.val) > 6)cursor.val = 1;
                }
                else if(proc.rxBuf[1]== 2)  //左
                {
                    if((--cursor.val) < 1)cursor.val = 6;
                }
            
                //根据新光标的位置,设置按钮的背景图片为深色类型,实现选中的效果
                if(cursor.val == 1)button1.bgImg = user.image.Main2;    
                else if(cursor.val == 2)button2.bgImg = user.image.Main2;    
                else if(cursor.val == 3)button3.bgImg = user.image.Main2;    
                else if(cursor.val == 4)button4.bgImg = user.image.Main2;    
                else if(cursor.val == 5)button5.bgImg = user.image.Main2;    
                else if(cursor.val == 6)button6.bgImg = user.image.Main2;                
        }
        else if(proc.rxBuf[1] == 3)
        {
                //确认键 执行按钮的点击事件
                if(cursor.val == 1)click(button1.x,button1.y);
                else if(cursor.val == 2)click(button2.x,button2.y);
                else if(cursor.val == 3)click(button3.x,button3.y);
                else if(cursor.val == 4)click(button4.x,button4.y);
                else if(cursor.val == 5)click(button5.x,button5.y);
                else if(cursor.val == 6)click(button6.x,button6.y);
        }
    }
    else if(sys_pid == light.id)
    {
        if((proc.rxBuf[1] == 1)||(proc.rxBuf[1] == 2))
        {
                //根据旧光标位置,设置按钮的背景图片 为 常态背景图片
                if(cursor.val == 1)     light.button1.bgImg = user.image.light;    
                else if(cursor.val == 2)light.button2.bgImg = user.image.light;    
                else if(cursor.val == 3)light.button3.bgImg = user.image.light;    
                
                //根据键值改变光标的位置
                if(proc.rxBuf[1]== 1)  //右
                {
                    if((++cursor.val) > 3)cursor.val = 1;
                }
                else if(proc.rxBuf[1]== 2)  //左
                {
                    if((--cursor.val) < 1)cursor.val = 3;
                }                
                
                //根据新光标的位置,设置按钮的背景图片为深色类型,实现选中的效果
                if(cursor.val == 1)light.button1.bgImg = user.image.light2;    
                else if(cursor.val == 2)light.button2.bgImg = user.image.light2;    
                else if(cursor.val == 3)light.button3.bgImg = user.image.light2;                                    
        }
        else if(proc.rxBuf[1] == 3)
        {
                //确认键 执行按钮的点击事件
                if(cursor.val == 1)click(light.button1.x,light.button1.y);
                else if(cursor.val == 2)click(light.button2.x,light.button2.y);
                else if(cursor.val == 3)click(light.button3.x,light.button3.y);
        }
        
        
    }
    
    
    else if(sys_pid == hand.id)
    {
        if((proc.rxBuf[1] == 1)||(proc.rxBuf[1] == 2))
        {
                //根据旧光标位置,设置按钮的背景图片 为 常态背景图片
                if(cursor.val == 1)     hand.button1.bgImg = user.image.hand;    
                else if(cursor.val == 2)hand.button2.bgImg = user.image.hand;    
                else if(cursor.val == 3)hand.button3.bgImg = user.image.hand;    
                
                //根据键值改变光标的位置
                if(proc.rxBuf[1]== 1)  //右
                {
                    if((++cursor.val) > 3)cursor.val = 1;
                }
                else if(proc.rxBuf[1]== 2)  //左
                {
                    if((--cursor.val) < 1)cursor.val = 3;
                }                
                
                //根据新光标的位置,设置按钮的背景图片为深色类型,实现选中的效果
                if(cursor.val == 1)hand.button1.bgImg = user.image.hand2;    
                else if(cursor.val == 2)hand.button2.bgImg = user.image.hand2;    
                else if(cursor.val == 3)hand.button3.bgImg = user.image.hand2;                                    
        }
        else if(proc.rxBuf[1] == 3)
        {
                //确认键 执行按钮的点击事件
                if(cursor.val == 1)click(hand.button1.x,hand.button1.y);
                else if(cursor.val == 2)click(hand.button2.x,hand.button2.y);
                else if(cursor.val == 3)click(hand.button3.x,hand.button3.y);
        }        
    }
    
    
    else if(sys_pid == battery.id)
    {
        if((proc.rxBuf[1] == 1)||(proc.rxBuf[1] == 2))
        {
                //根据旧光标位置,设置按钮的背景图片 为 常态背景图片
                if(cursor.val == 1)     battery.button1.bgImg = user.image.cell;    
                else if(cursor.val == 2)battery.button2.bgImg = user.image.cell;    
                else if(cursor.val == 3)battery.button3.bgImg = user.image.cell;    
                
                //根据键值改变光标的位置
                if(proc.rxBuf[1]== 1)  //右
                {
                    if((++cursor.val) > 3)cursor.val = 1;
                }
                else if(proc.rxBuf[1]== 2)  //左
                {
                    if((--cursor.val) < 1)cursor.val = 3;
                }                
                
                //根据新光标的位置,设置按钮的背景图片为深色类型,实现选中的效果
                if(cursor.val == 1)battery.button1.bgImg = user.image.cell2;    
                else if(cursor.val == 2)battery.button2.bgImg = user.image.cell2;    
                else if(cursor.val == 3)battery.button3.bgImg = user.image.cell2;                                    
        }
        else if(proc.rxBuf[1] == 3)
        {
                //确认键 执行按钮的点击事件
                if(cursor.val == 1)click(battery.button1.x,battery.button1.y);
                else if(cursor.val == 2)click(battery.button2.x,battery.button2.y);
                else if(cursor.val == 3)click(battery.button3.x,battery.button3.y);
        }        
    }    
    
    
    
    else if(sys_pid == uart.id)
    {
        if((proc.rxBuf[1] == 1)||(proc.rxBuf[1] == 2))
        {
                //根据旧光标位置,设置按钮的背景图片 为 常态背景图片
                if(cursor.val == 1)     uart.num1.bgImg = user.image.uart;    
                else if(cursor.val == 2)uart.button2.bgImg = user.image.uart;    
                else if(cursor.val == 3)uart.numf3.bgImg = user.image.uart;    
                else if(cursor.val == 4)uart.button4.bgImg = user.image.uart;    
                else if(cursor.val == 5)uart.button5.bgImg = user.image.uart;    

                //根据键值改变光标的位置
                if(proc.rxBuf[1]== 1)  //右
                {
                    if((++cursor.val) > 5)cursor.val = 1;
                }
                else if(proc.rxBuf[1]== 2)  //左
                {
                    if((--cursor.val) < 1)cursor.val = 5;
                }                
                
                //根据新光标的位置,设置按钮的背景图片为深色类型,实现选中的效果
                if(cursor.val == 1)uart.num1.bgImg = user.image.uart2;    
                else if(cursor.val == 2)uart.button2.bgImg = user.image.uart2;    
                else if(cursor.val == 3)uart.numf3.bgImg = user.image.uart2;    
                else if(cursor.val == 4)uart.button4.bgImg = user.image.uart2;    
                else if(cursor.val == 5)uart.button5.bgImg = user.image.uart2;                                        
        }
        else if(proc.rxBuf[1] == 3)
        {
                //确认键 执行按钮的点击事件
                if(cursor.val == 1)click(uart.num1.x,uart.num1.y);
                else if(cursor.val == 2)click(uart.button2.x,uart.button2.y);
                else if(cursor.val == 3)click(uart.numf3.x,uart.numf3.y);
                else if(cursor.val == 4)click(uart.button4.x,uart.button4.y);
                else if(cursor.val == 5)click(uart.button5.x,uart.button5.y);                
        }        
    }    
    
    
    
    else if(sys_pid == gif.id)
    {
        if((proc.rxBuf[1] == 1)||(proc.rxBuf[1] == 2))
        {
                //根据旧光标位置,设置按钮的背景图片 为 常态背景图片
                if(cursor.val == 1)     gif.button1.bgImg = user.image.GIF;    
                else if(cursor.val == 2)gif.button2.bgImg = user.image.GIF;    
                else if(cursor.val == 3)gif.button3.bgImg = user.image.GIF;    
                
                //根据键值改变光标的位置
                if(proc.rxBuf[1]== 1)  //右
                {
                    if((++cursor.val) > 3)cursor.val = 1;
                }
                else if(proc.rxBuf[1]== 2)  //左
                {
                    if((--cursor.val) < 1)cursor.val = 3;
                }                
                
                //根据新光标的位置,设置按钮的背景图片为深色类型,实现选中的效果
                if(cursor.val == 1)gif.button1.bgImg = user.image.GIF2;    
                else if(cursor.val == 2)gif.button2.bgImg = user.image.GIF2;    
                else if(cursor.val == 3)gif.button3.bgImg = user.image.GIF2;                                    
        }
        else if(proc.rxBuf[1] == 3)
        {
                //确认键 执行按钮的点击事件
                if(cursor.val == 1)click(gif.button1.x,gif.button1.y);
                else if(cursor.val == 2)click(gif.button2.x,gif.button2.y);
                else if(cursor.val == 3)click(gif.button3.x,gif.button3.y);
        }        
    }    
    
    
    
    else if(sys_pid == qrcode.id)
    {
        if((proc.rxBuf[1] == 1)||(proc.rxBuf[1] == 2))
        {
                //根据旧光标位置,设置按钮的背景图片 为 常态背景图片
                if(cursor.val == 1)qrcode.button1.bgImg = user.image.qrcode;    
                else if(cursor.val == 2)qrcode.button2.bgImg = user.image.qrcode;    
                else if(cursor.val == 3)qrcode.button3.bgImg = user.image.qrcode;    
                
                //根据键值改变光标的位置
                if(proc.rxBuf[1]== 1)  //右
                {
                    if((++cursor.val) > 3)cursor.val = 1;
                }
                else if(proc.rxBuf[1]== 2)  //左
                {
                    if((--cursor.val) < 1)cursor.val = 3;
                }                
                
                //根据新光标的位置,设置按钮的背景图片为深色类型,实现选中的效果
                if(cursor.val == 1)     qrcode.button1.bgImg = user.image.qrcode2;    
                else if(cursor.val == 2)qrcode.button2.bgImg = user.image.qrcode2;    
                else if(cursor.val == 3)qrcode.button3.bgImg = user.image.qrcode2;                                    
        }
        else if(proc.rxBuf[1] == 3)
        {
                //确认键 执行按钮的点击事件
                if(cursor.val == 1)click(qrcode.button1.x,qrcode.button1.y);
                else if(cursor.val == 2)click(qrcode.button2.x,qrcode.button2.y);
                else if(cursor.val == 3)click(qrcode.button3.x,qrcode.button3.y);
        }        
    }    
    
    
    
    else if(sys_pid == keyboard.id)
    {
        if((proc.rxBuf[1] == 1)||(proc.rxBuf[1] == 2))
        {
                //根据旧光标位置,设置按钮的背景图片 为 常态背景图片
                if(cursor.val == 1)     keyboard.button1.bgImg = user.image.key;    
                else if(cursor.val == 2)keyboard.button2.bgImg = user.image.key;    
                else if(cursor.val == 3)keyboard.button3.bgImg = user.image.key;
                else if(cursor.val == 4)keyboard.button4.bgImg = user.image.key;    
                else if(cursor.val == 5)keyboard.button5.bgImg = user.image.key;
                else if(cursor.val == 6)keyboard.button6.bgImg = user.image.key;    
                else if(cursor.val == 7)keyboard.button7.bgImg = user.image.key;
                else if(cursor.val == 8)keyboard.button8.bgImg = user.image.key;    
                else if(cursor.val == 9)keyboard.button9.bgImg = user.image.key;    
                else if(cursor.val == 10)keyboard.button10.bgImg = user.image.key;
                else if(cursor.val == 11)keyboard.button11.bgImg = user.image.key;    
                else if(cursor.val == 12)keyboard.button12.bgImg = user.image.key;                        
                else if(cursor.val == 13)keyboard.button13.bgImg = user.image.key;
                else if(cursor.val == 14)keyboard.button14.bgImg = user.image.key;    
                else if(cursor.val == 15)keyboard.button15.bgImg = user.image.key;                    
                
                //根据键值改变光标的位置
                if(proc.rxBuf[1]== 1)  //右
                {
                    if((++cursor.val) > 15)cursor.val = 1;
                }
                else if(proc.rxBuf[1]== 2)  //左
                {
                    if((--cursor.val) < 1)cursor.val = 15;
                }                
                
                //根据新光标的位置,设置按钮的背景图片为深色类型,实现选中的效果
                if(cursor.val == 1)keyboard.button1.bgImg = user.image.key2;    
                else if(cursor.val == 2)keyboard.button2.bgImg = user.image.key2;    
                else if(cursor.val == 3)keyboard.button3.bgImg = user.image.key2;
                else if(cursor.val == 4)keyboard.button4.bgImg = user.image.key2;    
                else if(cursor.val == 5)keyboard.button5.bgImg = user.image.key2;
                else if(cursor.val == 6)keyboard.button6.bgImg = user.image.key2;    
                else if(cursor.val == 7)keyboard.button7.bgImg = user.image.key2;
                else if(cursor.val == 8)keyboard.button8.bgImg = user.image.key2;    
                else if(cursor.val == 9)keyboard.button9.bgImg = user.image.key2;    
                else if(cursor.val == 10)keyboard.button10.bgImg = user.image.key2;
                else if(cursor.val == 11)keyboard.button11.bgImg = user.image.key2;    
                else if(cursor.val == 12)keyboard.button12.bgImg = user.image.key2;        
                else if(cursor.val == 13)keyboard.button13.bgImg = user.image.key2;
                else if(cursor.val == 14)keyboard.button14.bgImg = user.image.key2;    
                else if(cursor.val == 15)keyboard.button15.bgImg = user.image.key2;                
        }
        else if(proc.rxBuf[1] == 3)
        {
                //确认键 执行按钮的点击事件
                if(cursor.val == 1)click(keyboard.button1.x,keyboard.button1.y);
                else if(cursor.val == 2)click(keyboard.button2.x,keyboard.button2.y);
                else if(cursor.val == 3)click(keyboard.button3.x,keyboard.button3.y);
                else if(cursor.val == 4)click(keyboard.button4.x,keyboard.button4.y);
                else if(cursor.val == 5)click(keyboard.button5.x,keyboard.button5.y);    
                else if(cursor.val == 6)click(keyboard.button6.x,keyboard.button6.y);
                else if(cursor.val == 7)click(keyboard.button7.x,keyboard.button7.y);
                else if(cursor.val == 8)click(keyboard.button8.x,keyboard.button8.y);
                else if(cursor.val == 9)click(keyboard.button9.x,keyboard.button9.y);    
                else if(cursor.val == 10)click(keyboard.button10.x,keyboard.button10.y);
                else if(cursor.val == 11)click(keyboard.button11.x,keyboard.button11.y);
                else if(cursor.val == 12)click(keyboard.button12.x,keyboard.button12.y);                
        }        
    }    

【物理按键_三个键值.pix】处理 右(AA 01 BB),左(AA 02 BB)两个键值时,home页面上的变量控件cursor用于指示光标的位置。通过判断光标的位置,来设置按钮的背景图片为深色类型,实现左右移动的效果。如home页面的光标位置有

0(不显示光标),

1(光标在button1按钮上)

2(光标在button2按钮上)

3(光标在button3按钮上)

4(光标在button4按钮上)

5(光标在button5按钮上)

6(光标在button6按钮上)

每一页光标的值默认是0,光标值随键值而变化,如:

home页面

循环按右键(AA 01 BB)时,光标值的变化为

0→1→2→3→4→5→6→1→2→3→4→5→6→1→2→3→4→5→……

循环按左键(AA 02 BB)时,光标值的变化为

0→6→5→4→3→2→1→6→5→4→3→2→1→6→5→4→3→2→……

light页面

循环按左键(AA 01 BB)时,光标值的变化为

0→1→2→3→1→2→3→1→2→3→1→2→……

循环按左键(AA 02 BB)时,光标值的变化为

0→3→2→1→3→2→1→3→2→……

【物理按键_五个键值.pix】与【物理按键_三个键值.pix】的差异主要是体现在光标值的变化上。

【物理按键_三个键值.pix】只处理左右两个键值,因此键值的变化比较简单,cursor加或者减即可。

【物理按键_五个键值.pix】同时需要考虑左右两个键值,还要考虑上下两个键值。上下两个键值的变化不是简单的加减,需要自行定义,实验中每一页定义了两个数组arrh,arrv。其中arrh用于保存左右键值变化的规律,arrv用于保存上下键值变化的规律。数组的初始化,写在home页面的加载页面事件里,并用startflag变量标记,只需初始化一次即可。如后面页面的数组初始化如下:

 //home页
    arrh.valbs[0] = 0;
    arrh.valbs[1] = 1;
    arrh.valbs[2] = 2;
    arrh.valbs[3] = 3;
    arrh.valbs[4] = 4;
    arrh.valbs[5] = 5;
    arrh.valbs[6] = 6;
    
    arrv.valbs[0] = 0;
    arrv.valbs[1] = 1;
    arrv.valbs[2] = 3;
    arrv.valbs[3] = 5;
    arrv.valbs[4] = 2;
    arrv.valbs[5] = 4;
    arrv.valbs[6] = 6;

每一页光标的值默认是0,根据页面上的按钮,光标值随键值而变化,如:

home页面

循环按右键(AA 01 BB)时,光标值的变化为

0→1→2→3→4→5→6→1→2→3→4→5→6→1→2→3→4→5→……

循环按左键(AA 02 BB)时,光标值的变化为

0→6→5→4→3→2→1→6→5→4→3→2→1→6→5→4→3→2→……

循环按下键(AA 01 BB)时,光标值的变化为

0→1→3→5→2→4→6→1→3→5→2→4→6→1→3→5→2→4→……

循环按上键(AA 02 BB)时,光标值的变化为

0→6→4→2→5→3→1→6→4→2→5→3→1→6→4→2→5→3→……

【物理按键_五个键值.pix】部分脚本代码如下

if((proc.rxBuf[0] == 0xAA)&&(proc.rxBuf[1] <= 5)&&(proc.rxBuf[2] == 0xBB))  //检测键值 帧头 帧尾
{
    if(sys_pid == home.id) //当前处于home页面
    {
        if(proc.rxBuf[1] != 3)
        {
                //根据旧光标位置,设置按钮的背景图片 为 常态背景图片
                if(cursor.val == 1)     button1.bgImg = user.image.Main;    
                else if(cursor.val == 2)button2.bgImg = user.image.Main;
                else if(cursor.val == 3)button3.bgImg = user.image.Main;
                else if(cursor.val == 4)button4.bgImg = user.image.Main;
                else if(cursor.val == 5)button5.bgImg = user.image.Main;
                else if(cursor.val == 6)button6.bgImg = user.image.Main;
            
                //根据键值改变光标的位置
                get_new_cursor(); //自定义函数,工具->函数编辑器 里可以查看和修改

            
                //根据新光标的位置,设置按钮的背景图片为深色类型,实现选中的效果
                if(cursor.val == 1)button1.bgImg = user.image.Main2;    
                else if(cursor.val == 2)button2.bgImg = user.image.Main2;    
                else if(cursor.val == 3)button3.bgImg = user.image.Main2;    
                else if(cursor.val == 4)button4.bgImg = user.image.Main2;    
                else if(cursor.val == 5)button5.bgImg = user.image.Main2;    
                else if(cursor.val == 6)button6.bgImg = user.image.Main2;                
        }
        else 
        {
                //确认键 执行按钮的点击事件
                if(cursor.val == 1)click(button1.x,button1.y);
                else if(cursor.val == 2)click(button2.x,button2.y);
                else if(cursor.val == 3)click(button3.x,button3.y);
                else if(cursor.val == 4)click(button4.x,button4.y);
                else if(cursor.val == 5)click(button5.x,button5.y);
                else if(cursor.val == 6)click(button6.x,button6.y);
        }
    }

可以看到改变光标位置的时候,调用了一个函数 get_new_cursor(),这个函数是自定义的,可在工具->函数编辑器 里可以查看和修改,主要是处理五个键值时,光标位置的变化相对复杂一些,这时候自定义一个函数,可使脚本代码更加清晰。

get_new_cursor()功能大概是,根据页面和键值的类型,找到当前光标的位置;再根据arrh或者arrv数组中定义的变化规则,改变光标的位置。

处理 确认(AA 03 BB)键值时,根据光标的所在位置,调用click函数,执行对应按钮的脚本,实现切页、控制功能。

备注

访问其他页面的控件时,需要勾选访问的控件global属性,并在访问时加上页名称前缀,如hand.button2.bgImg

本实验由于演示的页面比较多,为了使脚本代码更清晰,脚本要访问控件的名字务必定义清晰,增加代码的易读性,可按照下面的规则:

1、名称简短

2、最好能体现实际意义

3、相同属性的控件,最好带有一定顺序的编号

4. 物理按键板单片机程序

单片机的程序很简单,检测到按钮按下并发送键值即可。

char uart_buf[3] = {0xAA,0x00,0xBB};
int main(void)
{
	u8 key_value;	
	
	Sys_SetRcc();                                 //设置系统使用内部时钟
	delay_init(64);	    	                      //延时函数初始化	 
	usart1_init();                                //初始化串口
	KEY_Init();  								  //按键初始化
	while(1)
	{
		key_value = KEY_Scan(0);			//得到键值
		if(key_value)  //上7  左8  右6  下11  中5
		{
			if(key_value == J6_PRES)  //按键 右
			{
				uart_buf[1] = 0x01;				
				USART_OUT(USART1, (uint8_t*)uart_buf,3);
			}	
			else if(key_value == J8_PRES)  //按键 左
			{
				uart_buf[1] = 0x02;				
				USART_OUT(USART1, (uint8_t*)uart_buf,3);		
			}			
			else if(key_value == J5_PRES)  //按键 OK
			{
				uart_buf[1] = 0x03;				
				USART_OUT(USART1, (uint8_t*)uart_buf,3);
			}	
			else if(key_value == J11_PRES)  //按键 下
			{
				uart_buf[1] = 0x04;				
				USART_OUT(USART1, (uint8_t*)uart_buf,3);		
			}			
			else if(key_value == J7_PRES)  //按键 上
			{
				uart_buf[1] = 0x05;				
				USART_OUT(USART1, (uint8_t*)uart_buf,3);
			}			
		}
	}
	
}

5. 下载验证

将【物理按键_三个键值.pix】或者【物理按键_五个键值.pix】编译后下载到2.4寸显示屏,即可看到如下界面:

(1)调试时先将屏的串口连接到电脑,用电脑端的串口助手模拟给屏发键值,确认屏能正确处理键值:

(2)再将STM32单片机的键值输出到电脑端的串口助手上,确认STM32单片机发出的键值是正确的。

(3)最后将STM32单片机的串口接到屏的串口上,可以验证到,上、下、左、右、确认键都是正常的