HT1621驱动液晶的奇怪问题
用HT1621驱动一个液晶屏幕,单独指定亮某一段可以实现,全部亮也可以实现。正式写程序的时候发现,指定某一段亮的时候 ,有的会同时灭掉其他的段,但是程序压根没有发送灭的程序。
然后单独测试,先送A段,然后再送B段,B段不会亮,反过来先送B段 再送A段 两段都会同时亮了
楼主用的是全局更新。为什么总是要送地址呢。最开始写入地址0,然后跟上16字节的显示数据即可。 jyrpxj 发表于 2015-8-2 09:46
楼主用的是全局更新。为什么总是要送地址呢。最开始写入地址0,然后跟上16字节的显示数据即可。 ...
还可以这样做啊? 你看芯片手册。 可以写首地址,后面就连续写数据。 jyrpxj 发表于 2015-8-2 09:53
你看芯片手册。 可以写首地址,后面就连续写数据。
好像这也不能解决问题
有的段显示 有的段就自动灭了 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信号分开。供参考 问题解决了吗?发送 A,B段之间加个延迟试试 avr_sz 发表于 2015-8-2 11:43
问题解决了吗?发送 A,B段之间加个延迟试试
还没有 加延时试过了 任然不行 奇怪的问题
页:
[1]