[家电应用] SH79F1616 LCD驱动 LCDRAM配置问题

[复制链接]
3260|14
 楼主| liguohong327 发表于 2015-8-26 22:07 | 显示全部楼层 |阅读模式
之前用SH79F166A 驱动LCD时使用的SEG脚都用连续的 如SEG1 SEG2 SEG3.......SEG19
定义LCD RAM    unsigned char xdata Lcd_RAM[LCD_RAM_LEN] _at_ 0x01e0 ;
最近采用了SH79F1616驱动LCD时发现SEG脚是不连续的,如SEG1 SEG2 SEG3 SEG4 SEG5  SEG9 SEG10 SGE14 SEG15 SEG19
请教像这种不连续的我需要怎么定义
ayb_ice 发表于 2015-8-27 08:28 | 显示全部楼层
每个LCD的RAM的地址是固定的,有相对应的一个SEG而已
 楼主| liguohong327 发表于 2015-8-27 08:53 | 显示全部楼层
比如我用了1 2 3 4 5 9 10 14 15   我可不可以按如下定义啊,

unsigned char xdata Lcd_RAM[9]={ 0x01e0 ,0x01e1,0x01e2,0x01e3,0x01e4,0x01e8,0x01e9,0x01ed,0x01ee};
 楼主| liguohong327 发表于 2015-8-27 09:37 | 显示全部楼层
试了用上面这种方法不行, 不知道怎么搞了, 有坛友碰到过这样的问题吗
黑夜之狼 发表于 2015-8-27 13:19 | 显示全部楼层
往哪里显示,指针就往哪里指
 楼主| liguohong327 发表于 2015-8-27 16:00 | 显示全部楼层
黑夜之狼 发表于 2015-8-27 13:19
往哪里显示,指针就往哪里指

我目前是这样做的  SH79F1616 SEG5过了就是SEG9     IC的SEG5我接在LCD的SEG5上 IC的SEG9接在LCD的SEG6上
void display_num3(unsigned char dat)
{
        unsigned char tmp;
        tmp = g_LCD_DispyNum[dat];

        Lcd_RAM[4] = (tmp>>4);
        Lcd_RAM[8] = tmp&0x0f;

}

如我要在这一位上显示3 就调用display_num3(3);

因为其它也有不是连续的,所以我如果要用到显示四个8的话 我就列出了四组函数
不知道有没有更好的方法
wuxing1106 发表于 2015-8-27 18:59 | 显示全部楼层
楼主你要仔细看一下规格书,166a的LCDRAM地址是以COM为基准的,1616的LCDRAM地址是以SEG为基准的。注意到这一点之后就不存在你所说的问题了
 楼主| liguohong327 发表于 2015-8-27 20:26 来自手机 | 显示全部楼层
我刚认真看了一下,两芯片是一样的呢
pang7 发表于 2015-8-27 21:46 | 显示全部楼层
不连续的 你不理他就好了 放那里空着就好了 操作那些有效地址即可
wuxing1106 发表于 2015-8-28 08:59 | 显示全部楼层
liguohong327 发表于 2015-8-27 20:26
我刚认真看了一下,两芯片是一样的呢

不好意思看错了,都是以SEG为基准的,这样就更好解决了,你把数组定义到对应地址后,没有的SEG不去操作它就可以了呀。
以1/4 Duty为例,如下定一个数组
      unsigned char xdata Lcd_RAM[19] _at_ 0x01e0 ;
操作SEG1对应的数据时,Lcd_RAM[0]=0x0F;
操作SEG5对应的数据时,Lcd_RAM[4]=0x0F;
操作SEG9对应的数据时,Lcd_RAM[8]=0x0F;
ayb_ice 发表于 2015-8-28 15:15 | 显示全部楼层
本帖最后由 ayb_ice 于 2015-8-28 15:22 编辑
liguohong327 发表于 2015-8-27 08:53
比如我用了1 2 3 4 5 9 10 14 15   我可不可以按如下定义啊,

unsigned char xdata Lcd_RAM[9]={ 0x01e0 , ...

/*

你那是初始化RAM而已,里面的数据是RAM的地址而已,没有意义
假设LCDRAM的首地址是XARM的0x01e0,那么可以如下定义

#define LCD_RAM        ((volatile unsigned char xdata*)0x01e0)

就可以这样使用了
        LCD_RAM[0] = 0x00,        // SEG0不显示
        LCD_RAM[1] = 0xff,        // SEG1显示

注意不要越界


一般是开设缓冲区,最后再显示,可以这样

unsigned char lcd_ram[40];                // 与LCD_RAM一一对应

        // 初始化
        for(char i = 0; i <sizeof(lcd_ram); i++){
                lcd_ram
【i】 = 0xff;
        }
        
        // 最后显示
        for(char i = 0; i <sizeof(lcd_ram); i++){
                LCD_RAM【i】 = lcd_ram
【i】;
        }
*/

黑夜之狼 发表于 2015-8-29 10:08 | 显示全部楼层
liguohong327 发表于 2015-8-27 16:00
我目前是这样做的  SH79F1616 SEG5过了就是SEG9     IC的SEG5我接在LCD的SEG5上 IC的SEG9接在LCD的SEG6上 ...

这个不好说,看你C语言功底了
QQ178960471 发表于 2016-4-7 22:41 | 显示全部楼层
不晓得,没遇到过
qiangweii 发表于 2016-4-9 18:04 | 显示全部楼层
  IC的SEG5不知道应该如何处理呢??
gradyhuang 发表于 2016-7-19 15:48 | 显示全部楼层
赛元芯片,除开电源脚和地任意IO都可以软件设置为seg或者com,支持1/2,1/3bais,可加QQ索取资料2920952784

本帖子中包含更多资源

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

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

本版积分规则

11

主题

38

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部