迪文DGUS2利用屏的C編譯器實現密碼登錄與改寫功能

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
密碼登錄與改寫是人機界面非常常見的一個功能,本文將功能利用屏上面獨立實現,節省了單片機不必要的代碼,另外保存密碼也是佔用的屏獨立的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章