15系列单片机与迪文DGUS屏应用之(七):登录密码设计
<p>大家好,我是『芯知识学堂』的SingleYork,前面给大家介绍了迪文DGUS屏的基本操作,相信大家看了文章后对迪文DGUS屏的基本应用应该有了一定的了解,那么,今天笔者将要给大家介绍DGUS屏的另外一个比较实用的功能,那就是DGUS屏的密码设计。</p><p>在工业自动化领域,用户产品经常会有密码登录的需求,通过单片机编程实现设置及修改密码程序。一说到密码,我们首先可能想到的是,先在单片机里面存储一个初始密码,然后在触摸屏输入一个密码数字,通过串口下发给单片机,单片机判断这个数字是否跟初始密码一致,来判断密码的正确的,然后可以进行一些修改或其他的操作。当然,这种原始的方法也不是不可行,但是,随着触摸屏组态软件的强大,很多操作都不需要单片机来直接参与,就能实现密码登录、密码修改等。市面上很多人机界面都有这个功能,迪文DGUS屏自然也不例外。</p>
<p>迪文DGUS屏通过自身二次开发平台(DWIN_OS)便可以轻松实现密码功能,省去了单片机编程,为我们的开发带来了极大的方便。本文在迪文官方提供的例程上做了一些修改,详细介绍了通过组态软件和OS程序来设置修改密码的方法,关于OS指令的详细说明请参考官方提供的资料《基于DWIN_OS指令的理解与应用(os详细文档指导资料)》。</p>
<p>首先,我们把需要用到的界面图片准备好,大致如下所示:</p>
<p><img src="data/attachment/forum/202505/05/210243i17j3h67fif3bbh2.png" alt="00.png" title="00.png" /></p>
<p>然后,建立一个新的工程,由于建立工程的步骤,前面的例程已经详细介绍过了,在此就不再赘述,不清楚如何建立工程的读者,请仔细阅读前面的章节。如有需要源码,可以站内私信笔者。</p>
<p>这里需要特别提醒一下读者,因为本例中需要用到OS,所以在工程配置的时候,需要勾选“启用OS”选项;</p>
<p><img src="data/attachment/forum/202505/05/210305wolbsofoook5zl0o.png" alt="01.png" title="01.png" /></p>
<p>本例中,主要演示了如下功能:</p>
<ol>
<li>在“自动模式”界面,按下“手动模式”按键,会出现密码输入框,只有密码输入正确,才能跳转到“手动模式”;</li>
<li>在“自动模式”或“手动模式”界面,按“密码管理”按键,密码输入正确后可进入到“密码管理”界面,在此界面,用户可以修改密码;</li>
<li>在官方给的“密码登陆与改写”例程基础上,增加了按键判断,即:通过判断触摸屏上的“手动模式”按键和“密码管理”按键的返回值,来确定在密码输入正确后,是跳转“手动模式”界面,还是“密码管理”界面。这个功能,在某些场合下是非常有用的。</li>
<li>本例中的密码有两种,一种是“普通密码”,用户可以任意修改;另外一种则是“超级密码”,用户不能更改。“超级密码”的作用就是为了防止用户忘记了自己设置的密码,而作为一把万能钥匙来重置密码。</li>
</ol>
<video controls="controls" src="forum.php?mod=attachment&aid=97366"></video>
<p>为了照顾新手,笔者在这里,还是给大家简单分享一下每个界面的变量的配置,读者可以参考该设置,配置自己的工程。</p>
<p>首先,是“自动模式”界面的两个“按键返回”控件的配置:</p>
<p><img src="data/attachment/forum/202505/05/210845b2uazaa3tat2x73x.png" alt="02.png" title="02.png" /></p>
<p><img src="data/attachment/forum/202505/05/210855fq5ikiq1757zdpmu.png" alt="03.png" title="03.png" /></p>
<p>接下来就是“手动模式”界面的两个“按键返回”变量的配置:</p>
<p><img src="data/attachment/forum/202505/05/210903gllqolq5oo6ggvoo.png" alt="04.png" title="04.png" /></p>
<p><img src="data/attachment/forum/202505/05/210909ijfzykie91iskjec.png" alt="05.png" title="05.png" /></p>
<p>然后,就是“密码管理”界面的变量的配置,这里需要注意的就是,在“新建密码”输入框和“再次输入密码”输入框中,均有两个变量,一个是“数据变量显示”控件,另一个则是“数据变量输入”控件,尤其是需要注意这两个变量的地址要一致,并且,由于写变量是用的四个字节,需要用到两个地址控件来存储,所以,在设置下一个变量的地址的时候,需要加“2”,即,“新建密码”的变量地址只0x0052,那么“再次输入”的变量地址就应该为0x0054,其他的,大家参考笔者的配置即可。</p>
<p><img src="data/attachment/forum/202505/05/210918hcbbltrbnlzrbzbu.png" alt="06.png" title="06.png" /></p>
<p><img src="data/attachment/forum/202505/05/210925mbdx1s7fpb3shbud.png" alt="07.png" title="07.png" /></p>
<p><img src="data/attachment/forum/202505/05/210944ceajz0vv6nn68tav.png" alt="08.png" title="08.png" /></p>
<p><img src="data/attachment/forum/202505/05/210950fjtkt2fglobooj4w.png" alt="09.png" title="09.png" /></p>
<p>接下来,就是密码输入框的配置了,这个地方之前在将数字键盘设计的时候也有讲过,参考之前的设计即可,不过这里需要记住这个密码输入框的地址是0x0050,因为在OS程序中需要用到。</p>
<p><img src="data/attachment/forum/202505/05/211000hmiv538vo4cc93kv.png" alt="10.png" title="10.png" /></p>
<p>接下来,就是“密码错误”界面的两个按键的配置,当我们密码输错的时候,我们一般会选择重新输入密码或者不想要输密码进行后续操作了,直接返回到主页。这个功能很容易实现,我们只需要添加两个“基本触控”变量即可。</p>
<p><img src="data/attachment/forum/202505/05/211010xk36frrra3jff5f6.png" alt="11.png" title="11.png" /></p>
<p><img src="data/attachment/forum/202505/05/211019sp1n0mmzu0tc7p4k.png" alt="12.png" title="12.png" /></p>
<p>然后,就是我们的密码修改过程中可能遇到的情况了,我们一般修改新密码的时候,需要输入两次新密码,以确保用户输入的准确性,反正用户误操作,改了一个自己都不知道的新密码。那么,检查这两次输入的密码是否一致,就显得很有必要了。当密码输入正确后,我们跳转到一个“密码修改成功”的界面:</p>
<p><img src="data/attachment/forum/202505/05/211030j0zuszpz9pt14p8l.png" alt="13.png" title="13.png" /></p>
<p>然而,并不是每次用户都能讲两次密码输入成一致,有时候不小心多点了个数,或者中间某个数输入错了,这时候,我们就可以跳转到另外一个界面来提示用户,让用户选择是继续重置密码呢还是直接退出。</p>
<p><img src="data/attachment/forum/202505/05/211042s8kgltf0qqq9f3tk.png" alt="14.png" title="14.png" /></p>
<p>至此,DGUS界面部分设计就大功告成了,接下来的重头戏,就是OS程序部分了。首先,我们为了方便,先把DGUS屏中用到的一些变量的信息,直接以注释的形式添加到OS程序中,这样就可以不用去DGUS工程中去一一查看每个变量的含义了。接下来,就是两个CALL指令,即:调用子程序指令。调用完成后,以END结束,在下一个DGUS屏的周期到来,再开始调用子程序。</p>
<p><img src="data/attachment/forum/202505/05/211053h771ghg7g3nj1hvv.png" alt="15.png" title="15.png" /></p>
<p>在每次一次调用子程序后,都会执行一个RET—子程序调用返回指令。</p>
<p><img src="data/attachment/forum/202505/05/211104z8xugj9igitgfut1.png" alt="16.png" title="16.png" /></p>
<p>接下来,我们看下密码校验部分,在我们输入完密码,按下“OK”键后,OS程序就会自动来判断密码的正确性,前面说到了,在本例中,有两种密码,一种是普通密码,另外一种就是超级密码了。在新的工程时,本身是没有设置普通密码的,所以在第一次使用的时候,需要用超级密码权限在“密码管理”界面,设置一个8位数以下(含8位数)的非0密码。OS程序在判断密码的时候,会首先识别是不是普通密码,如果是普通密码,则直接跳转到“MA_OK” 执行相关动作;若用户输入的密码不是普通密码,则再来判断是不是超级密码,如果是超级密码,同样跳转到“MA_OK” 执行相关动作。若两者都不是,则跳转到“MA_ERR”,执行相关动作。这一部分的完整代码如下图所示:</p>
<p><img src="data/attachment/forum/202505/05/211120fouszmu3x7uxosom.png" alt="18.png" title="18.png" /></p>
<p>在密码输入正确后,我们再来识别此时是应该跳转到“手动模式”界面,还是“密码管理”界面呢?这里主要是通过按键返回值来识别:</p>
<p><img src="data/attachment/forum/202505/05/211338y5heqc8sd1s0fsqc.png" alt="19.png" title="19.png" /></p>
<p> 当变量地址0x1000的返回值是0x0001的时候,跳转到“手动模式”界面;</p>
<p> 当变量地址0x1000的返回值是0x0003的时候,跳转到“密码管理”界面;</p>
<p>当然,其中本来还有一个返回0x0002的值,跳转到“参数设置”界面,笔者故意在本例中删去了,留给读者来做验证。</p>
<p><img src="data/attachment/forum/202505/05/211403mu36q26qz4zbowqu.png" alt="20.png" title="20.png" /></p>
<p>接下来就是“修改密码”的子程序了,这个子程序会判断“修改完成”按键是否按下,然后再来判断两次密码输入框里面的数据是否一致,如果一致的话,则可以成功修改并保存密码,若不一致,则跳到错误界面。</p>
<p><img src="data/attachment/forum/202505/05/211417lhrhzo3r5753g73s.png" alt="21.png" title="21.png" /></p>
<p>好了,关于迪文DGUS屏密码的设计就简单介绍到这了,有关OS指令部分如有不明白之处请联系作者,也可以参考《基于DWIN_OS指令的理解与应用(os详细文档指导资料)》,里面有每条指令的详细说明。</p>
<hr />
<p>项目源码下载:</p>
<p><a href="forum.php?mod=attachment&aid=97387" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:单片机与迪文DGUS屏通信例程项目源码.zip</a></p>
迪文DGUS屏密码功能设计与实现深度解析
作者:芯知识学堂 SingleYork
引言
在工业控制领域,人机交互界面(HMI)的密码功能是保障设备操作安全性的核心需求之一。迪文DGUS屏通过其二次开发平台DWINOS,能够高效实现密码登录、权限管理等功能,显著降低主控芯片的代码复杂度。本文基于官方例程优化,从系统架构、OS程序逻辑及安全设计三方面,深入剖析密码功能的实现原理与工程实践。
一、系统架构设计
迪文DGUS屏的密码功能实现依赖于界面组态与DWINOS程序的协同工作,其核心架构如下:
1. 界面层:
密码输入界面:包含数字键盘、密码显示框(掩码处理)及确认/取消按钮。
权限跳转逻辑:通过不同页面ID控制界面切换,例如“自动模式”与“手动模式”的权限隔离。
2. 数据层:
密码存储:利用DGUS屏的数据变量存储区(VP地址)保存预设密码及临时输入值,避免依赖外部存储器。
状态标志位:通过VP地址定义密码验证状态(如0x1000为验证成功标志)。
3. 逻辑层:
OS程序响应:通过触控事件触发密码验证、界面跳转及错误处理逻辑,实现全流程自动化。
二、DWINOS程序实现详解
1. 密码输入与验证流程
步骤1:触控事件绑定
在“手动模式”按键的触控属性中,绑定OS程序入口地址(如0x2000),触发密码输入界面弹出。
assembly
; 触控事件响应示例
MOV R0, 0x1001 ; 页面跳转指令(跳转至密码输入界面)
MOV R1, 0x0001 ; 目标页面ID
CALL SYSWriteCMD ; 发送指令
步骤2:密码输入处理
通过数字键盘输入密码,实时更新VP地址(如0x2000-0x2003存储4位密码),并掩码显示为“”。
步骤3:密码比对逻辑
用户点击“确认”后,OS程序从预设VP地址(如0x2010-0x2013)读取正确密码,与输入值逐位比对:
assembly
; 密码比对代码片段
LDWR R0, 0x2000 ; 输入密码首地址
LDWR R1, 0x2010 ; 预设密码首地址
MOV R2, 4 ; 密码长度
LOOP:
MOV A,
CMP A,
JNZ ERROR ; 任意一位不匹配则跳转至错误处理
DJNZ R2, LOOP
MOV R3, 0x01 ; 验证成功标志
JMP SUCCESS
步骤4:权限跳转与错误处理
验证成功时,置位状态标志(如0x1000=1),并跳转至目标界面;失败则清空输入并提示错误信息。
2. 密码修改功能扩展
双密码校验:要求用户输入旧密码并通过二次确认新密码,防止误操作。
数据持久化:通过EEPROMWrite指令将新密码写入非易失存储区,确保断电不丢失。
三、安全增强与优化建议
1. 密码加密存储
避免明文存储密码,可采用异或(XOR)或简单哈希算法(如累加和取模)增强安全性。
示例:将密码“1234”转换为(1+2+3+4) MOD 10 = 0作为校验值。
2. 防暴力破解机制
限制连续错误次数(如3次),锁定界面并记录事件日志。
3. 权限分级管理
通过多组VP地址实现不同等级密码(如操作员密码与管理员密码),区分功能权限。
四、工程配置关键点
1. 启用OS功能
在DGUS工程配置中勾选“启用OS”选项,并指定OS程序文件(.bin)。
2. 变量地址规划
合理分配VP地址,避免与界面控件、数据存储区域冲突。建议使用0x1000以上地址段。
3. 调试与测试
通过DGUS屏的在线调试工具实时监控VP地址值,快速定位逻辑错误。
五、总结
迪文DGUS屏的密码功能设计充分体现了其“高内聚、低耦合”的开发理念,通过DWINOS程序将复杂逻辑从主控芯片剥离,显著提升系统稳定性。开发者需重点关注数据安全与异常处理,结合具体场景灵活扩展功能(如多级权限、操作日志)。对于更复杂的应用,可参考官方文档《DWINOS指令详解》进一步探索事件中断、定时器等高级功能。
附录
完整OS程序源码及工程文件可通过站内私信获取。
官方资料下载地址:迪文科技开发者平台
通过本文的实践与优化,读者可快速掌握迪文DGUS屏的密码功能设计方法,为工业设备的安全交互提供可靠解决方案。
[本文内容由国芯人工智能辅助生成,仅供参考]
页:
[1]