打印

哪位高手编过段式LCD驱动芯片BU9792AFUV?

[复制链接]
5026|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hopewise|  楼主 | 2011-11-12 08:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ups888| | 2011-11-14 00:23 | 只看该作者
#define   LcdDrv_SlvAddr                0x7c

void I2C_CycleErrChk(void)
{
        uchar i,j;
        Set_InPut_P_EeprSda;
        Set_OutPut_P_EeprScl;
        P_EeprScl_High;
        if(P_EeprSda==0)
                {
                //there is and error on I2C bus
                for(i=0;i<10;i++)
                        {
                        P_EeprScl_Low;
                        Null01();Null01();
                        P_EeprScl_High;
                        if(P_EeprSda==1)break;
                       }
                }
}
///////////////////////////////
void Lcd_Start(void)
{
        Set_OutPut_P_LcdScl;Set_OutPut_P_LcdSda;
        Null01();
        P_LcdSda_High;
        us_delay(2);
        P_LcdScl_High;
        Null01();
        P_LcdSda_Low;
        Null01();nop();nop();nop();
        P_LcdScl_Low;
      nop();nop();nop();
}

void Lcd_Stop(void)
{
        Set_OutPut_P_LcdScl;
        nop();nop();nop();
        //P_LcdSda_High;
        Set_OutPut_P_LcdSda;
        nop();nop();nop();
        P_LcdScl_Low;
       nop();nop();nop();
        P_LcdSda_Low;
        nop();nop();nop();nop();nop();   
        P_LcdScl_High;
        nop();nop();nop();nop();nop();   
        nop();nop();nop();nop();nop();
        P_LcdSda_High;
        nop();nop();nop();nop();nop();
}

void Lcd_AckWr(void)
{
        uchar i;
        Set_InPut_P_LcdSda;
        nop();nop();nop();nop();
        P_LcdScl_High;       
        GB_LcdAck标志寄存器=0;
        for(i=0;i<10;i++)
                {
                if(!P_LcdSda){break;}
                }
        us_delay(1);
        P_LcdScl_Low;
        if(i>=10){GB_LcdAck标志寄存器=1;}
        Set_OutPut_P_LcdSda;
        nop();nop();
}
/*
void Lcd_AckRd(void)
{
        Set_OutPut_P_LcdSda;
        nop();nop();nop();
        P_LcdSda_Low;
        nop();nop();nop();
        P_LcdScl_High;       
        us_delay(1);
        P_LcdScl_Low;
        nop();nop();nop();
        Set_InPut_P_LcdSda;
        nop();nop();
}
*/

void Lcd_NoAck(void)
{
        Set_OutPut_P_LcdSda;
        nop();nop();nop();
        P_LcdSda_High;
        nop();nop();nop();
        P_LcdScl_High;       
        us_delay(1);
        P_LcdScl_Low;
        nop();nop();nop();
}

/*
uchar Lcd_Rd1Byte(void)
{
        union UN_DEF LUB_data;
        uchar i;
        Set_InPut_P_LcdSda;
        LUB_data.BYTE=0;Null01();nop();
        for(i=0;i!=8;i++)
                {
                P_LcdScl_High;
                Null01();
                LUB_data.BIT.b0=P_LcdSda;
                P_LcdScl_Low;                                       
                if(i==7)
                        {
                        P_LcdSda_Low;
                        //Lcd_AckRd();
                        return LUB_data.BYTE;
                        break;
                        }       
                LUB_data.BYTE<<=1;
                nop();nop();nop();
                //Null01();
                }
        return LUB_data.BYTE;
}
*/

void Lcd_Wr1Byte(uchar PB_data)
{
        uchar i;
        union UN_DEF LUB_data;
        Set_OutPut_P_LcdSda;
        LUB_data.BYTE=PB_data;Null01();nop();
        for(i=0;i!=8;i++)
                {
                P_LcdSda=LUB_data.BIT.b7;
                //Null01();
                nop();nop();nop();nop();
                P_LcdScl_High;               
                LUB_data.BYTE<<=1;
                Null01();nop();nop();nop();
                P_LcdScl_Low;
                }
        P_LcdSda_Low;
        Lcd_AckWr();
}



void Dis_Trans(uchar PuB_Frq)
{
        uchar i;
        //asm("FCLR I"); /* Interrupt disable */
        //I2C_CycleErrChk();       
        Lcd_Start();       
        Lcd_Wr1Byte(LcdDrv_SlvAddr);        /*send device address*/
        if(GB_LcdAck标志寄存器)
                {
                Set_OutPut_P_LcdScl;Set_OutPut_P_LcdSda;
                P_LcdScl_Low;P_LcdSda_Low;
                LCD_PowerOff;sub_delay(90);LCD_PowerOn;
                sub_delay(10);
                Soft_ResetLcd();
                Lcd_Start();       
                Lcd_Wr1Byte(LcdDrv_SlvAddr);        /*send device address*/
        }
        Lcd_Wr1Byte(0xc8);        /*Modeset */
        Lcd_Wr1Byte(PuB_Frq); /*DISCTL*/
        Lcd_Wr1Byte(0xe8);        /*ICSET */
        Lcd_Wr1Byte(0xf0);        /*BLKCTL*/
        Lcd_Wr1Byte(0xfc);       /*APKCTL*/
       
//        Lcd_Wr1Byte(0);
        Lcd_Wr1Byte(2);
        for(i=0;i<Gcst_LCDBufSize;i++)
                {       
                Lcd_Wr1Byte(GAub_LCD_Buf[i]);
                }

        Lcd_Stop();
        //asm("FSET I"); /* Interrupt enable */
}

调用的时候低功耗Dis_Trans(0x0a2);高功耗选Dis_Trans(0x0bc);

使用特权

评论回复
板凳
hopewise|  楼主 | 2011-11-14 08:01 | 只看该作者
非常感谢ups888无私的发表,格式非常整洁,易懂,这样的好贴不多了.因为我搞软件时间不到2年,基本上用汇编写程序,用C写的只能是简单的产品.下面还是有些不明白:
1.Set_InPut_P_EeprSda与P_EeprSda是啥关系?
  Set_InPut_P_EeprSda是宏指令么?

2. Null01()是啥内容?

3.us_delay(1)是延时1us么?要是的话,怎么不用1个nop?
看来有空的话我要快恶补一下C语言了.

使用特权

评论回复
地板
yewuyi| | 2011-11-14 10:22 | 只看该作者
这个应该是ROHM的一个LCD驱动芯片,可以联系上海格洲,他们是ROHM的代理,应该有做好的C函数或者汇编函数给你参考。

使用特权

评论回复
5
stupidboy456| | 2013-7-18 13:40 | 只看该作者
学习了,,谢谢大家

使用特权

评论回复
6
szbanqiu1688| | 2018-7-30 11:22 | 只看该作者
推荐可以试试 VKL144A  超低功耗

VKL144A V1-CH.pdf

1.38 MB

VKL144B V1-CH.pdf

1.46 MB

VKL144A与HT1621对比A.pdf

1.42 MB

使用特权

评论回复
7
jcdzxh| | 2018-8-2 11:35 | 只看该作者
写过,电表屏

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

468

帖子

3

粉丝