CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

"GLCD Font Creator" code is correct ???

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
vortexe90



Joined: 26 Feb 2013
Posts: 30
Location: Algeria

View user's profile Send private message

"GLCD Font Creator" code is correct ???
PostPosted: Fri Nov 08, 2013 4:49 am     Reply with quote

hi guys, I used this routine to display fonts with high resolution. All the variables are 16-bit. I encode the numbers and special characters in the table "font11" from 32 to 64 ascii order. But still nothing is displayed in the GLCD by glcd_text57 against the routine works well.

Please help me

here are the codes,

the data of characters :

Code:


//GLCD FontName : Times_New_Roman10x13
//GLCD FontSize : 10 x 13

const unsigned short font11[] = {
        0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 
        0x03, 0x00, 0x00, 0x1E, 0x03, 0x7E, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char !
        0x06, 0x00, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char "
        0x06, 0x90, 0x03, 0xF8, 0x00, 0x96, 0x00, 0x90, 0x03, 0xF8, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char #
        0x05, 0x9C, 0x01, 0x32, 0x02, 0xFF, 0x07, 0x62, 0x02, 0xCC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char $
        0x0A, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x02, 0x3C, 0x01, 0xC0, 0x00, 0x20, 0x00, 0x18, 0x00, 0xE4, 0x01, 0x12, 0x02, 0xE0, 0x01,  // Code for char %
        0x09, 0xC0, 0x01, 0xE0, 0x03, 0x1C, 0x03, 0x7E, 0x02, 0xE2, 0x02, 0x92, 0x01, 0xAC, 0x03, 0x60, 0x02, 0x20, 0x01, 0x00, 0x00,  // Code for char &
        0x03, 0x00, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char '
        0x04, 0xF0, 0x01, 0xF8, 0x03, 0x0C, 0x06, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char (
        0x04, 0x02, 0x08, 0x04, 0x06, 0xF8, 0x03, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char )
        0x06, 0x00, 0x00, 0x08, 0x00, 0x28, 0x00, 0x1E, 0x00, 0x28, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char *
        0x07, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xFC, 0x01, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char +
        0x02, 0x00, 0x0B, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ,
        0x03, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char -
        0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char .
        0x03, 0x00, 0x03, 0xF8, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char /
        0x05, 0xFC, 0x01, 0xFE, 0x03, 0x02, 0x02, 0xFE, 0x03, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 0
        0x05, 0x00, 0x00, 0x02, 0x02, 0xFE, 0x03, 0xFE, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 1
        0x05, 0x08, 0x02, 0x86, 0x03, 0x46, 0x03, 0x3E, 0x03, 0x1C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 2
        0x05, 0x04, 0x01, 0x02, 0x02, 0x32, 0x02, 0xFE, 0x03, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 3
        0x06, 0xC0, 0x00, 0xB0, 0x00, 0x88, 0x00, 0xFE, 0x03, 0xFE, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 4
        0x05, 0x38, 0x03, 0x36, 0x03, 0x36, 0x02, 0x76, 0x01, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 5
        0x05, 0xF0, 0x01, 0xFC, 0x03, 0x14, 0x02, 0xF6, 0x03, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 6
        0x05, 0x06, 0x00, 0x06, 0x00, 0x86, 0x03, 0x7E, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 7
        0x05, 0xDC, 0x01, 0xFE, 0x03, 0x22, 0x02, 0xFE, 0x03, 0xDC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 8
        0x05, 0x3C, 0x02, 0x7E, 0x03, 0x42, 0x01, 0xFE, 0x01, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 9
        0x03, 0x00, 0x00, 0x30, 0x03, 0x30, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char :
        0x03, 0x00, 0x00, 0x30, 0x0B, 0x30, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ;
        0x06, 0x40, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0x10, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char <
        0x06, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char =
        0x06, 0x10, 0x01, 0x10, 0x01, 0xA0, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char >
        0x06, 0x00, 0x00, 0x0C, 0x00, 0x0E, 0x03, 0x62, 0x03, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ?
        0x0A, 0xF0, 0x03, 0x08, 0x04, 0xC4, 0x09, 0xE2, 0x13, 0x32, 0x12, 0x12, 0x11, 0x92, 0x11, 0xE2, 0x13, 0x34, 0x09, 0xF8, 0x04   // Code for char @
        };



The routine high resolution text:

Code:
/////////////////////////////////////////////////////////////////////////////
////// Purpose:       Write text on a graphic LCD
////// Inputs:        (x_origin,y_origin) - The upper left coordinate of the first letter
//////                textptr - A pointer to an array of text to display
//////                fgcolor - 16 bit colour of text
//////                bgcolor - 16 bit colour of background   
/////////////////////////////////////////////////////////////////////////////
void glcd_text(unsigned int16 x_origin, unsigned int16 y_origin, char* textptr, unsigned int16 fgcolour, unsigned int16 bgcolour)
{
   unsigned int16 info_offset;
   int chr_width;
   int chr_bytes;
   unsigned int16 chr_hight;
   unsigned int16 chr_offset;

   int i,j,k;
   unsigned int16 x,y;

   chr_hight = font11[6];                                             //the hight is always stored in the 6th bit
   
   while(*textptr != '\0')
      {
         if(*textptr == ' ')                                          //found a space, we will just insert a few lines
            {
               x_origin = x_origin + 5;                              //move to the next chr position   
            }
         else
            {
               info_offset = (((unsigned int16)*textptr - 33) * 4) + 8;      //work out how far into the font array is the info about the current chr skipping the fist 8 byts in the table
               chr_width = font11[info_offset];                           //the first byte contanes the width information, this is only how wide the chr is without padding
               chr_offset = make16(font11[info_offset+2], font11[info_offset+1]);    //The next two bytes contane the offset in the table to the bitmap of the chr

                 chr_bytes = chr_width / 8;                                    //work our how many bytes wide the char is
                  if (chr_width  % 8)
                  {
                     chr_bytes++;
                  }
     
               x = x_origin;                                                         //save the start x position
               y = y_origin;                                                         //save the start y position
     
                  for(i=0;i<chr_hight;i++)                                             //loop thought vertical bytes
                     {
                        for(j=0;j<chr_bytes;j++)                                       //loop thought horizontal bytes                             
                           {
                              for(k=0;k<8;k++)                                       //loop though each bit
                                 {
                                    if(bit_test(font11[chr_offset],k))         
                                       {
                                          glcd_pixel(x,y,1);                           //bit is set, make the pixel the text colour
                                       }
                                    else
                                       {
                                          glcd_pixel(x,y,1);                           //bit is not set, make it the background colour
                                       }
                                    x++;                                          //move to the next vertical line
                                 }
                              chr_offset++;                                          //move to the next byte
                           }     
                        x = x_origin;                                                //move the x origin to start drawing the next horizontal bytes
                        y++;                                                      //move down to the next row
                     }
     
               x_origin = x_origin + chr_width + 1;                           //move to the next chr position                             
            }
         textptr++;                                                      //move to next char in string
      }   
}


the glcd_pixel :

Code:
// glcd_pixel(x,y,c) sets pixel x,y with c color
void glcd_pixel(unsigned int8 x, unsigned int8 y, int1 c){
unsigned int8 x_H;
unsigned int8 x_L=0;
x_H = (x / 8);
x_L = 7 - (x - 8*x_H);
glcd_gotoxy(x_H+1,y,0);
if(c){
glcd_WriteCmd1(1,(LCDBitSet|x_L));
} else {
glcd_WriteCmd1(1,(LCDBitReset|x_L));
}
}


main prog :

Code:
#include <16F877A.h>
#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=20000000)
#include "T6963KELLAL.c"

CHAR PP[]="@951";

void main() {
   
   setup_adc(ADC_OFF);          // ADC Off
   setup_adc_ports(NO_ANALOGS);
   set_tris_c(0x00);  // graphic lcd control lines all output
   glcd_init();       //Initialization
   glcd_WriteByte(1, (LCDModeSet|LCDMode_XOR));    //XOR-Mode
   glcd_WriteByte(1, (LCDDispMode|LCDDisp_TXT|LCDDisp_GRH)); //Text and Graphic-Mode
   delay_ms(200);

   While (1)
   {   
     
      glcd_text(2, 30, PP, 0xFFFF, 0x0000);
      delay_ms(1000);

   }   
}
vortexe90



Joined: 26 Feb 2013
Posts: 30
Location: Algeria

View user's profile Send private message

please a help
PostPosted: Fri Nov 08, 2013 8:45 am     Reply with quote

please a help .
Ttelmah



Joined: 11 Mar 2010
Posts: 19245

View user's profile Send private message

PostPosted: Fri Nov 08, 2013 8:46 am     Reply with quote

Code:

               info_offset = (((unsigned int16)*textptr - 33) * 4) + 8;      //work out how far into the font array is the info about the current chr skipping the fist 8 byts in the table


Each row is 21 bytes long. There is also no 8 byte offset. There is a 21byte offset since you start at the '!'.
Code:

info_offset = (((int16)(*textptr))-' ')*21;


character value, less the value for 'space', times the number of characters per row.

So for '!' will give 1*21 = 21, and access the 3 at the start of the second row.. For '"' will give 2*21, and access the 6 at the start of the third row etc..
The maths here has to be adjusted to match the character size you are using.

chr_offset is then also wrong. It has the same offset for the first three characters, and then seems to jump around the table all over the place. You need to study what is going on here, or simply remove these and just use the character as starting in the byte after the width.

Then as a comment, for each byte, read it once, and use s mask for the bit, or rotate it. Accessing the bit with 'bit test', is very inefficient (perhaps a dozen instructions), and each array access also involves a lot of work. I'd suspect you could probably triple the write speed with a couple of minor changes here....

Best Wishes
vortexe90



Joined: 26 Feb 2013
Posts: 30
Location: Algeria

View user's profile Send private message

PostPosted: Fri Nov 08, 2013 9:04 am     Reply with quote

thanks Mr Ttelmah i will do it but also nothing in GLCD i believe that the problem is in the variable of glcd_pixel it must be 16-bit I think so!!
Ttelmah



Joined: 11 Mar 2010
Posts: 19245

View user's profile Send private message

PostPosted: Sat Nov 09, 2013 2:12 am     Reply with quote

No, the variable does not have to be 16 bit, but the code has to be written to correctly handle the size used.

Screaming problem is one word.

'short'.....

In CCS, a short is a _single bit_.

Change this to 'unsigned int8'.

This is why you will find experienced programmers don't use names like 'long', or 'short' for variables, but instead use _explicit_ names like 'int8', Uint8, int16 etc..

'Short', 'long' etc., have different meanings between compilers. This was a problem back when Microsoft updated VB, to VB.net, where the default meaning of long, was changed, leading to all sorts of problems when accessing external stuff in DLL's etc...
vortexe90



Joined: 26 Feb 2013
Posts: 30
Location: Algeria

View user's profile Send private message

PostPosted: Sat Nov 09, 2013 4:19 am     Reply with quote

thanks Ttelmah, yes i do it but nothing too in the GLCD Sad

I change this in the data caracters :
Code:
const unsigned int8 font11[] = {
        0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 
        0x03, 0x00, 0x00, 0x1E, 0x03, 0x7E, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char !
        0x06, 0x00, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char "
        0x06, 0x90, 0x03, 0xF8, 0x00, 0x96, 0x00, 0x90, 0x03, 0xF8, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char #
        0x05, 0x9C, 0x01, 0x32, 0x02, 0xFF, 0x07, 0x62, 0x02, 0xCC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char $
        0x0A, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x02, 0x3C, 0x01, 0xC0, 0x00, 0x20, 0x00, 0x18, 0x00, 0xE4, 0x01, 0x12, 0x02, 0xE0, 0x01,  // Code for char %
        0x09, 0xC0, 0x01, 0xE0, 0x03, 0x1C, 0x03, 0x7E, 0x02, 0xE2, 0x02, 0x92, 0x01, 0xAC, 0x03, 0x60, 0x02, 0x20, 0x01, 0x00, 0x00,  // Code for char &
        0x03, 0x00, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char '
        0x04, 0xF0, 0x01, 0xF8, 0x03, 0x0C, 0x06, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char (
        0x04, 0x02, 0x08, 0x04, 0x06, 0xF8, 0x03, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char )
        0x06, 0x00, 0x00, 0x08, 0x00, 0x28, 0x00, 0x1E, 0x00, 0x28, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char *
        0x07, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xFC, 0x01, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char +
        0x02, 0x00, 0x0B, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ,
        0x03, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char -
        0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char .
        0x03, 0x00, 0x03, 0xF8, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char /
        0x05, 0xFC, 0x01, 0xFE, 0x03, 0x02, 0x02, 0xFE, 0x03, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 0
        0x05, 0x00, 0x00, 0x02, 0x02, 0xFE, 0x03, 0xFE, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 1
        0x05, 0x08, 0x02, 0x86, 0x03, 0x46, 0x03, 0x3E, 0x03, 0x1C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 2
        0x05, 0x04, 0x01, 0x02, 0x02, 0x32, 0x02, 0xFE, 0x03, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 3
        0x06, 0xC0, 0x00, 0xB0, 0x00, 0x88, 0x00, 0xFE, 0x03, 0xFE, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 4
        0x05, 0x38, 0x03, 0x36, 0x03, 0x36, 0x02, 0x76, 0x01, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 5
        0x05, 0xF0, 0x01, 0xFC, 0x03, 0x14, 0x02, 0xF6, 0x03, 0xE2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 6
        0x05, 0x06, 0x00, 0x06, 0x00, 0x86, 0x03, 0x7E, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 7
        0x05, 0xDC, 0x01, 0xFE, 0x03, 0x22, 0x02, 0xFE, 0x03, 0xDC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 8
        0x05, 0x3C, 0x02, 0x7E, 0x03, 0x42, 0x01, 0xFE, 0x01, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 9
        0x03, 0x00, 0x00, 0x30, 0x03, 0x30, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char :
        0x03, 0x00, 0x00, 0x30, 0x0B, 0x30, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ;
        0x06, 0x40, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0x10, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char <
        0x06, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char =
        0x06, 0x10, 0x01, 0x10, 0x01, 0xA0, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char >
        0x06, 0x00, 0x00, 0x0C, 0x00, 0x0E, 0x03, 0x62, 0x03, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ?
        0x0A, 0xF0, 0x03, 0x08, 0x04, 0xC4, 0x09, 0xE2, 0x13, 0x32, 0x12, 0x12, 0x11, 0x92, 0x11, 0xE2, 0x13, 0x34, 0x09, 0xF8, 0x04   // Code for char @
        };



and for this code you see it correct ??:
Code:
void glcd_text(unsigned int16 x_origin, unsigned int16 y_origin, char* textptr, unsigned int16 fgcolour, unsigned int16 bgcolour)
{
   unsigned int16 info_offset;
   int chr_width;
   int chr_bytes;
   unsigned int16 chr_hight;
   unsigned int16 chr_offset;

   int i,j,k;
   unsigned int16 x,y;

   chr_hight = font11[6];                                             //the hight is always stored in the 6th bit
   
   while(*textptr != '\0')
      {
         if(*textptr == ' ')                                          //found a space, we will just insert a few lines
            {
               x_origin = x_origin + 5;                              //move to the next chr position   
            }
         else
            {
               info_offset = (((unsigned int16)*textptr - 33) * 4) + 8;      //work out how far into the font array is the info about the current chr skipping the fist 8 byts in the table
               chr_width = font11[info_offset];                           //the first byte contanes the width information, this is only how wide the chr is without padding
               chr_offset = make16(font11[info_offset+2], font11[info_offset+1]);    //The next two bytes contane the offset in the table to the bitmap of the chr

                 chr_bytes = chr_width / 8;                                    //work our how many bytes wide the char is
                  if (chr_width  % 8)
                  {
                     chr_bytes++;
                  }
     
               x = x_origin;                                                         //save the start x position
               y = y_origin;                                                         //save the start y position
     
                  for(i=0;i<chr_hight;i++)                                             //loop thought vertical bytes
                     {
                        for(j=0;j<chr_bytes;j++)                                       //loop thought horizontal bytes                             
                           {
                              for(k=0;k<8;k++)                                       //loop though each bit
                                 {
                                    if(bit_test(font11[chr_offset],k))         
                                       {
                                          glcd_pixel(x,y,fgcolour);                           //bit is set, make the pixel the text colour
                                       }
                                    else
                                       {
                                          glcd_pixel(x,y,bgcolour);                           //bit is not set, make it the background colour
                                       }
                                    x++;                                          //move to the next vertical line
                                 }
                              chr_offset++;                                          //move to the next byte
                           }     
                        x = x_origin;                                                //move the x origin to start drawing the next horizontal bytes
                        y++;                                                      //move down to the next row
                     }
     
               x_origin = x_origin + chr_width + 1;                           //move to the next chr position                             
            }
         textptr++;                                                      //move to next char in string
      }   
}
Ttelmah



Joined: 11 Mar 2010
Posts: 19245

View user's profile Send private message

PostPosted: Sat Nov 09, 2013 10:16 am     Reply with quote

You have still not done anything about char_offset....

Use your brain, rather than just hopelessly fiddling.

Feed a character number into the code.

Work out what elements it will access in the array, and then what the values it reads are. Set bits on a piece of graph paper as you read 0's and 1's.

You will see hopefully in a few seconds, that it is not accessing the data correctly....
Markdem



Joined: 24 Jun 2005
Posts: 206

View user's profile Send private message Send e-mail

PostPosted: Sun Nov 10, 2013 4:20 pm     Reply with quote

Looks like you are using my code Smile

The code will work fine if you supply the right data in the font array.

At the top of my post in the library it says;
"To make the font array, have a look at http://www.mikroe.com/glcd-font-creator/. It outputs the array in microchip’s graphics library format. You want to use the “Export for TFT and new GLCD” option. "

The font array you have looks nothing like the format you need.
Try to use the font array I have posted to make sure your hardware is working fine, then try to make your own font array using the font creator.


Have fun
in_nursery



Joined: 25 Oct 2012
Posts: 51

View user's profile Send private message

PostPosted: Thu May 05, 2016 12:27 pm     Reply with quote

@Markdem or other

If I had multiple font how can I choose them

for example
const unsigned int8 font11[] and const unsigned int8 font20[].
Code:
 const int font11[] = {
   0x00,
   0x00,
   0x20,0x00,
   0x7F,0x00,
   0x13,
   0x00,....
};

const int font20[] = {
   0x00,
   0x00,
   0x20,0x00,
   0x7F,0x00,
   0x19,
   0x00,....
};


I want to select the font with the function glcd_text.
I try this with no success
Code:

void glcd_text(unsigned int16 x_origin, unsigned int16 y_origin, char* textptr, int *fontSP, int1 color)
{   
    unsigned int16 info_offset;
    int chr_width;
    int chr_bytes;
    unsigned int16 chr_hight;
    unsigned int16 chr_offset;
    int i,j,k;
    unsigned int16 x,y;
 
    chr_hight = fontSp[6];                //the height is always stored in the 6th bit
.....
};


thanks in advance
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Fri May 06, 2016 8:55 am     Reply with quote

Edit the existing glcd_text57() function as follows:
1. Add a 'font' parameter to the end of the parameter list.
2. Add a test at the start of the function to exit without doing anything
if the font parameter is out of range.
3. Add an if-else statement to check the font parameter. If it's 0 then
use the normal font (included in glcd.c). If it's 1, then use your own
custom font.

I am doing this the most simple way possible. I mean the quickest
to implement. It adds a little bit in code size but was quick to type.
Code:

void glcd_text57(int x, int y, char* textptr, int size, int1 color, int8 font)
{
   int i, j, k, l, m;                     // Loop counters
   BYTE pixelData[5];                     // Stores character data

if(font > 1)  // Only fonts 0 and 1 are supported
   return;

   for(i=0; textptr[i] != '\0'; ++i, ++x) // Loop through the passed string
   {
   
    if(font == 0)
      {
       if(textptr[i] < 'S')
          memcpy(pixelData, TEXT[textptr[i]-' '], 5);
       else if(textptr[i] <= '~')
          memcpy(pixelData, TEXT2[textptr[i]-'S'], 5);
       else
          memcpy(pixelData, TEXT[0], 5);   
      }
    else
      {
       if(textptr[i] < 'S')
          memcpy(pixelData, MY_FONT[textptr[i]-' '], 5);
       else if(textptr[i] <= '~')
          memcpy(pixelData, MY_FONT2[textptr[i]-'S'], 5);
       else
          memcpy(pixelData, MY_FONT[0], 5);
      }


in_nursery



Joined: 25 Oct 2012
Posts: 51

View user's profile Send private message

PostPosted: Fri May 06, 2016 9:12 am     Reply with quote

thanks PCM programmer

finally I get work with read_program_memory(mempointer, buffer, 1);
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group