|
迪文屏T5L系列开放c后, c51 对Dgus 变量读写源码的封装中有2个版本。
第一种(熊家余):void sys_write_vp(u16 addr,u8* buf,u16 len)
void sys_read_vp(u16 addr,u8* buf,u16 len)
void sys_read_vp(u16 addr,u8* buf,u16 len)
{
u8 i;
i = (u8)(addr&0x01);
addr >>= 1;
ADR_H = 0x00;
ADR_M = (u8)(addr>>8);
ADR_L = (u8)addr;
ADR_INC = 0x01;
RAMMODE = 0xAF;
while(APP_ACK==0);
while(len>0)
{
APP_EN=1;
while(APP_EN==1);
if((i==0)&&(len>0))
{
*buf++ = DATA3;
*buf++ = DATA2;
i = 1;
len--;
}
if((i==1)&&(len>0))
{
*buf++ = DATA1;
*buf++ = DATA0;
i = 0;
len--;
}
}
RAMMODE = 0x00;
}
//写DGUS中的VP变量数据
//addr:就是直接传入DGUS中的地址
//buf:缓冲区
//len:被发送数据的字数,一个字等于2个字节
void sys_write_vp(u16 addr,u8* buf,u16 len)
{
u8 i;
i = (u8)(addr&0x01);
addr >>= 1;
ADR_H = 0x00;
ADR_M = (u8)(addr>>8);
ADR_L = (u8)addr;
ADR_INC = 0x01;
RAMMODE = 0x8F;
while(APP_ACK==0);
if(i && len>0)
{
RAMMODE = 0x83;
DATA1 = *buf++;
DATA0 = *buf++;
APP_EN = 1;
len--;
}
RAMMODE = 0x8F;
while(len>=2)
{
DATA3 = *buf++;
DATA2 = *buf++;
DATA1 = *buf++;
DATA0 = *buf++;
APP_EN = 1;
len -= 2;
}
if(len)
{
RAMMODE = 0x8C;
DATA3 = *buf++;
DATA2 = *buf++;
APP_EN = 1;
}
RAMMODE = 0x00;
}
第二种(夫子):void Write_Dgus(u16 Dgus_Addr,u16 Val)
u16 Read_Dgus(u16 Dgus_Addr)
//===========================
u16 Read_Dgus(u16 Dgus_Addr)
{ u16 R_Dgus=0;
EA = 0;ADR_H = 0x00;
ADR_M = (u8)((Dgus_Addr/2)>>8);
ADR_L = (u8)(Dgus_Addr/2);
RAMMODE = 0xAF; while(!APP_ACK); //读操作
APP_EN = 1; while(APP_EN);
if(Dgus_Addr%2) R_Dgus = (DATA1<<8)+DATA0;
else R_Dgus=(DATA3<<8)+DATA2;
RAMMODE = 0; EA = 1; return R_Dgus;
}
//=================================
void Write_Dgus(u16 Dgus_Addr,u16 Val)
{ EA = 0;ADR_H = 0x00;
ADR_M = (u8)((Dgus_Addr/2)>>8);
ADR_L = (u8)(Dgus_Addr/2);
RAMMODE = 0xAF;while(!APP_ACK); //读操作
APP_EN = 1;while(APP_EN);RAMMODE = 0;
ADR_M = (u8)((Dgus_Addr/2)>>8);
ADR_L = (u8)(Dgus_Addr/2);
RAMMODE = 0x8F;while(!APP_ACK); //写操作
if(Dgus_Addr%2){DATA1=(u8)(Val>>8);DATA0=(u8)(Val);}
else {DATA3=(u8)(Val>>8);DATA2=(u8)(Val);}
APP_EN = 1; while(APP_EN);RAMMODE = 0;
EA = 1;
}
下面以切换页面为例比较一下
第一种: 把页面切换到10页
u8 Go_Page[]={0x5a,0x01,0x00,0x0A};
sys_write_vp(0X0084,(u8*)Go_Page,2);
第二种: 把页面切换到10页
Write_Dgus(0x0085,0x000A);
Write_Dgus(0x0084,0x5A01);
第一种写法隐含一个漏洞,先写的标志0x5A01 再写的页面号,页面切换是GUI核完成的,如果刚写好0X5A01还未写好页面的时候GUI判断到0x5A01 执行跳转,结果就是跳转无效。
第二种写法灵活一些。代码短些。
|
|