  | 
	  | 
		 
	 
	
		| View previous topic :: View next topic   | 
	 
	
	
		| Author | 
		Message | 
	 
	
		
			omardhouib
 
 
  Joined: 20 Feb 2008 Posts: 3 Location: SFAX Tunisia 
			
			 
			 
			 
			
			
			
			
			
			
  
		  | 
		
			
				| crystalfontz  CFAG12864BTMIV | 
			 
			
				 Posted: Tue May 20, 2008 3:12 am     | 
				     | 
			 
			
				
  | 
			 
			
				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 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				| Working driver | 
			 
			
				 Posted: Tue May 20, 2008 6:50 am     | 
				     | 
			 
			
				
  | 
			 
			
				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 
			
			 
			 
			 
			
			
			
			
			
			
  
		  | 
		
			
				| CFAG12864B | 
			 
			
				 Posted: Thu May 22, 2008 1:11 am     | 
				     | 
			 
			
				
  | 
			 
			
				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 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				| Check that you have correct include file | 
			 
			
				 Posted: Thu May 22, 2008 6:42 am     | 
				     | 
			 
			
				
  | 
			 
			
				| Post your newest version of Hello.c | 
			 
		  | 
	 
	
		  | 
	 
	
		
			omardhouib
 
 
  Joined: 20 Feb 2008 Posts: 3 Location: SFAX Tunisia 
			
			 
			 
			 
			
			
			
			
			
			
  
		  | 
		
			
				| hello.c | 
			 
			
				 Posted: Sat May 24, 2008 2:09 am     | 
				     | 
			 
			
				
  | 
			 
			
				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 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Sat May 24, 2008 10:42 am     | 
				     | 
			 
			
				
  | 
			 
			
				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. | 
			 
		  | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
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
  
		 |