xiepan2010 发表于 2015-8-2 09:21:58

HT1621驱动液晶的奇怪问题

用HT1621驱动一个液晶屏幕,单独指定亮某一段可以实现,全部亮也可以实现。
正式写程序的时候发现,指定某一段亮的时候 ,有的会同时灭掉其他的段,但是程序压根没有发送灭的程序。

然后单独测试,先送A段,然后再送B段,B段不会亮,反过来先送B段 再送A段   两段都会同时亮了








jyrpxj 发表于 2015-8-2 09:46:36

楼主用的是全局更新。为什么总是要送地址呢。最开始写入地址0,然后跟上16字节的显示数据即可。

xiepan2010 发表于 2015-8-2 09:51:55

jyrpxj 发表于 2015-8-2 09:46
楼主用的是全局更新。为什么总是要送地址呢。最开始写入地址0,然后跟上16字节的显示数据即可。 ...

还可以这样做啊?

jyrpxj 发表于 2015-8-2 09:53:18

你看芯片手册。 可以写首地址,后面就连续写数据。

xiepan2010 发表于 2015-8-2 10:03:22

jyrpxj 发表于 2015-8-2 09:53
你看芯片手册。 可以写首地址,后面就连续写数据。

好像这也不能解决问题
有的段显示   有的段就自动灭了

jyrpxj 发表于 2015-8-2 10:15:23

void LCD_WRClk(void)//1个写入时钟
{
        PD_BAK=PD_BAK&(~L_WR);PD_ODR=PD_BAK;
        DelayXus(2);
        PD_BAK=PD_BAK|(L_WR);PD_ODR=PD_BAK;
        DelayXus(2);
}

void LCD0_CS(void)
{
        PD_BAK=PD_BAK&(~L_CS0);PD_ODR=PD_BAK;//片选置低
        DelayXus(2);
}

void LCD0_NCS(void)
{
        PD_BAK=PD_BAK|(L_CS0);PD_ODR=PD_BAK;//片选置高
        DelayXus(2);
}

void LCD1_CS(void)
{
        PD_BAK=PD_BAK&(~L_CS1);PD_ODR=PD_BAK;//片选置低
        DelayXus(2);
}

void LCD1_NCS(void)
{
        PD_BAK=PD_BAK|(L_CS1);PD_ODR=PD_BAK;//片选置高
        DelayXus(2);
}

void LCD_Command(unsigned char cmd) //发送一字节数据
{
        unsigned char i;
        PC_BAK=PC_BAK|(L_DATA);PC_ODR=PC_BAK; //100
        LCD_WRClk();
        PC_BAK=PC_BAK&(~L_DATA);PC_ODR=PC_BAK;
        LCD_WRClk();
        PC_BAK=PC_BAK&(~L_DATA);PC_ODR=PC_BAK;
        LCD_WRClk();
        for(i=0;i<8;i++)
        {
                if(cmd&B10000000){PC_BAK=PC_BAK|(L_DATA);}
                else{PC_BAK=PC_BAK&(~L_DATA);}
                PC_ODR=PC_BAK;
                LCD_WRClk();
                cmd=cmd<<1;
        }
        PC_BAK=PC_BAK|(L_DATA);PC_ODR=PC_BAK;
        LCD_WRClk();
}

void LCD_Init(void)//HT1621初始化
{
        LCD0_CS();LCD1_CS();
        LCD_Command(B00000000); //SYS DIS
        LCD0_NCS();LCD1_NCS();
       
        LCD0_CS();LCD1_CS();
        LCD_Command(B00000001); //SYS EN
        LCD0_NCS();LCD1_NCS();
       
        LCD0_CS();LCD1_CS();
        LCD_Command(B00011000); //RC 256K
        LCD0_NCS();LCD1_NCS();
       
        LCD0_CS();LCD1_CS();
        LCD_Command(B00000100); //TIMER DIS
        LCD0_NCS();LCD1_NCS();
       
        LCD0_CS();LCD1_CS();
        LCD_Command(B00000101); //WDT DIS
        LCD0_NCS();LCD1_NCS();
       
        LCD0_CS();LCD1_CS();
        LCD_Command(B00001000); //TONE OFF
        LCD0_NCS();LCD1_NCS();
       
        LCD0_CS();LCD1_CS();
        LCD_Command(B00101001); //4COM,1/3BIAS
        LCD0_NCS();LCD1_NCS();
       
        LCD0_CS();LCD1_CS();
        LCD_Command(B00000010); //LCD OFF
        LCD0_NCS();LCD1_NCS();
       
        LCD0_CS();LCD1_CS();
        LCD_Command(B00000011); //LCD ON
        LCD0_NCS();LCD1_NCS();
       
}

void LCD_DISPLAY(unsigned char LCDset) //显示,发送全部显示缓存
{
        unsigned char i,k,dat;
        if(LCDset==0){LCD0_CS();}else{LCD1_CS();}
        PC_BAK=PC_BAK|(L_DATA);PC_ODR=PC_BAK; //101
        LCD_WRClk();
        PC_BAK=PC_BAK&(~L_DATA);PC_ODR=PC_BAK;
        LCD_WRClk();
        PC_BAK=PC_BAK|(L_DATA);PC_ODR=PC_BAK;
        LCD_WRClk();
        for(k=0;k<6;k++)//六位地址000000
        {
                PC_BAK=PC_BAK&(~L_DATA);PC_ODR=PC_BAK;
                LCD_WRClk();
        }
        for(k=0;k<16;k++)
        {
                if(LCDset==0){dat=disbuf0;}else{dat=disbuf1;}
                for(i=0;i<8;i++)
                {
                        if(dat&B00000001){PC_BAK=PC_BAK|(L_DATA);}
                        else{PC_BAK=PC_BAK&(~L_DATA);}
                        PC_ODR=PC_BAK;
                        LCD_WRClk();
                        dat=dat>>1;
                }
        }
        PC_BAK=PC_BAK|(L_DATA);PC_ODR=PC_BAK;
        LCD_WRClk();
        if(LCDset==0){LCD0_NCS();}else{LCD1_NCS();}
}

我这是控制两片1621,CS信号分开。供参考

avr_sz 发表于 2015-8-2 11:43:10

问题解决了吗?发送 A,B段之间加个延迟试试

xiepan2010 发表于 2015-8-2 15:21:30

avr_sz 发表于 2015-8-2 11:43
问题解决了吗?发送 A,B段之间加个延迟试试

还没有   加延时试过了   任然不行   奇怪的问题
页: [1]
查看完整版本: HT1621驱动液晶的奇怪问题