演示视频

1.概述

基于迪文屏DMG32240C028-03WTC屏的滑动手势6宫格解锁功能,该功能运用了触摸屏状态读取和坐标读取的功能(系统变量接口0x0016),绘图功能,需要配合变量图标显示等基本功能即可完成整个功能的开发。读取触摸屏状态和坐标,主要用于判断当前是否有触摸操作,触摸区域是否为有效区域;绘图功能主要实现连线效果,为了达到更好的显示效果,可以通过描述指针修改线条粗细以及线条颜色,会更加美观;变量图标用于在判断为有效触控时,改变显示内容以达到提示的效果。

用到的系统变量接口:

2.GUI设计

(1)首页,包含基本图形显示控件,用于显示选中图标之间的连线;变量地址设置为1200,端点画线功能参考如下:

 (2)图标显示,总共两种状态,未触摸为状态图标2,触摸到有效区域显示图标3;

(3)设定密码界面,和首页基本一样

(3)解锁后页面

(4)设定密码确认界面

4.程序设计

#include  "Lock.h"
//=======================================================================================
u16  xdata  Power_Down_Save_Address[]={PASS_WORD_ADD(0),PASS_WORD_ADD(1),PASS_WORD_ADD(2),PASS_WORD_ADD(3),PASS_WORD_ADD(4),PASS_WORD_ADD(5),0x10D8,0x10D9,
                                       0x10DA,0x10DB,0x10DC,0x10DD,0x10DE};//掉电保存地址
u16  xdata  Power_Down_Save_Data[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//掉电保存数据
#define        SAVE_NUMBER      6  
//========================================================================================

u16  xdata  T_number_0=0;   //屏保用
u16  xdata  T_NUMBER_1=0;
u16  xdata  T_NUMBER_2=0;//

u16  xdata  Page_now=0;//当前页面
u16  xdata  Tp_state=0;//当前按压状态
u16  xdata  Coord_x=0;//当前x坐标
u16  xdata  Coord_y=0;//当前y坐标
bit         Tp_flag=0;//按压处理标志

u16  xdata  number_one=300;
u16  xdata  number_two=180;
u16  xdata  Pass_word[PASSWORD_NUMBER+1]={0};  //密码值
u16  xdata  Mapping_coor[PASSWORD_NUMBER*2+2]={0}; //绘图坐标点
u16  xdata  Pass_word_count=0;//密码个数
//u8     Flaga=0;//当前故障
u8     Flagb=0;//屏保用
u8     Flagc=0;//屏保用
u8     Flagd=0;//绘图用
//========================================================================================
u16  xdata  T_count_1=0;//计数指针
u16  xdata  T_count_2=0;//
u16  xdata  Button_Down_1=0;
u16  xdata  Button_Down_2=0;
/*****************************************************************************
 函 数 名  :Flash_Read/Write(u8 area,u16 lib_addr,u16 Dgus_addr,u16 len)
 功能描述  :读写数据库 area=flash区域0-3,lib_addr=数据库地址,Dgus_addr=Dgus变量地址 ,len=写入数据字长度(必须是偶数)
 输入参数  :     
 输出参数  : 
 修改历史  :
  1.日    期   : 2022年4月29日
    作    者   : DWIN
    修改内容   : 
*****************************************************************************/
void  Flash_Read(u8 area,u16 lib_addr,u16 Dgus_addr,u16 len)//
{
        if(lib_addr%2)
                 lib_addr-=1;//奇数转成偶数
            if(Dgus_addr%2)
                Dgus_addr-=1;//奇数转成偶数
            Write_Dgus(0x000b,len);
            Write_Dgus(0x000a,Dgus_addr);
            Write_Dgus(0x0009,lib_addr);
            Write_Dgus(0x0008,0x5A00|area);//Norflash 0号区域
            while(Read_Dgus(0X0008)&0xFF00);    //等待数据库读写完成    
}
// ========================================================================
void  Flash_Write(u8 area,u16 lib_addr,u16 Dgus_addr,u16 len)//
{
          if(lib_addr%2)
                 lib_addr-=1;//奇数转成偶数
            if(Dgus_addr%2)
                Dgus_addr-=1;//奇数转成偶数
            Write_Dgus(0x000b,len);
            Write_Dgus(0x000a,Dgus_addr);
            Write_Dgus(0x0009,lib_addr);
            Write_Dgus(0x0008,0xA500|area);//Norflash 区域
            while(Read_Dgus(0X0008)&0xFF00);    //等待数据库读写完成        
}
//===================================    
u8 Compare_array(u16 *Array1,u16 *Array2,u8 len)//比较两个数组变量的值,相等返回1,Array1 >Array2 返回2,Array1 <Array2 返回3
{
        u8   i=0,j=0;
        for(i=0;i<len;i++) 
            {
               if(Array1[i]==Array2[i]) j++;                   //比较
                 if(Array1[i]>Array2[i])  return 2;       // Array1 >Array2 返回2
                 if(Array1[i]<Array2[i])  return 3;       // Array1 <Array2 返回3
            }            
      if(j==len)                                    //获取字符串长度
                 return  1;                            //返回 1
            else
                 return  0;                         //返回 0
}
/****************************************************************************
函数功能:基本图形绘图
参数说明:Dgus_addr基本图形地址,Type绘图类型,Count点数,Color颜色,Coor坐标点数组
******************************************************************************/
void draw_line(u16 Dgus_addr,u16 Type,u16 Count,u16 Color,u16 *Coor) //
{
      u16 Temp[100]={0};
        u8  i=0;
        Temp[0]=Type;              //
        Temp[1]=Count; 
        Temp[2]=Color; 
        for(i=0;i<Count*2+2;i++)
            Temp[3+i]=Coor[i];
        Temp[5+2*Count]=0xFF00;
        Write_Dgusii_Vp(Dgus_addr,(u8*)Temp,Count*2+6); 
}
/******************************************************************************/    
void lock_init()   
{    
          u16 Ladd=0,Va1=0,Va2=0,i=0;

Flash_Read(0,START_ADD(10),START_ADD(10),2);
            if(Read_Dgus(START_ADD(10))==INITIALIZATION_MARK)
            { 
                   
                    for(i=0;i<SAVE_NUMBER;i++)//掉电保存参数设置
                    {
                            Flash_Read(0,Power_Down_Save_Address[i],Power_Down_Save_Address[i],2);
                          Power_Down_Save_Data[i]= Read_Dgus(Power_Down_Save_Address[i]);
                        }
            }
            else   //第一次使用
            {
                   Write_Dgus(START_ADD(10),INITIALIZATION_MARK);
                 Flash_Write(0,START_ADD(10),START_ADD(10),2);
                   Write_Dgus(START_ADD(1936),1);     //清除数据库    
            for(i=0;i<SAVE_NUMBER;i++)//掉电保存参数设置
                    {
                            Flash_Write(0,Power_Down_Save_Address[i],Power_Down_Save_Address[i],2);
                        }                                
             }
       Write_Dgus(0x8007,LINE_ADJUST);     //划线粗细调节        
}
//=======================================
void     save_data()
{   
        u16 i=0,Va2=0;
            for(i=0;i<SAVE_NUMBER;i++)
            {
                    Va2= Read_Dgus(Power_Down_Save_Address[i]);//获取需要掉电保存得地址的值
                  if(Power_Down_Save_Data[i]!=Va2)          //掉电保存地址的值与原来值对比数值变化保存
                    {
                      Power_Down_Save_Data[i]=Va2;            //记录改变后的值
                        Flash_Write(0,Power_Down_Save_Address[i],Power_Down_Save_Address[i],2);//保存数据
                    }
            }    
}             
/******************************************************************************/      
void  get_tp_state()//获取页面 按压状态 当前坐标
{
    u8    Tp_temp[16]={0};
    Read_Dgusii_Vp(0x0014,(u8*)&Page_now,1); //读取当前页面
  Read_Dgusii_Vp(0x0016,Tp_temp,8);  //读取TP状态值
    Tp_state=Tp_temp[1];//当前按压状态
    Coord_x=(u16)(Tp_temp[2]<<8)+Tp_temp[3];//当前x坐标
  Coord_y=(u16)(Tp_temp[4]<<8)+Tp_temp[5];//当前y坐标
  Mapping_coor[Pass_word_count*2]=Coord_x;
    Mapping_coor[Pass_word_count*2+1]=Coord_y;        
    
}
/******************************************************************************/
u16 get_number()//获取按压键值
{  
       u16 i=0,j=0;
       if(Coord_x>=DATA_X1_START&&Coord_x<=DATA_X1_OVER)
             i=1;
         else if(Coord_x>=DATA_X2_START&&Coord_x<=DATA_X2_OVER)
       i=2;
         else if(Coord_x>=DATA_X3_START&&Coord_x<=DATA_X3_OVER)
             i=3;
         else
            return 0;
         if(Coord_y>=DATA_Y1_START&&Coord_y<=DATA_Y1_OVER)
             j=0;
        else if(Coord_y>=DATA_Y2_START&&Coord_y<=DATA_Y2_OVER) 
           j=1;
        else
             return 0;
        return j*3+i;
}
/******************************************************************************/
void set_pass_word()  //密码设定录入
{
     u16 Val=0,V1=0;
       if(Tp_state==ON_PRESS)  //按压中
         {
         Val=get_number(); //获取当前按键值
            
               if(Val)
                 {
                      Read_Dgusii_Vp(SET_LOCK_ADD(0)+Val-1,(u8*)&V1,1); 
                      if(V1==0)//按压位置无重复
                        {
                              Write_Dgus(SET_LOCK_ADD(0)+Val-1,1);
                              Mapping_coor[Pass_word_count*2]=DATA_NUM1_X+COOR_COLSSPCING*((Val-1)%3); //绘图坐标录入
                              Mapping_coor[Pass_word_count*2+1]=DATA_NUM1_Y+COOR_LINESPCING*((Val-1)/3);
                        Pass_word[Pass_word_count++]=Val;        //坐标密码记录                      
                          Pass_word_count%=PASSWORD_NUMBER+1;
                        }
                              Mapping_coor[Pass_word_count*2]=Coord_x;
                              Mapping_coor[Pass_word_count*2+1]=Coord_y;

}
               Tp_flag=1;       //按压标志置1
     }else if(Tp_state==UP_PRESS&&Tp_flag==1)//抬起
         {
            u8 i=0,j=0;
        if(Pass_word_count)  //有录入数据
                {                
                          page_change(3);
                    
                }else
              {            
                for(i=0;i<PASSWORD_NUMBER;i++) 
                Pass_word[i]=0;     //密码录入清零
                Pass_word_count=0;// 计数清零
        Write_Dgusii_Vp_byChar(SET_LOCK_ADD(0),(u8*)&Pass_word[0],PASSWORD_NUMBER<<1);        //密码设定录入清零                    
              }
                Tp_flag=0;
         }

}
/******************************************************************************/
void set_password_confirm()
{
       u16 Val=0;
     Read_Dgusii_Vp(SET_LOCK_BUTTON,(u8*)&Val,1); 
         if(Val==1)
         {   
               u8 i=0,j=0;
             Write_Dgusii_Vp_byChar(PASS_WORD_ADD(0),(u8*)&Pass_word[0],PASSWORD_NUMBER<<1); //密码存储
               page_change(0);
               Write_Dgus(SET_LOCK_BUTTON,0); //键值清零
               for(i=0;i<PASSWORD_NUMBER;i++) 
                Pass_word[i]=0;     //密码录入清零
                Pass_word_count=0;// 计数清零
        Write_Dgusii_Vp_byChar(SET_LOCK_ADD(0),(u8*)&Pass_word[0],PASSWORD_NUMBER<<1);        //密码设定录入清零                 
         }else if(Val==2)
         {
               u8 i=0,j=0;
             page_change(2);    
         Write_Dgus(SET_LOCK_BUTTON,0); //键值清零    
         for(i=0;i<PASSWORD_NUMBER;i++) 
                Pass_word[i]=0;     //密码录入清零
                Pass_word_count=0;// 计数清零
        Write_Dgusii_Vp_byChar(SET_LOCK_ADD(0),(u8*)&Pass_word[0],PASSWORD_NUMBER<<1);        //密码设定录入清零                              
         }

}
/******************************************************************************/
void drawing_figure()
{
        if(Pass_word_count)
                {                    
                draw_line(FUNDAMENTAL_FIGURE(0),0x0002,Pass_word_count,LINE_COLOR,Mapping_coor);
              Flagd=1;                    
                }else if(Flagd)
                {
                      draw_line(FUNDAMENTAL_FIGURE(0),0x0002,Pass_word_count,LINE_COLOR,Mapping_coor);
                    Flagd=0;    
                }
                        Write_Dgus(0x3000,Pass_word_count);
//          Write_Dgus(0x3001,Coord_x);    
//            Write_Dgus(0x3002,T_count_2);    
//                
}
/******************************************************************************/
void get_pass_word()//密码录入
{
     u16 Val=0,V1=0;
       if(Tp_state==ON_PRESS)  //按压中
         {
         Val=get_number(); //获取当前按键值
            
               if(Val)
                 {
                      Read_Dgusii_Vp(LOCK_ADD(0)+Val-1,(u8*)&V1,1); 
                      if(V1==0)//按压位置无重复
                        {
                              Write_Dgus(LOCK_ADD(0)+Val-1,1);
                              Mapping_coor[Pass_word_count*2]=DATA_NUM1_X+COOR_COLSSPCING*((Val-1)%3); //绘图坐标录入
                              Mapping_coor[Pass_word_count*2+1]=DATA_NUM1_Y+COOR_LINESPCING*((Val-1)/3);                        
                        Pass_word[Pass_word_count++]=Val; //坐标密码记录            
                              Write_Dgus(0x3000,Pass_word_count);
                          Pass_word_count%=PASSWORD_NUMBER+1;
                        }
            Mapping_coor[Pass_word_count*2]=Coord_x;
              Mapping_coor[Pass_word_count*2+1]=Coord_y;                        
                        if(Val==1)//计算第一个按键时间
                            Button_Down_1=1;
                        else
                            Button_Down_1=0;
                        if(Val==6)//计算第二个按键时间
                            Button_Down_2=1;
                        else
                            Button_Down_2=0;
                    
                 }
               Tp_flag=1;       //按压标志置1
     }else if(Tp_state==UP_PRESS&&Tp_flag==1)//抬起
         {
            u8 i=0,j=0;
              u16 Tempb[PASSWORD_NUMBER]={0};
        Read_Dgusii_Vp(PASS_WORD_ADD(0),(u8*)&Tempb[0],PASSWORD_NUMBER); //读取保存密码数据
           j=Compare_array(Pass_word,Tempb,PASSWORD_NUMBER);    //保存密码数据与录入数据比对
        if(j==1)  //密码正确
                {                
                 if(Page_now==0)    
                          page_change(2);
                }    
                for(i=0;i<PASSWORD_NUMBER;i++) 
                Pass_word[i]=0;     //密码录入清零
                Pass_word_count=0;// 计数清零
        Write_Dgusii_Vp_byChar(LOCK_ADD(0),(u8*)&Pass_word[0],PASSWORD_NUMBER<<1);        //密码录入清零        
                if(T_count_2>0)//按键解锁程序
                {
                     
                     if(T_count_1>=5000&&T_count_2>=5000)
                           page_change(1);
                     T_count_1=0;
                     T_count_2=0;
                }
            Tp_flag=0;
         }
}

/******************************************************************************/
void  screen_protection()  //屏保程序
{
              u16 Val=0;
          Read_Dgusii_Vp(0x0016,(u8*)&Val,1); //读取触摸状态
          if(Val&0xFF00)
                {
                number_one=30;                  
            number_two=10;
                      Write_Dgus(0x0082,0x6400);
                      Write_Dgus(0x0016,Val&0xFF);
                      T_number_0=1000;
                }
                 if(T_number_0==0) //一秒执行一次
               {                                    
                   if(number_one)  
             {
                            number_one--;Flagb=1;
                         }
                         else if(Flagb)
                         {
                               page_change(0);
                             Write_Dgus(0x0082,0x0000);      //息屏 自动休眠
                               Flagb=0;
                         }
                       if(number_two)  
             {
                            number_two--;Flagc=1;
                         }
                         else if(Flagc)
                         {                                 
                            Flagc=0;
                         }                                              
                       T_number_0=1000;//                定时器2延时1S                                     
               }

}
void  lock_all()
{
     if(T_NUMBER_1==0) //一秒执行一次
     {
         T_NUMBER_1=20;
     get_tp_state();//获取页面 按压状态 当前坐标
         if(Page_now==0)
         {
          get_pass_word();
         }
         else if(Page_now==1)
              set_pass_word();
         drawing_figure();//画图
         set_password_confirm();//密码保存确认
       screen_protection();//屏保
         save_data();//数据掉电保存
     }
}

1、迪文屏基于T5L_C51开发手势6宫格解锁相关推荐

  1. 22、T5L 迪文屏 C51开发之Hello World例程

    T5L 迪文屏 C51开发之Hello World例程 1.写在前面 2.例程功能简介 3.GUI界面设计 4.C51代码设计 1.写在前面   前面已经介绍了如何使用DGUS Tool软件来进行迪文 ...

  2. 分享:STM32与迪文屏交互,轻松实现一些简单的功能!

    最近,托朋友用STM32F103评估板和迪文屏做了交互(@田),没写多少代码,就实现了一些简单常用的功能,还是很简单的!今天跟大家分享一下: 一.评估板使用说明 1.功能 图1:整体效果图 图2:MC ...

  3. 一种迪文屏软件在线升级方法

    --来自迪文开发者论坛 开发自己的项目中遇到文件升级不方便的问题,因此设计了一个在线升级方案,可以有效解决如下问题: 1. 当产品已发出需要修复Bug时,无法在线修复. 2. 无法判断新老版本,当数据 ...

  4. STM32串口中断程序-迪文屏,

    STM32串口中断程序-迪文屏,串口接收准确数值 这几天一直在做原子开发板与迪文屏的通信,开发板向迪文屏写数据已经完成,但是从迪文屏读的数据总是无法返回开发板.原始及调试程序见下图: 在串口接收到从d ...

  5. 30、T5L 迪文屏 C51开发之 ADC模数转换

    T5L 迪文屏 C51开发之 ADC模数转换 1.介绍 2.例程功能介绍 3.GUI界面设计 4.C51程序设计 1.介绍   T5L 芯片内部的 ADC 模数转换外设,有一点需要注意的是此 ADC ...

  6. 【OKT507】迪文屏事件

    前言 本章介绍如何实现迪文屏与飞凌OKT507的uart事件通信. 代码 从上到下是uart_example.c.dwin.c.dwin.h.makefile #include "dwin. ...

  7. 基于canvas+uniapp的9宫格拼图游戏组件

    基于 canvas+uniapp 的 9 宫格拼图游戏 涉及到的 canvas 基础知识 创建画布 <canvas id="'c1'"></canvas> ...

  8. android 投屏开发框架,Android DLNA投屏-基于CyberGarage开发投屏功能

    在上一篇博客<Android DLNA投屏-基本原理>中,讲到了DLNA的一些基本原理.了解这些基本原理,对开发是很有帮助的.但仅仅依据原理去进行Android DLNA开发,是比较困难的 ...

  9. 【资料分享】迪文屏使用经验分享

    DIWEN 写在前面的话 我的屏幕 显示图片 SD卡 FLASH分配 举例工程 Diwen ico生成工具 使用经验总结 写在前面的话 以下内容是本人在观看迪文科技在哔哩哔哩的教学视频所做的笔记 几乎 ...

最新文章

  1. 计算机internet服务,计算机基础与应用——04Internet上的信息服务.ppt
  2. 廖雪峰python教程视频-为什么看不懂廖雪峰的Python学习教程?
  3. 04-JDBC学习手册:JDBC中使用transaction(事务)编程和Javabean定义
  4. C++——构造和析构函数
  5. Hadoop:简单介绍
  6. NOIP2014 uoj20解方程 数论(同余)
  7. 如何查询日志文件中的所有ip,正则表达式
  8. DistributionDB过大的原因
  9. 基于Tensorflow + Opencv 实现CNN自定义图像分类
  10. 电脑cpu和手机cpu的差距有多大?
  11. 002 Ajax中传输格式为HTML
  12. 关于单细胞批次矫正那些事(二) KBET 用于单细胞批次矫正结果的评估
  13. mysql行级锁 select for update
  14. 苹果爸爸发飙,封杀 React Native?
  15. 不知道这些,你的世界杯就白看了!
  16. 【第六课】Smart 3d常见问题集锦
  17. WORD宏VBA:标题应用样式+图表统一应用格式且居中
  18. 微信小程序 input输入事件
  19. java 定义泛型方法_Java中泛型方法的定义
  20. 【小月电子】ALTERA FPGA开发板系统学习教程-LESSON9简易测试系统

热门文章

  1. 动力节点—2020最新Spring教程笔记(上)
  2. 特征选择与稀疏学习。
  3. Centos7.3安装elasticsearch head插件
  4. html5游戏一笔画,一笔画得完游戏-一笔画得完官方版预约v1.0-游迅网
  5. Web性能测试模型小结
  6. 射击训练模拟设备有哪些?室内靶场使用设备介绍
  7. 中小学学生要学习编程吗?应该学习什么?
  8. 手游《奔跑吧?骚年!》技术分享(一):开篇
  9. 无线控制服务器是什么,什么是LED路灯无线物联网系统
  10. 使用强化学习建立下一个最佳活动(或称行动营销)模型【译文初稿】