LCDInfo.com
http://forum.lcdinfo.com/

Display Problem with Dataimage 128x64 Graphic LCD
http://forum.lcdinfo.com/viewtopic.php?f=9&t=964
Page 1 of 1

Author:  Anoop [ Mon Jan 03, 2005 7:28 ]
Post subject:  Display Problem with Dataimage 128x64 Graphic LCD

Dear All,

I am Designing New Display with Dataimage 128x64 Graphic LCD, But the problem is that it is showing the same text message on both side of Controller i.e CS1 & CS2 insteed of the hole message as string.Can anybody help me out.


with thanks in advance!
Anoop Tiwari[/code]

Author:  Syridian [ Mon Jan 17, 2005 4:41 ]
Post subject: 

If you could provide more information on the model of the display, someone might be interested in taking a look for you. But if you leave all the work to us, then why would we bother? ;)

Model No. and any other info, links to datasheets...

Anyway. :) Hope to hear back from you soon. :)

Author:  Henri [ Mon Jan 17, 2005 13:19 ]
Post subject: 

How are you handling the CS1 and CS2 pins in your code ? Normally you should only have one side of the display enabled at a time as the display is made of two 64x64 parts and with the CS signals you select which one is currently used.

Author:  Anoop [ Thu Jan 20, 2005 7:06 ]
Post subject:  Pls Check the code as below

[quote="Henri"]How are you handling the CS1 and CS2 pins in your code ? Normally you should only have one side of the display enabled at a time as the display is made of two 64x64 parts and with the CS signals you select which one is currently used

Pls check this code As I marked note in LCD_Write_Char Subroutine As(LCD_Page_Set() & LCD_Column_Set() ) After removing this 2 subroutines only half of display glow otherwise no Display at all.

/**************Start********************************/
#include <stdio.h>
#include <io320.h> // SFR declarations
#include <Font.h>

#define DISPLAY_ON 0x3F
#define DISPLAY_OFF 0x3E
#define DISPLAY_START_LINE 0xC0
#define DISPLAY_PAGE_SET 0xB8
#define DISPLAY_COLUMN_SET 0x40

sbit LCD_E = P3^0; //pin for Display Enable
sbit LCD_RS =P3^1; //pin for register select
sbit LCD_CS0 =P3^2; //pin for Controller1 Chip select
sbit LCD_CS1 =P3^3; //pin for Controller2 Chip select
sbit LCD_RW =P3^4; //pin for read/write


#define RIGHT 0
#define LEFT 1
#define BUSY 0x80
unsigned char CursorX, CursorY;

#define LINE1 0
#define LINE2 1
#define LINE3 2
#define LINE4 3
#define LINE5 4
#define LINE6 5
#define LINE7 6
#define LINE8 7


/****************SUB ROUTIENS**************************************/
void Delay(unsigned int wait);
void LCD_init(void);
void LCD_clear_scrn(void);
void LCD_test(void);
void LCD_Putstr(unsigned char *ptr);
void LCD_Page_Set(unsigned char xAddr);
void LCD_Column_Set(unsigned char yAddr);
void LCD_Data_Write(unsigned char Data);
void LCD_Start_Line(unsigned char start);
void LCD_Command_Write(unsigned char command);
void LCD_Write_Char(unsigned char c);
void LCD_Set_Address(unsigned char x,unsigned char y);
unsigned char LCD_Data_Read(void);
void LCD_Select_Side(unsigned char LcdSide);
void LCD_Wait_Busy(void);
void LCD_Set_Dot (unsigned char x, unsigned char y);
void LCD_Rectangle (unsigned char x,unsigned char y,unsigned char a,unsigned char b);
/*******************************************************************/
/******************MAIN PROGRAM************************************/

void main(void)
{
P1 = 0x00;
P3 = 0x00;

LCD_init();
LCD_test();

}
/******************************************************************/

void LCD_init(void)
{

LCD_Select_Side(LEFT);
LCD_Command_Write(DISPLAY_ON);
LCD_Command_Write(DISPLAY_START_LINE);
LCD_Command_Write(DISPLAY_PAGE_SET);
LCD_Command_Write(DISPLAY_COLUMN_SET);

LCD_Select_Side(RIGHT);
LCD_Command_Write(DISPLAY_ON);
LCD_Command_Write(DISPLAY_START_LINE);
LCD_Command_Write(DISPLAY_PAGE_SET);
LCD_Command_Write(DISPLAY_COLUMN_SET);

LCD_Start_Line(0);
LCD_Set_Address(0,0);
}
/*******************************************************************/
void LCD_test(void)
{
LCD_clear_scrn();
LCD_Set_Address(4,LINE2);
LCD_Putstr("P1 12.500V 05.000A");
LCD_Set_Address(4,LINE3);
LCD_Putstr("cv cc ");
LCD_Set_Address(4,LINE4);
LCD_Putstr("P2 12.500 05.000A");
LCD_Set_Address(4,LINE5);
LCD_Putstr("cv cc ");
LCD_Set_Address(4,LINE6);
LCD_Putstr("output on/off ");
LCD_Set_Address(4,LINE7);
LCD_Putstr("Remote ovp/ocp");
LCD_Rectangle(0,0,64,128);
}
/*******************************************************************/
void LCD_Putstr(unsigned char *ptr)
{
while(*ptr)
{
LCD_Write_Char(*ptr);
ptr++;
}
}

/*******************************************************************/
void LCD_clear_scrn(void)
{
unsigned char x, y;

LCD_CS0 = 1;
for(y =0; y <8; y++)
{
LCD_Page_Set(0);
LCD_Column_Set(y);
for(x =0; x< 64; x++)LCD_Data_Write(0x00);
}
LCD_CS0 = 0;
LCD_CS1 = 1;
for(y =0; y <8; y++)
{
LCD_Page_Set(0);
LCD_Column_Set(y);
for(x =0; x< 64; x++)LCD_Data_Write(0x00);
}
LCD_CS1 = 0;
}

/******************************************************************/
void LCD_Write_Char(unsigned char c)
{
unsigned char i = 0, x;
unsigned char Data;
if(CursorX >128)
{
CursorX =0;
CursorY++;
if(CursorY ==8)CursorY =0;
}
if(CursorX <64)
{
LCD_CS0 = 1;
x =CursorX;

}
else
{
LCD_CS1 = 1;
x =CursorX - 64;
}
LCD_Page_Set(x); /* After removing this only half part of LCD Displayed the Text*/
LCD_Column_Set(CursorY); /* After removing this only half part of LCD Displayed the Text*/
do{
Data =Font[((c - 0x20) * 5)+i ];
LCD_Data_Write(Data);
i++;
CursorX++;
if(CursorX ==64)
{
LCD_CS0 = 0;
LCD_CS1 = 1;
}
else if(CursorX ==128)
{
LCD_CS0 = 1;
LCD_CS1 = 0;
CursorX =0;
CursorY++;
if(CursorY ==8)CursorY =0;
}
if(CursorX <64)x =CursorX;
else x =CursorX - 64;
LCD_Page_Set(x); /* After removing this only half part of LCD Displayed the Text*/
LCD_Column_Set(CursorY); /* After removing this only half part of LCD Displayed the Text*/
}
while(i<5);
CursorX++;
if(CursorX ==128)CursorX =0;
else LCD_Data_Write(0x00);
LCD_CS0 = 0;
LCD_CS1 = 0;
LCD_Start_Line(0);
}
/*****************************************************************/
void LCD_Start_Line(unsigned char start)
{

LCD_Select_Side(LEFT);
LCD_Command_Write(DISPLAY_START_LINE | (start));

LCD_Select_Side(RIGHT);
LCD_Command_Write(DISPLAY_START_LINE | (start));

}
/******************************************************************/
void LCD_Data_Write(unsigned char Data)
{
LCD_Wait_Busy();
LCD_RS = 1;
LCD_RW = 0;
P1 = Data;
LCD_E = 1;
Delay(20);
LCD_E = 0;

}
/******************************************************************/
void LCD_Command_Write(unsigned char Command )
{
LCD_Wait_Busy();
LCD_RS = 0;
LCD_RW =0;
P1 = Command;
LCD_E =1;
Delay(20);
LCD_E =0;

}
/*************Read Data From LCD************************************/
unsigned char LCD_Data_Read(void)
{
LCD_Wait_Busy();
P1 = 0x00;
LCD_RS =1; //Data Mode
LCD_RW =1; // Read Mode
LCD_E =1;
Delay(20);
LCD_E =0;
Delay(20);
return P1;
}
/******************************************************************/
void LCD_Wait_Busy(void)
{
P1 = 0x00;
LCD_RS =0; //Instruction Mode
LCD_RW =1; // Read Mode
LCD_E =1;
Delay(20);
LCD_E =0;
while(P1 & 0x7F ==BUSY); //test the Busy Bit

}
/******************************************************************/
void LCD_Set_Address(unsigned char x,unsigned char y)
{
LCD_Page_Set(x);
LCD_Column_Set(y);
}
/*****************From left to right(0 : 63)**********************/

void LCD_Page_Set(unsigned char xAddr)
{
LCD_Select_Side(LEFT);
LCD_Command_Write(DISPLAY_PAGE_SET | xAddr);
LCD_Select_Side(RIGHT);
LCD_Command_Write(DISPLAY_PAGE_SET | xAddr);

}
/****************From top to bottom(0 : 7)************************/
void LCD_Column_Set(unsigned char yAddr)
{
LCD_Select_Side(LEFT);
LCD_Command_Write(DISPLAY_COLUMN_SET | yAddr);
LCD_Select_Side(RIGHT);
LCD_Command_Write(DISPLAY_COLUMN_SET | yAddr);
}
/*******************************************************************/
void Delay(unsigned int wait)
{
while(wait!=0)
{
wait--;
}
}
/******************************************************************/

void LCD_Select_Side(unsigned char LcdSide)
{
if(LcdSide ==LEFT)
{
//Switch to left Side
LCD_E =0;
LCD_RS =0;
LCD_CS0 =1;
LCD_CS1 =0;
LCD_RW =1;
LCD_Command_Write(DISPLAY_COLUMN_SET);
}
else
{
//Switch to rigth Side
LCD_E =0;
LCD_RS =0;
LCD_CS0 =0;
LCD_CS1 =1;
LCD_RW =1;
LCD_Command_Write(DISPLAY_COLUMN_SET);
}
}
/******************************************************************/
void LCD_Set_Dot(unsigned char x, unsigned char y)
{
unsigned char Temp;
if(x <64)
{
LCD_CS0 =1;
LCD_Page_Set(x);
LCD_Column_Set(y/8);
Temp = LCD_Data_Read();
Temp = LCD_Data_Read();
LCD_Page_Set(x);
LCD_Data_Write(Temp | (1<<(y%8)));
LCD_CS0 =0;
}
else
{
LCD_CS1 =1;
LCD_Page_Set(x -64);
LCD_Column_Set(y/8);
Temp = LCD_Data_Read();
Temp = LCD_Data_Read();
LCD_Page_Set(x -64);
LCD_Data_Write(Temp | (1<<(y%8)));
LCD_CS0 =0;
}
LCD_Start_Line(0);
}
/******************************************************************/
void LCD_Rectangle(unsigned char x,unsigned char y,unsigned char a,unsigned char b)
{
unsigned char j;
for(j=0; j<a; j++)
{
LCD_Set_Dot(x, y + j);
LCD_Set_Dot(x + b - 1, y + j);
}
for(j=0; j<b; j++)
{
LCD_Set_Dot(x + j, y );
LCD_Set_Dot(x + j, y + a - 1);
}
}
/********************************************************************/ [/code]

Author:  Anoop [ Thu Jan 20, 2005 7:30 ]
Post subject:  Re: Pls Check the code as below

Anoop wrote:
Henri wrote:
How are you handling the CS1 and CS2 pins in your code ? Normally you should only have one side of the display enabled at a time as the display is made of two 64x64 parts and with the CS signals you select which one is currently used

Pls check this code As I marked note in LCD_Write_Char Subroutine As(LCD_Page_Set() & LCD_Column_Set() ) After removing this 2 subroutines only half of display glow otherwise no Display at all. & Data sheet in pdf As:-

http://www.dataimage.com.tw/en/product/ ... AYA-01.pdf

thanks in advance Henri !!
Anoop

/**************Start********************************/
#include <stdio.h>
#include <io320.h> // SFR declarations
#include <Font.h>

#define DISPLAY_ON 0x3F
#define DISPLAY_OFF 0x3E
#define DISPLAY_START_LINE 0xC0
#define DISPLAY_PAGE_SET 0xB8
#define DISPLAY_COLUMN_SET 0x40

sbit LCD_E = P3^0; //pin for Display Enable
sbit LCD_RS =P3^1; //pin for register select
sbit LCD_CS0 =P3^2; //pin for Controller1 Chip select
sbit LCD_CS1 =P3^3; //pin for Controller2 Chip select
sbit LCD_RW =P3^4; //pin for read/write


#define RIGHT 0
#define LEFT 1
#define BUSY 0x80
unsigned char CursorX, CursorY;

#define LINE1 0
#define LINE2 1
#define LINE3 2
#define LINE4 3
#define LINE5 4
#define LINE6 5
#define LINE7 6
#define LINE8 7


/****************SUB ROUTIENS**************************************/
void Delay(unsigned int wait);
void LCD_init(void);
void LCD_clear_scrn(void);
void LCD_test(void);
void LCD_Putstr(unsigned char *ptr);
void LCD_Page_Set(unsigned char xAddr);
void LCD_Column_Set(unsigned char yAddr);
void LCD_Data_Write(unsigned char Data);
void LCD_Start_Line(unsigned char start);
void LCD_Command_Write(unsigned char command);
void LCD_Write_Char(unsigned char c);
void LCD_Set_Address(unsigned char x,unsigned char y);
unsigned char LCD_Data_Read(void);
void LCD_Select_Side(unsigned char LcdSide);
void LCD_Wait_Busy(void);
void LCD_Set_Dot (unsigned char x, unsigned char y);
void LCD_Rectangle (unsigned char x,unsigned char y,unsigned char a,unsigned char b);
/*******************************************************************/
/******************MAIN PROGRAM************************************/

void main(void)
{
P1 = 0x00;
P3 = 0x00;

LCD_init();
LCD_test();

}
/******************************************************************/

void LCD_init(void)
{

LCD_Select_Side(LEFT);
LCD_Command_Write(DISPLAY_ON);
LCD_Command_Write(DISPLAY_START_LINE);
LCD_Command_Write(DISPLAY_PAGE_SET);
LCD_Command_Write(DISPLAY_COLUMN_SET);

LCD_Select_Side(RIGHT);
LCD_Command_Write(DISPLAY_ON);
LCD_Command_Write(DISPLAY_START_LINE);
LCD_Command_Write(DISPLAY_PAGE_SET);
LCD_Command_Write(DISPLAY_COLUMN_SET);

LCD_Start_Line(0);
LCD_Set_Address(0,0);
}
/*******************************************************************/
void LCD_test(void)
{
LCD_clear_scrn();
LCD_Set_Address(4,LINE2);
LCD_Putstr("P1 12.500V 05.000A");
LCD_Set_Address(4,LINE3);
LCD_Putstr("cv cc ");
LCD_Set_Address(4,LINE4);
LCD_Putstr("P2 12.500 05.000A");
LCD_Set_Address(4,LINE5);
LCD_Putstr("cv cc ");
LCD_Set_Address(4,LINE6);
LCD_Putstr("output on/off ");
LCD_Set_Address(4,LINE7);
LCD_Putstr("Remote ovp/ocp");
LCD_Rectangle(0,0,64,128);
}
/*******************************************************************/
void LCD_Putstr(unsigned char *ptr)
{
while(*ptr)
{
LCD_Write_Char(*ptr);
ptr++;
}
}

/*******************************************************************/
void LCD_clear_scrn(void)
{
unsigned char x, y;

LCD_CS0 = 1;
for(y =0; y <8; y++)
{
LCD_Page_Set(0);
LCD_Column_Set(y);
for(x =0; x< 64; x++)LCD_Data_Write(0x00);
}
LCD_CS0 = 0;
LCD_CS1 = 1;
for(y =0; y <8; y++)
{
LCD_Page_Set(0);
LCD_Column_Set(y);
for(x =0; x< 64; x++)LCD_Data_Write(0x00);
}
LCD_CS1 = 0;
}

/******************************************************************/
void LCD_Write_Char(unsigned char c)
{
unsigned char i = 0, x;
unsigned char Data;
if(CursorX >128)
{
CursorX =0;
CursorY++;
if(CursorY ==8)CursorY =0;
}
if(CursorX <64)
{
LCD_CS0 = 1;
x =CursorX;

}
else
{
LCD_CS1 = 1;
x =CursorX - 64;
}
LCD_Page_Set(x); /* After removing this only half part of LCD Displayed the Text*/
LCD_Column_Set(CursorY); /* After removing this only half part of LCD Displayed the Text*/
do{
Data =Font[((c - 0x20) * 5)+i ];
LCD_Data_Write(Data);
i++;
CursorX++;
if(CursorX ==64)
{
LCD_CS0 = 0;
LCD_CS1 = 1;
}
else if(CursorX ==128)
{
LCD_CS0 = 1;
LCD_CS1 = 0;
CursorX =0;
CursorY++;
if(CursorY ==8)CursorY =0;
}
if(CursorX <64)x =CursorX;
else x =CursorX - 64;
LCD_Page_Set(x); /* After removing this only half part of LCD Displayed the Text*/
LCD_Column_Set(CursorY); /* After removing this only half part of LCD Displayed the Text*/
}
while(i<5);
CursorX++;
if(CursorX ==128)CursorX =0;
else LCD_Data_Write(0x00);
LCD_CS0 = 0;
LCD_CS1 = 0;
LCD_Start_Line(0);
}
/*****************************************************************/
void LCD_Start_Line(unsigned char start)
{

LCD_Select_Side(LEFT);
LCD_Command_Write(DISPLAY_START_LINE | (start));

LCD_Select_Side(RIGHT);
LCD_Command_Write(DISPLAY_START_LINE | (start));

}
/******************************************************************/
void LCD_Data_Write(unsigned char Data)
{
LCD_Wait_Busy();
LCD_RS = 1;
LCD_RW = 0;
P1 = Data;
LCD_E = 1;
Delay(20);
LCD_E = 0;

}
/******************************************************************/
void LCD_Command_Write(unsigned char Command )
{
LCD_Wait_Busy();
LCD_RS = 0;
LCD_RW =0;
P1 = Command;
LCD_E =1;
Delay(20);
LCD_E =0;

}
/*************Read Data From LCD************************************/
unsigned char LCD_Data_Read(void)
{
LCD_Wait_Busy();
P1 = 0x00;
LCD_RS =1; //Data Mode
LCD_RW =1; // Read Mode
LCD_E =1;
Delay(20);
LCD_E =0;
Delay(20);
return P1;
}
/******************************************************************/
void LCD_Wait_Busy(void)
{
P1 = 0x00;
LCD_RS =0; //Instruction Mode
LCD_RW =1; // Read Mode
LCD_E =1;
Delay(20);
LCD_E =0;
while(P1 & 0x7F ==BUSY); //test the Busy Bit

}
/******************************************************************/
void LCD_Set_Address(unsigned char x,unsigned char y)
{
LCD_Page_Set(x);
LCD_Column_Set(y);
}
/*****************From left to right(0 : 63)**********************/

void LCD_Page_Set(unsigned char xAddr)
{
LCD_Select_Side(LEFT);
LCD_Command_Write(DISPLAY_PAGE_SET | xAddr);
LCD_Select_Side(RIGHT);
LCD_Command_Write(DISPLAY_PAGE_SET | xAddr);

}
/****************From top to bottom(0 : 7)************************/
void LCD_Column_Set(unsigned char yAddr)
{
LCD_Select_Side(LEFT);
LCD_Command_Write(DISPLAY_COLUMN_SET | yAddr);
LCD_Select_Side(RIGHT);
LCD_Command_Write(DISPLAY_COLUMN_SET | yAddr);
}
/*******************************************************************/
void Delay(unsigned int wait)
{
while(wait!=0)
{
wait--;
}
}
/******************************************************************/

void LCD_Select_Side(unsigned char LcdSide)
{
if(LcdSide ==LEFT)
{
//Switch to left Side
LCD_E =0;
LCD_RS =0;
LCD_CS0 =1;
LCD_CS1 =0;
LCD_RW =1;
LCD_Command_Write(DISPLAY_COLUMN_SET);
}
else
{
//Switch to rigth Side
LCD_E =0;
LCD_RS =0;
LCD_CS0 =0;
LCD_CS1 =1;
LCD_RW =1;
LCD_Command_Write(DISPLAY_COLUMN_SET);
}
}
/******************************************************************/
void LCD_Set_Dot(unsigned char x, unsigned char y)
{
unsigned char Temp;
if(x <64)
{
LCD_CS0 =1;
LCD_Page_Set(x);
LCD_Column_Set(y/8);
Temp = LCD_Data_Read();
Temp = LCD_Data_Read();
LCD_Page_Set(x);
LCD_Data_Write(Temp | (1<<(y%8)));
LCD_CS0 =0;
}
else
{
LCD_CS1 =1;
LCD_Page_Set(x -64);
LCD_Column_Set(y/8);
Temp = LCD_Data_Read();
Temp = LCD_Data_Read();
LCD_Page_Set(x -64);
LCD_Data_Write(Temp | (1<<(y%8)));
LCD_CS0 =0;
}
LCD_Start_Line(0);
}
/******************************************************************/
void LCD_Rectangle(unsigned char x,unsigned char y,unsigned char a,unsigned char b)
{
unsigned char j;
for(j=0; j<a; j++)
{
LCD_Set_Dot(x, y + j);
LCD_Set_Dot(x + b - 1, y + j);
}
for(j=0; j<b; j++)
{
LCD_Set_Dot(x + j, y );
LCD_Set_Dot(x + j, y + a - 1);
}
}
/********************************************************************/ [/code]

Author:  errol_ [ Wed Mar 02, 2005 16:56 ]
Post subject: 

Hello Anoop Tiwari,

I wrote a programm for an equal display by myself.
To display your data correctly, you should (try to) manipulate the LCD_CS-variables in the LCD_Column_Set-Routine only.
So if you want to change the CS-value, call your LCD_Column_Set-routine :wink:
Execute the LCD_Column_Set- and LCD_Page_Set-routines every time you write a column/byte on the display. This might slow down your programm, but it avoids displaying errors.

Your routines could look like this:

void LCD_Column_Set(unsigned char yAddr) //yAddr=0..127
{
LCD_CS0=(yAddr<64?LEFT:RIGHT);
LCD_CS1=LCD_CS0?0:1;
LCD_E = 1;
LCD_RS =0;
LCD_RW =1;
P1 = DISPLAY_COLUMN_SET | ((y<64) ? y : (y-64));
LCD_E = 0;
}

void LCD_Page_Set(unsigned char xAddr) //xAddr=0..7
{
LCD_E = 1;
LCD_RS =0;
P1 = DISPLAY_PAGE_SET | xAddr;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_E = 0;
}

void LCD_Write_Char(unsigned char c)
{
...
if(CursorY>123){
CursorY=0;
CursorX=(CursorX+1)%8;
}
...
do{
LCD_Column_Set(CursorY);
LCD_Page_Set(CursorX);
Data =Font[((c - 0x20) * 5)+i ];
LCD_Data_Write(Data);
i++;
CursorY++;
}
while(i<5);

...
}

The LCD_Select_Side-routine is unnecessary/obsolete.
I hope this could help to solve your problem...

errol_

Author:  errol_ [ Wed Mar 02, 2005 17:18 ]
Post subject: 

I exchanged the x- and y-cursor variables, because the display is organized like this:

Image

regards
errol_

Page 1 of 1 All times are UTC + 2 hours
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/