迪文DGUS2利用屏的C编译器实现密码登录与改写功能


迪文DGUS2利用屏的C编译器实现密码登录与改写功能_第1张图片
迪文DGUS2利用屏的C编译器实现密码登录与改写功能_第2张图片
密码登录与改写是人机界面非常常见的一个功能,本文将功能利用屏上面独立实现,节省了单片机不必要的代码,另外保存密码也是占用的屏独立的flash存储区域,DGUS2是可以支持C语言编程的,本文给大家分享下,顺便也是做一个支持C编程的DGUS2软件的参考例子借鉴吧。
https://pan.baidu.com/s/1kqtnumJJpFgYLxT6zLaKYQ
原demo和C编译器软件下载链接

   /*
    软件版本:DWIN C Compiler 1.1.0.4
    程序功能:T5DGUSos的C编译器入门学习参考系列例程1-密码登录与改写
    更新时间:2018年11月01日 
    DGUS变量地址分配:
    地址1000-1001H密码登录框
    地址1002-1003H密码改写框1
    地址1004-1005H密码改写框2
    地址1006-1006H重建密码按键返回
    地址1008-1009地址进行将数据库存放的密码的读出来在屏上面参与比较。
    */
    int main()
    {
        char Variable_Addr[8]={0};			   //traditional rules ,not rule C99 (传统的用法必须在一个代码块的开始处声明变量,不能像C99那样)
        char i=0;                          //
        char Switch_Page[4]={0x5a,0x01,0x00,0x00}; //页面切换07密码正确页面 02错误页面 
        char Vp_Clear[10]={0};//清空密码改写框1、2和重建密码按键返回按键
        char Supervisor_Password[4]={0x00,0x02,0x2c,0xc8};//142536=00 02 2c c8  赋值超级密码
        char Read_Flash[8]={0x5a,0x00,0x10,0x08,0x10,0x08,0x00,0x02};    //数据库读操作
        char Write_Flash[8]={0xa5,0x00,0x10,0x08,0x10,0x02,0x00,0x02};   //数据库写操作
        char RW_Flash_Flag[2]={0};  
        char RW_Flash_Value[4]={0};
       // char Change_Password_Button[4]={0};
     // *************密码登录***********************    
        read_dgus_vp(0x1000,Variable_Addr,2);	//读密码框是否为0,如果为0,
        for (i=0;i<4;i++)
        {
            if(Variable_Addr[i]==0) //
            {
            }
            else                                //
            {	 
                write_dgus_vp(0x0008,Read_Flash,4);	//读5a a5 0b 82 0008 5a00 1008 1008 0002
                read_dgus_vp(0x1008,RW_Flash_Value,2);
    			do
                {
                read_dgus_vp(0x0008,RW_Flash_Flag,1);
            }
            while(RW_Flash_Flag[0]==0x5A); 

                 if (tests(Variable_Addr,RW_Flash_Value,4)==0)
                 {
                  Switch_Page[3]=7;
                  write_dgus_vp(0x0084,Switch_Page,2);			
                  write_dgus_vp(0x1000,Vp_Clear,2);
                 }
                  else                                //先比较是否为万能密码142536=00 02 2c c8
                 {
                      if (tests(Variable_Addr,Supervisor_Password,4)==0)
                      {
                       Switch_Page[3]=7;
                       write_dgus_vp(0x0084,Switch_Page,2);			
                       write_dgus_vp(0x1000,Vp_Clear,2);
                      }
                      else
                      {
                       Switch_Page[3]=2;
                       write_dgus_vp(0x0084,Switch_Page,2);			
                       write_dgus_vp(0x1000,Vp_Clear,2);
                      }
                 }
        }		
    }
 // *************密码改写***********************  
    read_dgus_vp(0x1006,Variable_Addr,2);	//读重建密码按钮是否按下如果按下了,说明进行了密码改写操作,
        if((Variable_Addr[0]==0)&&(Variable_Addr[1]==0x5a))//
        {
            read_dgus_vp(0x1002,Variable_Addr,4);	//读输入密码框1、2是否为0,如果为0不执行
            for (i=0;i<8;i++)
            {
                if(Variable_Addr[i]==0) //
                {  
                 write_dgus_vp(0x1006,Vp_Clear,2);   // 清空按键值
                }
                else   
                {
                    if (tests(Variable_Addr,Variable_Addr+4,4)==0) //比较密码改写框1、2是否相等,相等将密码保存到数据库,并跳转提示页面6
                    {
                       write_dgus_vp(0x0008,Write_Flash,4);	//写5a a5 0b 82 0008 a5 00 1008 1002 0002
                       do
                       {
                       read_dgus_vp(0x0008,RW_Flash_Flag,2);
                       }
                       while(RW_Flash_Flag[0]==0xa5); 
                       
                       Switch_Page[3]=6;
                       write_dgus_vp(0x0084,Switch_Page,2);	
                       write_dgus_vp(0x1002,Vp_Clear,5);	
                       break;
                    }
                    else        //比较密码改写框1、2是否相等,不相等跳转提示页面6
                    {
                       Switch_Page[3]=5;
                       write_dgus_vp(0x0084,Switch_Page,2);	
                       write_dgus_vp(0x1002,Vp_Clear,5);
                    }
                }
            }        
        }

    return 0;
}

// *******************************************


void Time0_IRQHandler(void)  //定时器0 函数体
{
}
void Time1_IRQHandler(void) //定时器1 函数体
{
}
void Time2_IRQHandler(void) //定时器2 函数体
{
}

经过测试摸索,第一步是要将0.和1.lib库文件下载,然后在用c编译器,和OS汇编相比效率至少可以提高很多,对于有些极端的项目设计到复杂计算的,使用C语言会方便很多,但是目前行数限制大概1000-1400行,所以有些复杂多的项目用C可能不够写,只适合实现中小型的功能。
迪文C编译的难度同样还是在于对DGUS系统变量接口地址定义的理解,比如数据库操作的时候,需要判断读写标志是否清空,页面切换的地址,尤其是不要和DGUS1的混为一起用,有一个新手最容易犯错误的地方是DGUS屏的按键返回,当屏的按键按下之后,这个地址里面的值会一直在的,所以通常os里面如果有判断按键按下的动作,在程序执行完之后,是需要依照自己的需要将按键键值清空,不然会一直执行按键按下之后的程序。

特别补充说明,这个迪文c编译器仅仅适用于迪文t5和T5L

此外T5L系列的DGUS 还可以支持80c51的真正意义上面的通用keil软件编写的c

你可能感兴趣的:(DGUS串口屏,迪文)