迪文科技论坛

 找回密码
 立即注册
搜索
123
返回列表 发新帖
楼主: LBS

【提问】密码登录-我想要密码输入时,文本显示控件是*

[复制链接]

4

主题

45

回帖

233

积分

中级会员

Rank: 3Rank: 3

积分
233
 楼主| 发表于 2024-10-23 13:31:17 | 显示全部楼层
LBS 发表于 2024-10-23 13:30
您好,还有个小疑问,我在描述一个使用场景,就是我现在实现的只是一个界面的密码登陆,也就是点击一个菜 ...

代码贴在这里啦,大概逻辑就这样,后续还有修改很多

#include "sys.h"

int main()
{
    u8 Variable_Addr[24]={0};                           //traditional rules ,not rule C99 (传统的用法必须在一个代码块的开始处声明变量,不能像C99那样)
    u8 Key_Addr[4]={0};
    u8 i=0;                          //
    u8 Switch_Page[4]={0x5a,0x01,0x00,0x00}; //页面切换07密码正确页面 02错误页面
    u8 Vp_Clear[24]={0};//清空密码改写框1、2和重建密码按键返回按键
    u8 Supervisor_Password[8]={0x57,0x61,0x73,0x79,0x32,0x35,0x30,0x31};//=Wasy2501  赋值超级密码
    u8 Read_Flash[8]={0x5a,0x00,0x10,0x08,0x10,0x08,0x00,0x04};    //数据库读操作
    u8 Write_Flash[8]={0xa5,0x00,0x10,0x08,0x50,0x0A,0x00,0x04};   //数据库写操作
    u8 RW_Flash_Flag[2]={0};  
    u8 RW_Flash_Value[8]={0};
   
    sys_init();
// *************密码登录***********************   
   sys_read_vp(0x5100,Key_Addr,2);        //读密码框是否为0,如果为0,
    if((Key_Addr[0]==0)&&(Key_Addr[1]==01))
{
    sys_read_vp(0x5002,Variable_Addr,4);
    for (i=0;i<8;i++)
    {
        if(Variable_Addr==0) //
        {
        }
        else                                //
        {         
             sys_write_vp(0x0008,Read_Flash,4);        //读5a a5 0b 82 0008 5a00 1008 1008 0002 读数据库参考应用文档系统变量接口表格。
            sys_read_vp(0x1008,RW_Flash_Value,4);
                        do
            {
            sys_read_vp(0x0008,RW_Flash_Flag,1); //将0x0008里的值读到RW_Flash_Flag,看CPU有没有清零
            }
            while(RW_Flash_Flag[0]==0x5A); //判断falsh操作是否完成 如果是5A说明没有操作完成,就等完成之后再进行后面的

                 if (tests(Variable_Addr,RW_Flash_Value,8)==0)
                 {
                  Switch_Page[3]=3;
                 sys_write_vp(0x0084,Switch_Page,2);                       
                 sys_write_vp(0x5002,Vp_Clear,4); //  清空密登录框4个地址就行
         sys_write_vp(0x5100,Vp_Clear,1); //  清空按键值
                 }
                  else                                //先比较是否为万能密码Wasy2501
                 {
                      if (tests(Variable_Addr,Supervisor_Password,8)==0)
                      {
                       Switch_Page[3]=3;
                      sys_write_vp(0x0084,Switch_Page,2);                       
                      sys_write_vp(0x5002,Vp_Clear,4); //  清空密登录框4个地址就行
              sys_write_vp(0x5100,Vp_Clear,1); //  清空按键值
                      }
                      else
                      {
                      Switch_Page[3]=8;
                      sys_write_vp(0x0084,Switch_Page,2);                       
                      sys_write_vp(0x5002,Vp_Clear,4); //  清空密登录框4个地址就行
              sys_write_vp(0x5100,Vp_Clear,1); //  清空按键值
                      }
                 }
        }               
    }
}
// *************密码改写***********************  
    sys_read_vp(0x5012,Variable_Addr,2);        //读重建密码按钮是否按下如果按下了,说明进行了密码改写操作,
        if((Variable_Addr[0]==0)&&(Variable_Addr[1]==0x01))// 键值为0001
        {
            sys_read_vp(0x5006,Variable_Addr,12);        //读旧密码框 输入密码框1、2 两个长整数地址12个字,是否为0,如果为0不执行
            for (i=0;i<24;i++)
            {
                if(Variable_Addr==0) //
                {  
                 sys_write_vp(0x5012,Vp_Clear,2);   // 清空按键值 ,为啥是2,后面试着给1试试
                }
                else   
                {
                    if (tests(Variable_Addr,Supervisor_Password,8)==0)
            {
                    if (tests(Variable_Addr+8,Variable_Addr+16,8)==0) //比较密码改写框1、2是否相等,相等将密码保存到数据库,并跳转提示页面
                    {
                       sys_write_vp(0x0008,Write_Flash,4);        //写5a a5 0b 82 0008 a5 00 1008 1002 0004  
                       do
                       {
                       sys_read_vp(0x0008,RW_Flash_Flag,1);
                       }
                       while(RW_Flash_Flag[0]==0xa5);
                       
                       Switch_Page[3]=1;
                       sys_write_vp(0x0084,Switch_Page,2);                       
                      sys_write_vp(0x5006,Vp_Clear,12); //  清空密登录框 即5006H-5011H 12个字
              sys_write_vp(0x5012,Vp_Clear,2); //  清空按键值
                       break;
                    }
              else        //比较密码改写框1、2是否相等,不相等跳转提示页面
                    {
                         Switch_Page[3]=8;
                       sys_write_vp(0x0084,Switch_Page,2);                       
                      sys_write_vp(0x5006,Vp_Clear,12); //  清空密登录框 即5006H-5011H 12个字
              sys_write_vp(0x5012,Vp_Clear,2); //  清空按键值
                    }
}
                    else        //旧密码不对跳转提示页面
                    {
                         Switch_Page[3]=8;
                       sys_write_vp(0x0084,Switch_Page,2);                       
                      sys_write_vp(0x5006,Vp_Clear,12); //  清空密登录框 即5006H-5011H 12个字
              sys_write_vp(0x5012,Vp_Clear,2); //  清空按键值
                    }
                }
            }        
        }

    return 0;
}


int tests(u8* buf,u8* buf1,u8 len)
{
    u8 i=0;
    for(i=0;i<len;i++)
    {
        if(buf!=buf1[1])
            {
        return 1;
}
    }
return 0;
}
回复

使用道具 举报

4

主题

45

回帖

233

积分

中级会员

Rank: 3Rank: 3

积分
233
 楼主| 发表于 2024-10-23 14:09:01 | 显示全部楼层
LBS 发表于 2024-10-23 13:31
代码贴在这里啦,大概逻辑就这样,后续还有修改很多

#include "sys.h"

还有一个问题是昨天的问题发送*代码密码的问题,密码录入控件我使用了5002H,也就是判断密码使用5002H里的值就行,显示文本我使用5700H来接收*,我在上面贴的代码中改了一下,发现可以实现了,但是仍有小瑕疵,下面我详细描述下代码细节和问题:
就是密码登陆 判断这里来举例:可能代码逻辑和上面贴的有点出入,但是差不多
我先读然后用for循环去挨个遍历
sys_read_vp(0x5002H,Variable_Addr,15);//Variable_Addr是我的buf,我密码最多30个字节
for(i=0;i<30;i++)
{
    if((variable_addr!=0x00)&&(variable_addr!=0xFF));//这里是判断不等于空或者不等于结束标识符,不懂能不能这么写,还是只需要判断不等于空就行
    {
    //部分代码忽略不写,反正就是读取数据然后判断操作有没有完成
    if(判断键值等不等0x0001) //这里我判断键值也就是登陆键有没有按下 按下则开始比较判断输入的密码
    {
          if(判断密码)
            {
                   切换界面;
                   清除密码框;
                   清除键值;
              }
        else{ 切换到错误界面}  //到这里一切正常,有问题的在后面
    }

   else{    //问题出现在这个else 框框里是这么写的, 这里我要判断输入的到底我是输入abc三位密码,还是abcd1234 的8位数密码
          for(j=0;j<i)
         {
                 buf1[j]=0x2A;//buf1是我用来存放2A也就是*号,一会要把buf写进5700H地址
           }
          if(i%2==0)//这里的目的是想判断输入的密码字节是偶数还是奇数,不懂能不能这样
         {
                sys_write_vp(0x5700,buf1,i/2);//是偶数我就存放i/2,这里直接拿i来判断是因为上面的for循环中遇到结束标识符0xFF了我才跳到这else里来,那么此时的i不就是正好等于 5002H地址里输入的密码的字节数嘛
          }
         else{
                buf1=0xFF; //如果是奇数,存放0xFF
               sys_write_vp(0x5700,buf1,i-1);  

          break;//跳出循环  
}
}
//下载到屏幕中判断的时候,发现录入后点击enter再文本显示控件上显示了*,大体上能实现了这个功能,但是发现当输入后不点击登录按键,重新点击文本录入控件,再输入密码点击键盘上的enter后发现比如前面输入2个密码再输入三个密码时显示***,但是如果再输入密码是10个时也能显示10个*,但反过来,输入一位数密码*,却不能显示一个*,次数仍然是10个*,也就是没有把前面的*覆盖掉,挺奇怪的。也不懂这么问这么描述行不行哈哈,反正这两天就头疼这个
回复

使用道具 举报

37

主题

146

回帖

1305

积分

金牌会员

Rank: 6Rank: 6

积分
1305
发表于 2024-10-23 15:43:07 | 显示全部楼层
LBS 发表于 2024-10-23 13:30
您好,还有个小疑问,我在描述一个使用场景,就是我现在实现的只是一个界面的密码登陆,也就是点击一个菜 ...

性能应该不会多慢,程序执行没这么慢,基本是可以满足你的需求的
Github搬运工
回复

使用道具 举报

37

主题

146

回帖

1305

积分

金牌会员

Rank: 6Rank: 6

积分
1305
发表于 2024-10-23 15:50:03 | 显示全部楼层
LBS 发表于 2024-10-23 14:09
还有一个问题是昨天的问题发送*代码密码的问题,密码录入控件我使用了5002H,也就是判断密码使用5002H里 ...

大致明白你说的意思了,意思就是密码从少位到多位输入的时候显示的*没问题
但是从多位到少位输入的时候就有问题了,没理解错应该是这样的
那你就在往0x5700写buf1之前清除一次0x5700后最大的字节数,比如你密码最大10字节,那就是5个字

unsigned char Buf_Clean[10] = {0};//提前定义清除函数
sys_write_vp(0x5700,Buf_Clean,5);//先将0x5700地址清除
sys_write_vp(0x5700,buf1,i/2);//再写入对应的*个数
Github搬运工
回复

使用道具 举报

4

主题

45

回帖

233

积分

中级会员

Rank: 3Rank: 3

积分
233
 楼主| 发表于 2024-10-23 16:30:25 | 显示全部楼层
赵雄帅 发表于 2024-10-23 15:50
大致明白你说的意思了,意思就是密码从少位到多位输入的时候显示的*没问题
但是从多位到少位输入的时候就 ...

好滴好滴,确实可以了,灰常感谢哈哈哈
回复

使用道具 举报

4

主题

45

回帖

233

积分

中级会员

Rank: 3Rank: 3

积分
233
 楼主| 发表于 2024-10-23 16:33:05 | 显示全部楼层
赵雄帅 发表于 2024-10-23 15:43
性能应该不会多慢,程序执行没这么慢,基本是可以满足你的需求的

好的,感谢您的耐心解答
回复

使用道具 举报

4

主题

45

回帖

233

积分

中级会员

Rank: 3Rank: 3

积分
233
 楼主| 发表于 前天 16:23 | 显示全部楼层
赵雄帅 发表于 2024-10-23 15:50
大致明白你说的意思了,意思就是密码从少位到多位输入的时候显示的*没问题
但是从多位到少位输入的时候就 ...

你好老哥,还在吗,描述一下,这个密码输入后显示*的问题,我在密码框录入数据后,我在login没有按下,也就是登陆键没有按下时,会读取录入密码存放的地址比如0x5000,这时候会将0x5000已经录入数据读看看有多少位,然后我就用for循环 给显示框0x6000发送0x2A,0x2A是代表ascii的*,有多少位发送多少,现在的问题是能够实现基本的功能,问题是:比如我在输入1个密码时显示一个*,我输入8个密码时显示8个*,我能肉眼的看到那个显示框从1个*变为8个*,或者8个*变为1个*的残影,也就是它在变化的同时能够察觉到它在变化,我不想要这种肉眼能够看到的改变过程,我想要8个*你就给我马上显示8个*,不想要肉眼能看到的过程,不知道这样说你是否理解? 就是大体能够实现,但是效果一般的感觉,如果您有啥见解希望回答一些啊哈哈
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 19:43 , Processed in 0.066946 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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