迪文科技论坛

 找回密码
 立即注册
搜索
查看: 505|回复: 3

【2019.8.10获奖项目】迪文屏配合STM32实现翻页密码和时间锁

[复制链接]

567

主题

167

回帖

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11960
发表于 2024-1-4 15:10:22 | 显示全部楼层 |阅读模式
【开源】迪文K600+和T5L屏与STM32F1xx实现翻页密码和时间锁

由于很多原因,我们需要在设备使用一段时间后,不再授权设备的使用,所以需要触摸屏和控制器在一定的时间后,停止使用,本文使用STM32与触摸屏配合实现此功能:

1.硬件需求:
(1)迪文触摸屏型号:DMG80480L070/ DMT80480C070,T5L屏使用DGUS2模式;
(2)单片机型号:STM32F103RCT6;
(3)硬件连接方式:采用RS232连接,使用T5L屏时请将TTL/RS232短接端子,处于OFF模式;
(4)通讯协议:迪文DGUS/DGUS2触摸屏通讯协议;
(5)STM32硬件原理图参考文件夹中“原理图.PDF”。


由于屏幕的控制指令有差异,为实现程序兼容两种屏幕型号,使用KEY0/KEY1外部端子来控制触摸屏型号,当KEY0/KEY1都接上短接冒时,屏幕支持K600+模式,其他为T5L模式。


2.迪文屏幕配置:

由于T5L在控件配置上基本兼容K600+,所以这里只讲述T5L的配置,T5L与K600+在本工程中使用的地址完全一致,K600+的屏幕配置请参考T5L,时间锁页面密码地址如下:

配置项目
显示地址写入地址
时间锁页面密码1200
时间配置使能13001310
第一期时间13011311
第一期密码13021312
第二期时间13031313
第二期密码13041314
第三期时间13051316
第三期密码13061316

3.STM32软件配置:
由于本工程为项目更改而来,有许多删减,在使用过程中可能会有不可避免的BUG,如发现请指出,时间锁功能经过项目验证,定时时间后锁定屏幕,可以参考使用!
(1)STM32软件使用STM32CubeMX生成的MDK5工程,具体配置请参考附件“STM32与DWIN屏_DMT80480C070-DMG80480L070设备时间锁”中的“DWIN_DMG80480L070_S3_DF_WIFI”,此文件需要电脑安装“STM32CubeMX”版本4.16以上;
(2)STM32使用到的硬件包括:
  • 串口3,与触摸屏通讯;
  • Flash读写操作,用于存储时间和密码等数据,写入次数10W次;
  • 定时器2配置为5ms;
  • PB12配置为输出,运行指示灯,500ms间隔闪烁。
(3)原理:
  • 通过T2定时器计时,每2小时计数器增加1并写入到Flash,每个Flash地址写入1000次,超过1000,则写入相邻的下个地址,当计时时间大于用户触摸屏设定的时间,弹出锁定界面并给出相关提示,
  • 本工程一共给出三期时间设定,第3期权限最高,以此排序;
  • 用户通过触摸屏写入的数据保存在STM32的Flash中,掉电后不会丢失。

4.详细信息请参考附件文件
5.操作方法:
(1)连接好单片机与触摸屏;
(2)上电后如下图所示:首页,按键地址0x1000,键值0X0019。如下图,轻触进入密码输入页:



(3)轻触屏幕弹出输入密码界面:密码输入页,密码输入框地址0x1200:




(4)输入密码10237120,进入时间设定界面:




输入每一期使用的时间和密码,并将“时间配置使能”设定为1后,时间锁开始生效。软件的详细注释清参考MDK工程;




【开源】迪文K600+通过编写OS实现翻页密码和时间锁

之前发布的贴子中,使用迪文触摸屏借助单片机的定时器实现了翻页密码和设备定时锁,这种与单片机的配合使用存在一定的缺点,不仅占用单片机的资源,还浪费了触摸屏的性能;
这次通过迪文屏的OS程序编写实现设备定时锁定,本文只是对实现的思路作一定的解释,对部分源码加以注释和解释,具体内容请参考压缩包中的触摸屏工程及OS程序,由于本人能力有限,在OS及程序中有什么问题,请指出,谢谢!


1.本程序是以K600+触摸屏为基础编写,触摸屏必须自带RTC;

2.翻页密码部分参照了迪文官方提供的K600+翻页密码程序,在此致谢!

3.由于本工程为本人为单位书写,所以本人对触摸屏中的工程图片进行了屏蔽,按键位置可能在显示界面不显示,但是不影响使用,如若有工程师使用,请务必不要使用触摸屏工程文件中的图片,再次致谢!


功能:设备不再授权使用,一般会在设备下位机或人机互交界面等增加定时时间,在用户使用时间范围内,设备可以正常运转,超出使用时间后,设备被锁死,不再授权使用;
思路:因为我所使用的K600+触摸屏自带RTC,所以实现该功能是通过读取RTC的时间与用户的设定时间比较,若使用时间没有达到用户设定的时间,则触摸屏正常运行,若使用时间等于或超出用户设定的使用时间,则判断当前密码与用户输入后保存的密码是否一致,一致则不弹出锁定界面,不一致则弹出锁定界面并提示用户输入密码,用户输入密码正确,解锁,输入密码不正确,提示用户并持续锁定;
  

本工程一共编写了三期时间锁定,每期的指令基本一致,只是调用不同的子程序,由于本程序为本人很久前编写,在程序结构上可能不够理想,如有更好的意见请指出,致谢!
下面对部分OS程序解释:
clear: LDWR R0,0X4100      
  MOVXR R10,1,1   
  IJNE R11,5AH,Go_End
  
  LDWR    R0,0X4101      
  MOVXR   R10,1,1        
  LDWR    R4,0210H  ;0X0100 0000
  LDWR    R6,0000H
  LDWR R0,0X4101       ;            
  MOVXL 3,2             ;新密码写入数据库
  LDWR R0,0x4100  ;
  LDBR R10,0,1  
  MOVXR R10,0,1
  LDWR R0,0x4101  ;
  LDBR R10,1,1  
  MOVXR R10,1,1
  
  LDWR    R0,0X4101      
  MOVXR   R10,1,1        
  LDWR    R4,0111H  ;0X0100 0000
  LDWR    R6,0000H
  LDWR R0,0X4101       ;            
  MOVXL 3,2             ;新密码写入数据库
  LDWR R0,0x4100  ;
  LDBR R10,0,1  
  MOVXR R10,0,1
  LDWR R0,0x4101  ;
  LDBR R10,1,1  
  MOVXR R10,1,1
  
  LDWR    R0,0X4101      
  MOVXR   R10,1,1        
  LDWR    R4,0112H  ;0X0100 0000
  LDWR    R6,0000H
  LDWR R0,0X4101       ;            
  MOVXL 3,2             ;新密码写入数据库
  LDWR R0,0x4100  ;
  LDBR R10,0,1  
  MOVXR R10,0,1
  LDWR R0,0x4101  ;
  LDBR R10,1,1  
  MOVXR R10,1,1
  
  GOTO    Go_End4
  
READTIMmima:
  LDWR     R4,0210H  ;0X0018 0000
  LDWR     R6,0000H  ;读取保存的时间1
  LDWR     R0,0X4500      
  MOVXL    2,6
  ;LDWR  R0,0X4501      ;
  MOVXR  R10,1,3
  LDWR     R4,0200H  ;0X0018 0000
  LDWR     R6,0000H  ;读取保存的时间1
  LDWR     R0,0X4512      
  MOVXL    2,3
  ;LDWR  R0,0X4513       ;
  MOVXR  R20,1,3
  CJNE  R10,R24,READTIME
  CJNE  R11,R25,READTIME
        
  LDWR R0,0x4400 ; R0:R1 指定DGUS 变量地址0x0010
  LDWR R160,0
  MOVXR R160, 0, 1
  GOTO     Go_End2
SHURUMIMA:        
  LDWR    R0,0X3051       ;读密码框,触摸屏手动输入的值
  MOVXR   R10,1,2      ;将变量地址0x3051、0x3052、0x3053、0x3054分别写传送给R10、R11、R12、R13
  LDBR    R14,0,1      ;0写入R14
  OR      R14,R10,1
  OR      R14,R11,1
  OR      R14,R12,1
  OR      R14,R13,1     
  IJNE    R14,0,MIMANE0    ;密码框不为0
  GOTO    READTIMmima
MIMANE0:
  LDWR    R0,0X3051      
  MOVXR   R10,1,1        
  LDWR    R4,0210H  ;0X0110 0000
  LDWR    R6,0000H
  LDWR R0,0X3051       ;            
  MOVXL 3,2             ;新密码写入数据库
  LDWR R0,0x3051  ;
  LDBR R10,0,10  
  MOVXR R10,0,10
  GOTO    Go_End2        
WriteSet:
  LDWR R0,0X4007       ;
  MOVXR R10,1,1   ;
  IJNE R11,5AH,Go_End2 ;重建密码确认键是否按下
  
  LDWR    R0,0X4000      
  MOVXR   R10,1,6        
  LDWR    R4,0200H  ;0X0100 0000
  LDWR    R6,0000H
  LDWR R0,0X4000       ;            
  MOVXL 3,10             ;新密码写入数据库
  LDWR R0,0x4000  ;
  LDBR R10,0,20  
  MOVXR R10,0,10
  GOTO    Go_End2
READSET:
  LDWR     R4,0200H  ;0X0018 0000
  LDWR     R6,0000H  ;读取保存的时间1
  LDWR     R0,0X4020      
  MOVXL    2,5
  GOTO    Go_End2
;===========================================================
READTIME:
  LDWR R0,0x4400 ; R0:R1 指定DGUS 变量地址0x0010
  LDWR R200,0x005A
  MOVXR R200, 0, 1
        
  MOVDR 20H,R130,7
  LDWR R0,0x6000
  MOVXR R130, 0, 7  ;读取当前时间
;===========================================================  
ZHUANHUAN:
  MOV R130,R40,1
  BCDHEX R40,R41,0X11 ;00010001
  MOV R41,R150,1 ; 各1字节
  MOV R131,R40,1
  BCDHEX R40,R41,0X11
  MOV R41,R152,1
TESTyear:
  LDWR  R0,0X4020 ;
  MOVXR R137,1,2
  JS R137,R149,TIM1JIAMI
  CJNE R138,R150,Go_End2
  JS R139,R151,TIM1JIAMI
  GOTO Go_End2
TIM1JIAMI:
  LDBR R30,0,16
  LDWR  R0,0X4022
  MOVXR R36,1,1        
  LDWR R44,10     
  DIV R30,R38,0 ;判断密码个位数
  
  LDWR R11,1 ;判断密码各位是否为1,为1跳转到GEWEI1
  CJNE R45,R12,budeng1
  GOTO GEWEI1
  
budeng1DWR R11,3;判断密码各位是否为3,为1跳转到GEWEI2
  CJNE R45,R12,budeng2
  GOTO GEWEI2
  
budeng2DWR R11,2 ;判断密码各位是否为4,为1跳转到GEWEI4
  CJNE R45,R12,budeng124
  GOTO GEWEI4
  
budeng124: LDWR R10,106  ;不判个位
  MOVRD R10,3,2
  GOTO Go_End2
  
GEWEI1:
  LDWR R0,0x2500 ; R0:R1 指定DGUS 变量
  LDWR R10,0x0004
  MOVXR R10, 0, 1 ;设置2500=3;
  
  LDWR R0,0x2602 ; R0:R1 指定DGUS 变量
  LDWR R10,0x0001
  MOVXR R10, 0, 1 ;设置2500=3;
  
  IJNE R100,30,BUTIAO
  GOTO TIAO
BUTIAO:
  LDWR R10,107  ;切换到第106页,密码个位为1,在22文件里面设置道夫该页发送道夫=3;
  MOVRD R10,3,2
  INC     R100, 0, 1
  IJNE R100,30,Go_End2

   
TIAO:   
  LDWR R10,106 ;切换到第106页,密码个位为1,在22文件里面设置道夫该页发送道夫=3;
  MOVRD R10,3,2
  GOTO Go_End2
      
GEWEI2:
  LDWR R0,0x2500 ; R0:R1 指定DGUS 变量
  LDWR R10,0x0004      
  MOVXR R10, 0, 1 ;设置2500=3;
  
  LDWR R0,0x2612 ; R0:R1 指定DGUS 变量
  LDWR R10,0x0003
  MOVXR R10, 0, 1 ;设置2500=3;
  
  IJNE R102,30,BUTIAO1
  GOTO TIAO1
BUTIAO1:
  LDWR R10,107  ;切换到第106页,密码个位为1,在22文件里面设置道夫该页发送道夫=3;
  MOVRD R10,3,2
  INC     R102, 0, 1
  IJNE R102,30,Go_End2

   
TIAO1:
  LDWR R10,113;切换到第106页,密码个位为1,在22文件里面设置道夫该页发送道夫=3;
  MOVRD R10,3,2
  GOTO Go_End2
  
GEWEI4:
  LDWR R0,0x2500 ; R0:R1 指定DGUS 变量
  LDWR R10,0x0004
  MOVXR R10, 0, 1 ;设置2500=3;
  
  LDWR R0,0x2622 ; R0:R1 指定DGUS 变量
  LDWR R10,0x0002
  MOVXR R10, 0, 1 ;设置2500=3;
  
  IJNE R104,30,BUTIAO2
  GOTO TIAO2
BUTIAO2:
  LDWR R10,107  ;切换到第106页,
锁定界面

  MOVRD R10,3,2
  INC     R104, 0, 1
  IJNE R104,30,Go_End2
   
TIAO2:
  LDWR R10,114 ;切换到第106页,锁定界面;
  MOVRD R10,3,2
Go_End2:
  RET

工程会在后续上传,谢谢!





备注说明:如需源码,请在评论区回复邮箱获取,谢谢!

















本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

1

主题

6

回帖

152

积分

注册会员

Rank: 2

积分
152
发表于 2024-6-25 23:15:41 | 显示全部楼层
本帖最后由 数据总线 于 2024-6-25 23:16 编辑

你好,拜读了你的程序后,本人获益良多,但有一问题不明白:对于"显示地址"和"写入地址"是怎样关联到一起的,
看了工程文件, 就是变量数据录入和变量数据显示 这两个控件有什么关联,是怎样关联一起的,这点不明白,请赐教,谢谢!!!
本人QQ是 942547592 如不嫌弃可共同探讨学习
回复

使用道具 举报

0

主题

415

回帖

5742

积分

论坛元老

Rank: 8Rank: 8

积分
5742
发表于 2024-6-26 09:31:54 | 显示全部楼层
数据总线 发表于 2024-6-25 23:15
你好,拜读了你的程序后,本人获益良多,但有一问题不明白:对于"显示地址"和"写入地址"是怎样关联到一起的,
看 ...

您好,只要是变量地址一样,他们就可以达到功能相关联的效果。
比如:录入控件给变量地址输入数据1,那么这个数据就存在变量地址中,当显示控件也是这个地址是,底层逻辑就会判断,显示控件就会显示出数据来。明白这个意思吗。
我不在我不在
回复

使用道具 举报

1

主题

6

回帖

152

积分

注册会员

Rank: 2

积分
152
发表于 2024-6-26 14:08:31 | 显示全部楼层
Yangjc1030 发表于 2024-6-26 09:31
您好,只要是变量地址一样,他们就可以达到功能相关联的效果。
比如:录入控件给变量地址输入数据1,那么 ...

但是两个地址明显示是不一样的吧,怎样关联在一起的,始终都还没搞明白
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-22 09:40 , Processed in 0.112968 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表