1、迪文屏基于T5L

1、迪文屏基于T5L,第1张

演示视频

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 {
        u8   i=0,j=0;
        for(i=0;i             {
               if(Array1[i]==Array2[i]) j++;                   //比较
                 if(Array1[i]>Array2[i])  return 2;       // Array1 >Array2 返回2
                 if(Array1[i]             }            
      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             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                     {
                            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                     {
                            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             {
                    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                 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                 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                 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                 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();//数据掉电保存
     }
}
 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1320314.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-11
下一篇 2022-06-11

发表评论

登录后才能评论

评论列表(0条)

保存