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

[T6963C] Best way to display an image
http://forum.lcdinfo.com/viewtopic.php?f=9&t=677
Page 1 of 1

Author:  Belegar [ Wed May 26, 2004 18:32 ]
Post subject:  [T6963C] Best way to display an image

I'm using a T6963C controller with an ATmega8 from Atmel.

I've successfully displayed an image and I can set/reset any pixel in the screen. Now I'm searching the best way to print an image in any location on the screen, NOT in a byte-boundary address ... Well my first idea is to begin each line using pixel manipulation and then finish with bytes (exept the last byte).

Has someone a little algorithm, or a better idea ? What is the fastest way to print an image ?

Moreover, I've found a command : DATA AUTO --> can it be useful for me ?

Thanks.

Author:  Jim0711 [ Thu May 27, 2004 12:32 ]
Post subject: 

Hi!

You can use the automode to write a data block in the VRAM. The advantage is that the address pointer will increment automatically.

This is an code example in C for the 80C535 to to transfer a array of data from the uC rom to the VRAM. I hope that this will help you. You should also see the datasheet from the T6963C which is proffer on this page.

Code:

   //P5 is connected to the display
   //Set address pointer
   statuscheck();
   P5 = 0x00;
   writedatum();

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

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

   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);

Author:  Belegar [ Thu May 27, 2004 15:28 ]
Post subject: 

ok thanks. I will do that because my code is too slow.
Here is my code, it can diplay an image in ANY position in pixel, not only byte boundary positions :



Code:
void LCD_DrawPic( const char __flash * pic, u8 w, u8 h, u8 x, u8 y )
{
   u8 i, j, k, debut, fin=0, val, flag, padding=0, temp=0, offset, decal;

   if( x%8 != 0 )   // pas aligné sur une adresse multiple de 8, on va afficher le début pixel par pixel
   {
      debut = x/8+1;
      debut = debut * 8; // debut est aligné sur un multiple de 8
      flag=1;
      offset = debut-8;
   }
   else
   {
      flag = 0;
      offset = x;
      debut = x;
   }


   if( w%8 != 0 )   // y'a un padding (bourrage à la fin de chaque ligne)
   {
      fin = w/8+1;
      padding = fin*8 - w;      
   }
   
   // On commence par afficher en haut à gauche, ligne par ligne
   for( i=0; i<h; i++ )
   {
      j=0;
      
      // premiers pixels
      if( flag==1 )
      {
         val = pic[ (h-1-i)*fin + j ]; // le BMP est stocké à l'envers
         for( k=7; k>=(8-(debut-x)); k-- )
         {
            if( (val&(1<<k)) != 0 )
               LCD_SetPixel( x+j*8+(7-k), y+i);
         }
         
         temp = val;
         j=1;
      }
      
      for( ; j<fin-1; j++ )
      {
         val = pic[ (h-1-i)*fin + j ];   // le BMP est stocké à l'envers
         
         if( flag == 1 )
         {
            temp = temp << (debut-x);
            temp = temp | (val >> (8-(debut-x)));
         }
         else
         {
            temp = val;
         }

         LCD_SetGraphXY( offset+j*8, y+i );
         LCD_Write_1_Data( temp, 0xC0 );

         temp = val;
      }
      
      // dernier octet de la ligne
      val = pic[ (h-1-i)*fin + j ];   // le BMP est stocké à l'envers
      decal = 0;
      
      if( flag == 1 )
      {
         // On affiche le reste de l'octet précédent
         for( k=0; k<(8-(debut-x)); k++ )
         {
            if( (temp&(1<<k)) != 0 )
               LCD_SetPixel( offset+j*8+((8-(debut-x))-k-1), y+i);
         }
         
         decal = (8-(debut-x));
      }
      
      // on affiche juste les pixels nécessaires, sans le bourrage
      for( k=7; k>=padding; k-- )
      {
         if( (val&(1<<k)) != 0 )
            LCD_SetPixel( offset+decal+j*8+(7-k), y+i);
      }
      
      
   

   }
}


Sorry for the non-english comments. Warning, the code is NOT optimized ;-)

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