密码登录与改写是人机界面非常常见的一个功能,本文将功能利用屏上面独立实现,节省了单片机不必要的代码,另外保存密码也是占用的屏独立的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