迪文科技论坛

 找回密码
 立即注册
搜索
查看: 9130|回复: 10

【分享】c51 对Dgus 变量读写程序的比较与选择

[复制链接]

11

主题

79

回帖

636

积分

高级会员

Rank: 4

积分
636
发表于 2021-1-25 14:40:15 | 显示全部楼层 |阅读模式
                          迪文屏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 执行跳转,结果就是跳转无效。
第二种写法灵活一些。代码短些。












湖南迪弘科技有限公司
联系人:文彧15576128088
地址:迪文湖南科技园 5栋7楼
回复

使用道具 举报

45

主题

254

回帖

3409

积分

论坛元老

Rank: 8Rank: 8

积分
3409
发表于 2021-4-17 11:42:37 | 显示全部楼层
如果刚写好0X5A01还未写好页面的时候GUI判断到0x5A01 执行跳转,结果就是跳转无效,这种情况不会发生,左核和右边核心对vp是抢占占有,左核写读vp的时候,右边核心是等待的.你可以在读写函数中加延时测试观察右核gui暂停的现象.
回复

使用道具 举报

11

主题

79

回帖

636

积分

高级会员

Rank: 4

积分
636
 楼主| 发表于 2021-4-19 06:37:50 | 显示全部楼层
舞指飞扬 发表于 2021-4-17 11:42
如果刚写好0X5A01还未写好页面的时候GUI判断到0x5A01 执行跳转,结果就是跳转无效,这种情况不会发生,左核和 ...

for 循环中每写一个字后都释放了控制权。
湖南迪弘科技有限公司
联系人:文彧15576128088
地址:迪文湖南科技园 5栋7楼
回复

使用道具 举报

0

主题

4

回帖

77

积分

注册会员

Rank: 2

积分
77
发表于 2021-6-20 17:56:39 | 显示全部楼层
在Write_Dgus函数里:
RAMMODE = 0xAF;while(!APP_ACK);
对RAMMODE参数应该赋值0x8F
回复

使用道具 举报

0

主题

4

回帖

77

积分

注册会员

Rank: 2

积分
77
发表于 2021-6-20 17:58:23 | 显示全部楼层
两种函数的区别是一次读写单个还是多个
回复

使用道具 举报

3

主题

5

回帖

88

积分

注册会员

Rank: 2

积分
88
发表于 2021-7-15 09:33:16 | 显示全部楼层
有没有具体的列程?可以发个出来看看
回复

使用道具 举报

2

主题

1228

回帖

9353

积分

论坛元老

Rank: 8Rank: 8

积分
9353
发表于 2021-7-15 10:16:32 | 显示全部楼层
dongnz33 发表于 2021-7-15 09:33
有没有具体的列程?可以发个出来看看

这个列程就是用第二种写法实现读写的变量地址。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

1

主题

15

回帖

585

积分

高级会员

Rank: 4

积分
585
发表于 2021-8-12 11:39:49 | 显示全部楼层
void read_dgus_vp(u16 addr, u8 *buf, u16 len);
void write_dgus_vp(u16 addr, u8 *buf, u16 len);
可以一次性写一段数据到寄存器,不需要手动while()
回复

使用道具 举报

15

主题

155

回帖

3480

积分

论坛元老

Rank: 8Rank: 8

积分
3480
发表于 2021-11-26 20:01:42 | 显示全部楼层
第2种 的 写:  先读,再写,

第1种的写: 没有读,就写多个数据,

到底有没有准确的写 子程序?

回复

使用道具 举报

0

主题

1276

回帖

5288

积分

论坛元老

Rank: 8Rank: 8

积分
5288
发表于 2021-11-26 20:11:32 | 显示全部楼层
hzpyl 发表于 2021-11-26 20:01
第2种 的 写:  先读,再写,

第1种的写: 没有读,就写多个数据,

用第二种函数, 或者下面这个帖子附件里面的函数。
http://inforum.dwin.com.cn:20080 ... 3%E5%87%BD%E6%95%B0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-22 08:02 , Processed in 0.069052 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表