一、
数字密码锁是一项很经典的安全应用设计,时至今日它还在智能手机、平板电脑、家居门禁控制等领域发挥着重要作用,以下来讨论如何使用STM32H7S78-DK评估板复刻这一密码锁。默认界面为输入密码界面,若密码输入正确则更改文本显示,密码输入错误则将更改文本控件显示"密码输入错误!",为了快速完成这一复刻设计,我们可以使用TouchGFX工具来实现。
TouchGFX是STM32出品的一个专为嵌入式设备使用的GUI图形框架,TouchGFX可以帮助开发者快速完成图形界面原型设计,在最节省系统资源的同时发挥出最佳的图形处理性能,助力开发者高效开发GUI应用
以下是TouchGFX的简介:
TouchGFX框架包含易于使用的拖放式图形构建PC工具TouchGFX Designer (TouchGFXDesigner)以及强大的优化图形处理内核TouchGFX引擎。结合WYSIWYG仿真器和自动代码生成功能,TouchGFX大大简化了GUI开发。通过对完成的原型进行快速迭代,它涵盖了从早期设计草图到生成独家最终产品的所有步骤。
结构:轻松创建多屏幕内容和相关转换小部件:广泛的可定制小部件,如滑动容器和周期进度,便于轻松创建GUI。皮肤:一组即用型图形化皮肤,可实现一致的原型设计,而无需图形化设计工具。不限制使用自定义图形。交互:动态交互,便于创建用户友好型应用。自定义容器:创建用户可重用的应用控件。具有统一观感的轻松平台开发。文本处理:在单一位置指定和管理的字体和排版。完整的翻译服务,完全支持多种字母和脚本,如拉丁语、西里尔语、阿拉伯语、汉语和日语
代码生成:
TouchGFXDesigner可生成和维护高性能C++代码
工具生成的代码与用户代码完全分离
各种代码扩展可实现独特的动画与系统互联
支持多种集成式开发环境,如IAR Embedded Workbench、Arm Keil和基于GCC的IDE
二、TouchGFX应用界面设计
TouchGFX版本号:4.24.0,新建空白TouchGFX工程如下
现在来为屏幕添加相应的图形元素,根据应用需求我放置了1个模拟时钟控件用于显示当前时间,两个文本框用于显示当前日期信息、气温数据
一个文本框用于提示输入密码,最后是9个带文本标签的数字按钮用于密码输入
界面设计好后可以编译并在电脑上使用仿真器运行查看效果
可以看到仿真器的图形显示与设计内容一致,如果对图形元素的布局感到合适,此时可以将程序固件烧录至评估板
三、程序设计
图形界面设计完成后,开始考虑数字密码锁的处理逻辑。密码通常为6位数字,并且密码输入错误次数超过3次,会进入短暂的暂停密码输入阶段
这里只实现数字按钮输入检测以及密码验证,密码输入次数检验暂时不处理
示例程序:
声明密码检验函数,密码存储数组
class Screen1View : public Screen1ViewBase { public: Screen1View(); virtual ~Screen1View() {} virtual void setupScreen(); virtual void tearDownScreen(); void check(); virtual void pwdCheck(const touchgfx::AbstractButton& src);//重写父类函数 // virtual void pwdCheck(const touchgfx::AbstractButton& src); protected: uint8_t cnt,pwd[6]; uint8_t pwd_set[6]={1,4,7,8,5,2}; }; #endif // SCREEN1VIEW_HPP
数字按键按下后存储对应数字
void Screen1View::pwdCheck(const touchgfx::AbstractButton& src) { // printf("Test.\n"); if (&src == &buttonWithLabel1) { pwd[cnt++]=1; if(cnt>5)check(); } else if (&src == &buttonWithLabel2) { pwd[cnt++]=2; if(cnt>5)check(); } else if (&src == &buttonWithLabel3) { pwd[cnt++]=3; if(cnt>5)check(); } else if (&src == &buttonWithLabel4) { pwd[cnt++]=4; if(cnt>5)check(); } else if (&src == &buttonWithLabel5) { pwd[cnt++]=5; if(cnt>5)check(); } else if (&src == &buttonWithLabel6) { pwd[cnt++]=6; if(cnt>5)check(); } else if (&src == &buttonWithLabel7) { pwd[cnt++]=7; if(cnt>5)check(); } else if (&src == &buttonWithLabel8) { pwd[cnt++]=8; if(cnt>5)check(); } else if (&src == &buttonWithLabel9) { pwd[cnt++]=9; if(cnt>5)check(); } }
四、实验结果