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 CCS Technical Support

crystalfontz CFAG12864BTMIV

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



Joined: 20 Feb 2008
Posts: 3
Location: SFAX Tunisia

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

crystalfontz CFAG12864BTMIV
PostPosted: Tue May 20, 2008 3:12 am     Reply with quote

Hi everyone

I am new in PIC technology and I try to interface a GLCD (128 x 64) by crystalfontz CFAG12864BTMIV with PIC18f4620. The GLCD is not working. No text or pixels or whatever is in the program is being displayed.

This LCD has a backlight.
My compiler is PCWHD 4.065 and I simulate my code with ISIS 7.1 SP2. The simulation with ISIS it’s Ok but in the reality I have no chance. Here are the connections:

1= 5V
2= GND

Pin 1
_|_
| |-------------- connect with pin 3= Pot 10K ohm
----
| Pin 18


4= RD0
5=RD1
6=RD2
7=RD3
8=RD4
9=RD5
10=RD6
11=RD7
12= CS1=RB0
13=CS2=RB1
14=RST=RC0
15= R/W=RB7
16 = D/I=RB2
17= E = RB5
18 = VEE = POT

R= 25 ohm
19= ----\/\/\/\/\/\/\-- 5V

20= GND



Data sheet of The LCD;
http://www.crystalfontz.com/products/12864b/datasheets/277/CFAG12864BTMIV.pdf


GLCD.C
Code removed by forum moderater. Ref. forum policy #10:
10. Don't post the CCS example code or drivers, or ask for such code and drivers.


Hello.c
Code:

#include <18f4620.h>
#DEVICE *=16 CCSICD=TRUE
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7,PARITY=N,BITS =8)
#INCLUDE <glcd.c>

void main()
  {
  char v[]="Hello";
   glcd_init(on);
      while(true)
 {
 glcd_text57(20,20,v,2,on);
 glcd_pixel(10,10,on) ;
}
}



Can anybody help me please……
bwhiten



Joined: 26 Nov 2003
Posts: 151
Location: Grayson, GA

View user's profile Send private message

Working driver
PostPosted: Tue May 20, 2008 6:50 am     Reply with quote

It appears you may have some #define statments missing or the code uses a different method. Here is a driver I modified slightly from another CCS driver that is working fine with that LCD. You will also need to include <graphics.c> in your program.

Code:
/////////////////////////////////////////////////////////////////////////
////                           CFAG12864B.c                          ////
////                                                                 ////
//// File contains drivers for using a CrystalFontz CFAG12864B with  ////
//// a KS0108 controller. The CFAG12864B is 128 by 64 pixels.        ////
//// The driver treats the upper left pixel as (0,0).                ////
////                                                                 ////
//// Use #define FAST_GLCD if the target chip has at least 1k of RAM ////
//// to decrease the time it takes to update the display.            ////
//// glcd_update() must then be called to update the display after   ////
//// changing the pixel information.                                 ////
//// See ex_glcd.c for suggested usage.                              ////
//// See KS0108.c for controlling a single 64 by 64 display          ////
/////////////////////////////////////////////////////////////////////////
////                                                                 ////
//// LCD Pin connections:                                            ////
//// (These can be changed as needed in the following defines).      ////
////  * 1: VSS is connected to GND                                   ////
////  * 2: VDD is connected to +5V                                   ////
////  * 3: V0  - LCD operating voltage (Constrast adjustment)        ////
////  * 4: D/I - Data or Instruction is connected to B4              ////
////  * 5: R/W - Read or Write is connected to C6                    ////
////  * 6: Enable is connected to C7                                 ////
////  *7-14: Data Bus 0 to 7 is connected to port D0 to D7           ////
////  *15: Chip Select 1 is connected to E0                          ////
////  *16: Chip Select 2 is connected to E1                          ////
////  *17: Reset is connected to E2                                  ////
////  *18: Negative voltage is also connected                        ////
////  *19: Positive voltage for LED is connected to current limit +5V////
////  *20: Negavtive voltage for LED is connected to switched GND    ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////
////                                                                 ////
////  glcd_init(mode)                                                ////
////     * Must be called before any other function.                 ////
////       - mode can be ON or OFF to turn the LCD on or off         ////
////                                                                 ////
////  glcd_pixel(x,y,color)                                          ////
////     * Sets the pixel to the given color.                        ////
////       - color can be ON or OFF                                  ////
////                                                                 ////
////  glcd_fillScreen(color)                                         ////
////     * Fills the entire LCD with the given color.                ////
////       - color can be ON or OFF                                  ////
////                                                                 ////
////  glcd_update()                                                  ////
////     * Write the display data stored in RAM to the LCD           ////
////     * Only available if FAST_GLCD is defined                    ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996, 2004 Custom Computer Services        ////
//// This source code may only be used by licensed users of the CCS  ////
//// C compiler.  This source code may only be distributed to other  ////
//// licensed users of the CCS C compiler.  No other use,            ////
//// reproduction or distribution is permitted without written       ////
//// permission.  Derivative programs created using this software    ////
//// in object code form are not restricted in any way.              ////
/////////////////////////////////////////////////////////////////////////



#ifndef CFAG12864B
#define CFAG12864B

#ifndef GLCD_WIDTH
#define GLCD_WIDTH   128
#endif

#ifndef GLCD_CS1
#define GLCD_CS1     PIN_E0   // Chip Selection 1
#endif

#ifndef GLCD_CS2
#define GLCD_CS2     PIN_E1   // Chip Selection 2
#endif

#ifndef GLCD_DI
#define GLCD_DI      PIN_B4   // Data or Instruction input
#endif

#ifndef GLCD_RW
#define GLCD_RW      PIN_C6   // Read/Write
#endif

#ifndef GLCD_E
#define GLCD_E       PIN_C7   // Enable
#endif

#ifndef GLCD_RST
#define GLCD_RST     PIN_E2   // Reset
#endif

#define GLCD_LEFT    1
#define GLCD_RIGHT   0

#ifndef ON
#define ON           1
#endif

#ifndef OFF
#define OFF          0
#endif

/////////////////////////////////////////////////////////////////////////
// Function Prototypes
/////////////////////////////////////////////////////////////////////////
void glcd_init(int1 mode);
void glcd_pixel(int8 x, int8 y, int1 color);
void glcd_fillScreen(int1 color);
void glcd_writeByte(int1 side, BYTE data);
BYTE glcd_readByte(int1 side);
void glcd_update();
/////////////////////////////////////////////////////////////////////////

#ifdef FAST_GLCD
struct
{
   int8 left[512];
   int8 right[512];
} displayData;
#endif


// Purpose:       Initialize the LCD.
//                Call before using any other LCD function.
// Inputs:        OFF - Turns the LCD off
//                ON  - Turns the LCD on
void glcd_init(int1 mode)
{
   // Initialze some pins
   output_high(GLCD_RST);
   output_low(GLCD_E);
   output_low(GLCD_CS1);
   output_low(GLCD_CS2);

   output_low(GLCD_DI);                 // Set for instruction
   glcd_writeByte(GLCD_LEFT,  0xC0);    // Specify first RAM line at the top
   glcd_writeByte(GLCD_RIGHT, 0xC0);    //   of the screen
   glcd_writeByte(GLCD_LEFT,  0x40);    // Set the column address to 0
   glcd_writeByte(GLCD_RIGHT, 0x40);
   glcd_writeByte(GLCD_LEFT,  0xB8);    // Set the page address to 0
   glcd_writeByte(GLCD_RIGHT, 0xB8);

   if(mode == ON)
   {
      glcd_writeByte(GLCD_LEFT,  0x3F); // Turn the display on
      glcd_writeByte(GLCD_RIGHT, 0x3F);
   }
   else
   {
      glcd_writeByte(GLCD_LEFT,  0x3E); // Turn the display off
      glcd_writeByte(GLCD_RIGHT, 0x3E);
   }

   glcd_fillScreen(OFF);                // Clear the display

   #ifdef FAST_GLCD
   glcd_update();
   #endif
}


// Purpose:    Update the LCD with data from the display arrays
#ifdef FAST_GLCD
void glcd_update()
{
   int8 i, j;
   int8 *p1, *p2;

   p1 = displayData.left;
   p2 = displayData.right;

   // Loop through the vertical pages
   for(i = 0; i < 8; ++i)
   {
      output_low(GLCD_DI);                      // Set for instruction
      glcd_writeByte(GLCD_LEFT, 0x40);          // Set horizontal address to 0
      glcd_writeByte(GLCD_RIGHT, 0x40);
      glcd_writeByte(GLCD_LEFT, i | 0xB8);      // Set page address
      glcd_writeByte(GLCD_RIGHT, i | 0xB8);
      output_high(GLCD_DI);                     // Set for data

      // Loop through the horizontal sections
      for(j = 0; j < 64; ++j)
      {
         glcd_writeByte(GLCD_LEFT, *p1++);      // Turn pixels on or off
         glcd_writeByte(GLCD_RIGHT, *p2++);     // Turn pixels on or off
      }
   }
}
#endif


// Purpose:    Turn a pixel on a graphic LCD on or off
// Inputs:     1) x - the x coordinate of the pixel
//             2) y - the y coordinate of the pixel
//             3) color - ON or OFF
void glcd_pixel(int8 x, int8 y, int1 color)
#ifdef FAST_GLCD
{
   int8* p;
   int16 temp;
   temp =  y/8;
   temp *= 64;
   temp += x;

   if(x > 63)
   {
      p = displayData.right + temp - 64;
   }
   else
   {
      p = displayData.left + temp;
   }

   if(color)
   {
      bit_set(*p, y%8);
   }
   else
   {
      bit_clear(*p, y%8);
   }
}
#else
{
   BYTE data;
   int1 side = GLCD_LEFT;  // Stores which chip to use on the LCD

   if(x > 63)              // Check for first or second display area
   {
      x -= 64;
      side = GLCD_RIGHT;
   }

   output_low(GLCD_DI);                         // Set for instruction
   bit_clear(x,7);                              // Clear the MSB. Part of an instruction code
   bit_set(x,6);                                // Set bit 6. Also part of an instruction code
   glcd_writeByte(side, x);                     // Set the horizontal address
   glcd_writeByte(side, (y/8 & 0xBF) | 0xB8);   // Set the vertical page address
   output_high(GLCD_DI);                        // Set for data
   glcd_readByte(side);                         // Need two reads to get data
   data = glcd_readByte(side);                  //  at new address

   if(color == ON)
      bit_set(data, y%8);        // Turn the pixel on
   else                          // or
      bit_clear(data, y%8);      // turn the pixel off

   output_low(GLCD_DI);          // Set for instruction
   glcd_writeByte(side, x);      // Set the horizontal address
   output_high(GLCD_DI);         // Set for data
   glcd_writeByte(side, data);   // Write the pixel data
}
#endif


// Purpose:    Fill the LCD screen with the passed in color
// Inputs:     ON  - turn all the pixels on
//             OFF - turn all the pixels off
void glcd_fillScreen(int1 color)
#ifdef FAST_GLCD
{
   int8  data;
   int8  *p1, *p2;
   int16 i;

   p1 = displayData.left;
   p2 = displayData.right;
   data = 0xFF * color;

   for(i=0; i<512; ++i)
   {
      *p1++ = data;
      *p2++ = data;
   }
}
#else
{
   int8 i, j;

   // Loop through the vertical pages
   for(i = 0; i < 8; ++i)
   {
      output_low(GLCD_DI);                      // Set for instruction
      glcd_writeByte(GLCD_LEFT, 0b01000000);    // Set horizontal address to 0
      glcd_writeByte(GLCD_RIGHT, 0b01000000);
      glcd_writeByte(GLCD_LEFT, i | 0b10111000);// Set page address
      glcd_writeByte(GLCD_RIGHT, i | 0b10111000);
      output_high(GLCD_DI);                     // Set for data

      // Loop through the horizontal sections
      for(j = 0; j < 64; ++j)
      {
         glcd_writeByte(GLCD_LEFT, 0xFF*color);  // Turn pixels on or off
         glcd_writeByte(GLCD_RIGHT, 0xFF*color); // Turn pixels on or off
      }
   }
}
#endif


// Purpose:    Write a byte of data to the specified chip
// Inputs:     1) chipSelect - which chip to write the data to
//             2) data - the byte of data to write
void glcd_writeByte(int1 side, BYTE data)
{
   if(side)                   // Choose which side to write to
      output_high(GLCD_CS2);
   else
      output_high(GLCD_CS1);

   output_low(GLCD_RW);       // Set for writing
   output_d(data);            // Put the data on the port
   delay_cycles(1);
   output_high(GLCD_E);       // Pulse the enable pin
   delay_cycles(5);
   output_low(GLCD_E);

   output_low(GLCD_CS1);      // Reset the chip select lines
   output_low(GLCD_CS2);
}


// Purpose:    Reads a byte of data from the specified chip
// Ouputs:     A byte of data read from the chip
BYTE glcd_readByte(int1 side)
{
   BYTE data;                 // Stores the data read from the LCD

   set_tris_d(0xFF);          // Set port d to input
   output_high(GLCD_RW);      // Set for reading

   if(side)                   // Choose which side to write to
      output_high(GLCD_CS2);
   else
      output_high(GLCD_CS1);

   delay_cycles(1);
   output_high(GLCD_E);       // Pulse the enable pin
   delay_cycles(4);
   data = input_d();          // Get the data from the display's output register
   output_low(GLCD_E);

   output_low(GLCD_CS1);      // Reset the chip select lines
   output_low(GLCD_CS2);
   return data;               // Return the read data
}

#endif
omardhouib



Joined: 20 Feb 2008
Posts: 3
Location: SFAX Tunisia

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

CFAG12864B
PostPosted: Thu May 22, 2008 1:11 am     Reply with quote

Thank you for your help bwhiten.

I try your driver. the simulation with ISIS it's OK. but in the reality its not working.just a blue light in the LCD

my connection is :

LCD = Fonction = PIC
-------------------------------------------------------
12 = CS1 = RB0
13 = CS2 = RB1
14 = RST = RC0
15 = R/W = RB7
16 = D/I = RB2
17 = E = RB5

so I change the some lines in your driver but its not working again...



Code:

#ifndef GLCD_CS1
#define GLCD_CS1     PIN_B0   // I changed the PIN_B0 by the PIN_E0 
#endif

#ifndef GLCD_CS2
#define GLCD_CS2     PIN_B1   // I changed the PIN_E1 by the PIN_B1 
#endif

#ifndef GLCD_DI
#define GLCD_DI      PIN_B2   // I changed the PIN_B4 by the PIN_B2   
#endif

#ifndef GLCD_RW
#define GLCD_RW      PIN_B7   // I changed the PIN_C0 by the PIN_B7   
#endif

#ifndef GLCD_E
#define GLCD_E       PIN_B5   // I changed the PIN_C7 by the PIN_B5   
#endif

#ifndef GLCD_RST
#define GLCD_RST     PIN_C0   // I changed the PIN_E2 by the PIN_C0 
#endif



what do you say......
bwhiten



Joined: 26 Nov 2003
Posts: 151
Location: Grayson, GA

View user's profile Send private message

Check that you have correct include file
PostPosted: Thu May 22, 2008 6:42 am     Reply with quote

Post your newest version of Hello.c
omardhouib



Joined: 20 Feb 2008
Posts: 3
Location: SFAX Tunisia

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

hello.c
PostPosted: Sat May 24, 2008 2:09 am     Reply with quote

hello.c
Code:


#include <18f4620.h>
#DEVICE *=16 CCSICD=TRUE
#ROM 0x7F38 = {0x9000}
#ROM 0x7F3A = {0xEF00}
#ROM 0x7F3C = {0xF000}
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7,PARITY=N,BITS =8)

#include <CFAG12864B.c>
//#include <HDM64GS12o.c>
#include <graphicso.c>

void main()
 {
   char  ABC[] = "hello";
   glcd_init(on);                               // Must initialize the LCD
   for(;;)
{
 glcd_text57(10, 10, ABC,1, ON);       
}
}


bwhiten



Joined: 26 Nov 2003
Posts: 151
Location: Grayson, GA

View user's profile Send private message

PostPosted: Sat May 24, 2008 10:42 am     Reply with quote

That looks correct enough. I used the TRIS registers to set up the input/output pins so you may want to try that as well.
The voltage at pin 3 should be initially adjusted to -3.0 Volts, when referenced to ground. If this is not close the screen will "appear" to be blank.
Make sure that the pot is adjusted for that voltage first.
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