演示视频
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[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_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_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_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_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();//数据掉电保存
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)