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