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

T6963c initialization problem with address pointer
http://forum.lcdinfo.com/viewtopic.php?f=9&t=665
Page 1 of 1

Author:  Jim0711 [ Fri May 21, 2004 16:04 ]
Post subject:  T6963c initialization problem with address pointer

Hi!

I have a issue with my 240*128 Display. I have tryed to write a progamm which can display text on the display. I am using a 8 Bit 80C535 uC. Every thing works fine :wink: the only issue that I have is the possision of the text on the LCD. E.g. I set up the Text Home address to 1400hex, initialize the address pointer to 1400hex and start writing text(10 characters) to the display in auto increment mode but they don't appear. When I fill the whole RAM than the text appears.
I think that my address pointer shows to the wrong address. But I have no idea why :( .

I hope you understand my issue!!

THANX for your help

Jim

Code:

#include <REG515.H>

/*   P3 is connected to a LED Bar to visualise the current LCD status
   P4 and P5 ist connected with the LCD
*/

void writedatum(void);
void writecommand(void);
void delay(unsigned int zeit);
void statuscheck(void);
void statuscheck_Automode(void);

sbit RST  = P4^1;  //Reset low aktiv
sbit CD   = P4^2;  //CD=0 Datenregister CD=1 StatusCommandregister
sbit CE   = P4^3;  //Display Enable low aktiv
sbit R_D  = P4^4;  //Display read low aktiv
sbit W_R  = P4^5;  //Display write low aktiv

int i,n;   
unsigned char LCD_Status;
unsigned char Daten[10] = {0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x3a};

void main()
{
   //Reset
   P3 = 0x00;
   RST = 0;
      delay(5000);
   RST = 1;
   statuscheck();
   
   
   
   //Set graphics home adresse to 0x0000
   statuscheck();
   P5 = 0x00;
   writedatum();
   
   statuscheck();
   P5 = 0x00;
   writedatum();
   
   statuscheck();
   P5 = 0x42;
   writecommand();


   //Set text home address to 0x1400
   statuscheck();
   P5 = 0x00;
   writedatum();
   
   statuscheck();
   P5 = 0x14;
   writedatum();
   
   statuscheck();
   P5 = 0x40;
   writecommand();


   //Set graphics area to 0x1E;
   statuscheck();
   P5 = 0x1e;
   writedatum();

   statuscheck();
   P5 = 0x00;
   writedatum();
   
   statuscheck();
   P5 = 0x40;
   writecommand();


   //Set text area to 0x1E;
   statuscheck();
   P5 = 0x1e;
   writedatum();

   statuscheck();
   P5 = 0x00;
   writedatum();
   
   statuscheck();
   P5 = 0x41;
   writecommand();


   //Set OR mode
   
   statuscheck();
   P5 = 0x80;
   writecommand();
   

   //Set address pointer
   statuscheck();
   P5 = 0x00;
   writedatum();

   statuscheck();
   P5 = 0x00;
   writedatum();

      statuscheck();
   P5 = 0x24;
   writecommand();
   

    //****Delet Display RAM***************************
   //Auto inc on
   statuscheck();
   P5 = 0xb0;
   writecommand();

   
   for(i=0;i<8192;i++)
   {
   statuscheck_Automode();
   P5 = 0x00;
   writedatum();
   }

   //*****Send data to display*******   
   
   //Set Text on, Graphics off, Cursor off
   statuscheck();
   P5 = 0x94;
   writecommand();
   
   //Set address pointer
   statuscheck();
   P5 = 0x00;
   writedatum();

   statuscheck();
   P5 = 0x14;
   writedatum();

   statuscheck();
   P5 = 0x24;
   writecommand();
   
   for(n=0;n<819;n++)
   {
      for(i=0;i<10;i++)
      {
      statuscheck_Automode();
      P5 = Daten[i];         
      writedatum();
      }

   }

   while(1);
}


//**********Functionen*****************

void statuscheck(void)
{   
   do {
   P5 = 0xff;   //P5 must be set high because the LCD can only pull it to low
   CD = 1;
   R_D = 0;
   CE = 0;      
      delay(5);
   LCD_Status = P5;
   CE = 1;
   R_D = 1;
   LCD_Status &= 0x03;
   P3 = LCD_Status;
   } while (LCD_Status != 0x03);
      
}

void statuscheck_Automode(void)
{   
   do {
   P5 = 0xff;   //P5 must be set high because the LCD can only pull it to low
   CD = 1;
   R_D = 0;
   CE = 0;      
      delay(5);
   LCD_Status = P5;
   
   CE = 1;
   R_D = 1;
   LCD_Status &= 0x08;
   P3 = LCD_Status;
   } while (LCD_Status != 0x08);
}

void writedatum (void)
{   
   CD = 0;
   W_R = 0;
   CE = 0;
      delay(5);
   CE = 1;
   W_R = 1;
   CD = 1;
}

void writecommand (void)
{   
   CD = 1;
   W_R = 0;
   CE = 0;
      delay(5);
   CE = 1;
   W_R = 1;
    CD = 1;
}

void delay(unsigned int zeit)
{
     for (; zeit >0; zeit--);   
}     

 


Author:  Henri [ Sat May 22, 2004 17:38 ]
Post subject: 

I think you should check this piece of code
Code:
   //Set graphics area to 0x1E;
   statuscheck();
   P5 = 0x1e;
   writedatum();

   statuscheck();
   P5 = 0x00;
   writedatum();
   
   statuscheck();
   P5 = 0x40;
   writecommand();

especially the line P5 = 0x40

I think you should have 0x43 there.

Author:  Jim0711 [ Sat May 22, 2004 18:12 ]
Post subject: 

:D THANX :D

Ohh man, I have checked the code several times. I am soo glade that you have found the mistake!!!

I will try it on monday and I hope that this was the only bug :roll:


Thanks

Jim

Author:  Jim0711 [ Mon May 24, 2004 10:16 ]
Post subject: 

Now everthing works fine! Thanks for your :lol: help :lol: !

But I have found a bug too in my code:

After the RAM delete I forgot to stop the auto increment mode. This cause the issue that a normal command won't be recognize like the address pointer set for the dipslay output. The following code segment shows the fixed version.

Code:

  //****clear RAM***************************
   //Auto inc on
   statuscheck();
   P5 = 0xb0;
   writecommand();

   
   for(i=0;i<8192;i++)
   {
   statuscheck_Automode();
   P5 = 0x00;
   writedatum();
   }

                //Auto inc off
   statuscheck();
   P5 = 0xb2;
   writecommand();

   //*****Text output on display*******   

   
   //Set address pointer
   statuscheck();
   P5 = 0x00;
   writedatum();

   statuscheck();
   P5 = 0x14;
   writedatum();

   statuscheck();
   P5 = 0x24;
   writecommand();
   
   //Auto inc on
   statuscheck();
   P5 = 0xb0;
   writecommand();

   for(m=0;m<3;m++)
   {
      for(i=0;i<10;i++)
      {
      statuscheck_Automode();
      P5 = Daten[i];
      writedatum();
      }
   }

                //Auto inc off
   statuscheck();
   P5 = 0xb2;
   writecommand();
      
   //Set Text on, Graphics off, Cursor off
   statuscheck();
   P5 = 0x94;
   writecommand();
   
   while(1);


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