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

cfag12232d graphic lcd

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



Joined: 18 Dec 2006
Posts: 2

View user's profile Send private message

cfag12232d graphic lcd
PostPosted: Thu Jan 11, 2007 5:44 pm     Reply with quote

Version of your compiler: 4.020
Target PIC Microcontroller (PIC16F877, 18F452, etc): PicDem2 Plus 18F4520
Standard Run Mode or Debug Mode: standard
Target voltage (5V, 3.3V, etc): 9V
Target oscillator speed, type (20Mhz, RC, Strip Cut, etc): 24MHz

I toggled all the pins to see if the wiring was correct, and it is. Also ohmed it out. I only get garbage on the lcd. Here is the source code. Free for download from www.picmodules.com I've made modifications to it, but it doesn't seem to work.

If anyone could help, I would appreciate it. Hopefully someone can see the error, and/or has used this similar device. Any advice/comments is welcomed! Thanks.


Main.C

Code:

//****************************************************************
// TITLE:   MAIN.C
// DATE:    04 DEC 05
// BY:      JV
// DESCRIPTION: Main project file for SED1520 ddemo applicatiton
//----------------------------------------------------------------
// Revision:    V1.0 (first release)
//****************************************************************

// Select a Processor
// Note:    Default is setup for 16F877A processor
//#define _16F877A                          // Un-comment the micro
#define _18F4520                            // that you are using
//#define _18F4620                          // make sure all others
                                            // are commented out
#ifdef _16F877A
   #include <16f877a.h>
   #fuses HS,NOWDT,NOPROTECT,NOLVP
#endif

#ifdef _18F4520
   #include <18f4520.h>
  #fuses HS,NOWDT,NOLVP,NOBROWNOUT,NOLPT1OSC,NOXINST,NOFCMEN,NOIESO,NOPBADEN
#endif

#ifdef _18F4620
   #include <18f4620.h>
  #fuses HS,NOWDT,NOLVP,NOBROWNOUT,NOLPT1OSC,NOXINST,NOFCMEN,NOIESO,NOPBADEN
#endif

//#device ICD=TRUE
#use delay(clock=24,000,000)

#define FAST_GLCD                       // Graphics.c driver
#include "graphics.c"                   // Graphics.c driver
#include <math.h>                       // Graphics.c driver

// Some test text for displaying on the LCD display
char  TestText[]  = "PICCore",
      TestText2[] = "SED1520 LCD on a ...";

//=================================================================
// The main application
//=================================================================
void main()
  {
  int8 i,j,k;
  InitSED1520();                        // Initialise the SED1520 controllers
 

// Clear the display RAM first--------------//
for (k=0;k<2;k++)                           // Clear both controlers data
    {
     SIDE=k;
     for (j=0;j<4;j++)                       // Now go through all pages
       {                                   // and clear the LCD RAM
          LCDCWrite(184+j);                  // so that the display is cleared   
        LCDCWrite(0);
         for (i=0;i<62;i++) LCDWrite(0x00);
        }
   }
//------------------------------------------//

   // Turn on BL
   output_low(PIN_C2);
   /*
   glcd_rect(5,30,10,10,NO,ON);             // Draw some rectangles
   glcd_rect(5,30,10,22,YES,ON);
   glcd_rect(12,30,17,10,NO,ON);       
   glcd_rect(12,30,17,14,YES,ON);
   glcd_rect(19,30,24,10,NO,ON);
   glcd_rect(19,30,24,23,YES,ON);
   glcd_rect(26,30,31,10,NO,ON);
   glcd_rect(26,30,31,16,YES,ON);
   */   
   glcd_text57(2, 2, TestText2, 1, ON);     // Display some text on the LCD
   glcd_text57(40, 12, TestText, 2, ON);    // Display some text on the LCD

   //glcd_line(35,27,122,27,ON);              // then some lines
   //glcd_line(35,29,122,29,ON);

while(1);                                   // ...and stop

}//End Main



sed1520lcd.c

Code:

//****************************************************************
// TITLE:   SED1520LCD.C
// DATE:    04 DEC 05
// BY:      JV
// DESCRIPTION: SED1520 code for CCS graphics
//              driver
//----------------------------------------------------------------
// Revision:    V1.0 (first release)
//****************************************************************

// PICCore Pin definitions----------//
#define LCD_RES     PIN_A0          // LCD reset pin
#define LCD_CS1     PIN_E1          // Enable Left Side of LCD
#define LCD_CS2     PIN_E2          // Enable Right Side of LCD
#define LCD_RW      PIN_C1          // Read/Write
#define LCD_A0      PIN_C0          // Control or Data
#define LCD_BL      PIN_C2          // LCD B/L
#define B0          PIN_B0          // Databus 0
#define B1          PIN_B1          // Databus 1
#define B2          PIN_B2          // Databus 2
#define B3          PIN_B3          // Databus 3
#define B4          PIN_B4          // Databus 4
#define B5          PIN_B5          // Databus 5
#define B6          PIN_B6          // Databus 6
#define B7          PIN_B7          // Databus 7

// Tell CCS Graphics.c how big the display is
#define GLCD_WIDTH   122            // Number of Horizontal pixels
#define GLCD_HEIGHT   32            // Number of Vertical Pixels

#define LEFT    1
#define RIGHT   0

// Global Variables for this application (LCD)
int   SIDE;                         // Left or Right side of LCD

// Function Prototype for CCS Graphics.c driver
void glcd_pixel(int8, int8, int1);  // Required for CCS GRAPHICS.C


//===============================================================
// command_write (Cdata)
// Write command data to the LCD
// See SED1520 datasheet for more info
//===============================================================
void LCDCWrite(int8 CData)           // Write Instruction to LCD
  {
   if (SIDE==LEFT)
    {
     OUTPUT_LOW(LCD_A0);            // Instruction (not display data)
     OUTPUT_LOW(LCD_RW);            // We are going to WRITE Data
     OUTPUT_LOW(LCD_CS1);           // CS Low on the LEFT side of the display
     delay_cycles(10);

     OUTPUT_HIGH(LCD_CS1);          // CS High (starts cycle)
     OUTPUT_B(CData);               // Put the data on the bus
     delay_cycles(2);               

     OUTPUT_LOW(LCD_CS1);           // Latch the data into the LCD
     delay_cycles(2);               
    }
else // The RIGHT hand side
    {
     OUTPUT_LOW(LCD_A0);            // Instruction (not display data)
     OUTPUT_LOW(LCD_RW);            // We are going to WRITE Data
     OUTPUT_LOW(LCD_CS2);           // CS Low on the RIGHT side of the display
     delay_cycles(10);

     OUTPUT_HIGH(LCD_CS2);          // CS High (starts cycle)
    OUTPUT_B(CData);                // Put the data on the bus
     delay_cycles(2);

     OUTPUT_LOW(LCD_CS2);           // Latch the data into the LCD
     delay_cycles(2); 
    }
 }


//===============================================================
// Data write (DData)
// Writes display data to the LCD
//===============================================================
void LCDWrite(int8 DData)               // Write Data to LCD
  {
   OUTPUT_HIGH(LCD_A0);                 // Data (not instruction)
   OUTPUT_LOW(LCD_RW);                // We are going to WRITE Data
   if(SIDE==LEFT)OUTPUT_LOW(LCD_CS1);   // If Left side then use CS1
   if(SIDE==RIGHT)OUTPUT_LOW(LCD_CS2);  // If Right side then use CS2
   delay_cycles(2);

   if(SIDE==LEFT) OUTPUT_HIGH(LCD_CS1);
   if(SIDE==RIGHT) OUTPUT_HIGH(LCD_CS2);
   OUTPUT_B(DData);                   // Put the data onto the bus
   delay_cycles(10);

   if(SIDE==LEFT) OUTPUT_LOW(LCD_CS1);  // and latch the data into
   if(SIDE==RIGHT) OUTPUT_LOW(LCD_CS2); // the LCD display
   delay_cycles(2);
  }


//===============================================================
// Display data read
// Reads the display data pointed to by the page, column and
// chip select. Returns the data.
//===============================================================
int8 LCDRead()                          // Read Data from LCD
  {
   int8 DData;

   if(SIDE==LEFT) OUTPUT_HIGH(LCD_CS1); 
   if(SIDE==RIGHT) OUTPUT_HIGH(LCD_CS2);   

   OUTPUT_HIGH(LCD_A0);                 // Data
   OUTPUT_HIGH(LCD_RW);                // Read Data
   if(SIDE==LEFT)OUTPUT_LOW(LCD_CS1);
   if(SIDE==RIGHT)OUTPUT_LOW(LCD_CS2);
   delay_cycles(2);

   set_tris_b(0xff);   // Allow LCD to drive the data lines

   if(SIDE==LEFT) OUTPUT_HIGH(LCD_CS1);
   if(SIDE==RIGHT) OUTPUT_HIGH(LCD_CS2);

   delay_cycles(50);
   DData=INPUT_B();                   // Get the data
   if(SIDE==LEFT) OUTPUT_LOW(LCD_CS1);
   if(SIDE==RIGHT) OUTPUT_LOW(LCD_CS2);
   delay_cycles(2);

return(DData);
 }

//===============================================================
// Draw a single pixel
// This is required by the Graphics.c driver file provided by
// CCS. It tells the driver how to draw a single pixel anywhere
// on the LCD display
// x=1 to 122      y=1 to 32     color=1=ON    color=0=OFF
//===============================================================
void glcd_pixel(int8 x, int8 y, int1 color)   
{
int8 ucMask;
int8 i;
int8 Data;

// Which side of the display (which SED1520 controller)
if (x<61>8)y-=((Data-184)*8);              // y should always be 1-8

// Horizontal position (column)
if (x>=62)                                // x should always be 0-61
   x-=61;                               // for each half of the LCD
x-=1;                                   //

LCDCWrite(x);                           // Go to column 'x'

LCDCWrite(0xe0);                       // Start R-M-Write operation
  LCDRead();                          // Dummy Read
  Data = LCDRead();                      // Read LCD dissplay data

  ucMask = 1;                           // Create a bit mask of the
  for (i=1;i<y;i++)                      // pixel to change
       ucMask<<=1;                      //

  if (color) Data|=ucMask;              // Set or clear the pixel as                       
  else Data&=~ucMask;                   // requested
  LCDWrite(Data);
LCDCWrite(0xee);                      // End R-M-Write operation
}

//===================================================================
// Initialise the SED11520 controllers
// for the display type we are using
//===================================================================
void InitSED1520()
{
 int8 i;
 set_tris_b(0x00);
 set_tris_e(0xF8);
 set_tris_c(0xF8);

 // Setup both SED1520 ccontrollers
 for (i=0;i<2;i++)
    {
    SIDE=i;
   LCDCWrite(0xaf);        // Turn on the display
   LCDCWrite(0xa4);        // Static drive is off
   LCDCWrite(0xa9);        // Duty cycle is set to 1/32
   LCDCWrite(0xe2);        // Reset the chip
   LCDCWrite(0xa0);        // Set ADC
   LCDCWrite(0xee);        // Read modify write disabled
   LCDCWrite(0xc0);        // Set the start position to
   LCDCWrite(0xb8);        // the top left of the display
   LCDCWrite(0x00);        // in column 0
   }
    OUTPUT_LOW(LCD_CS1);    // De-select each side to start
    OUTPUT_LOW(LCD_CS2);    //
    delay_ms(60);
}
treitmey



Joined: 23 Jan 2004
Posts: 1094
Location: Appleton,WI USA

View user's profile Send private message Visit poster's website

PostPosted: Thu Jan 11, 2007 5:56 pm     Reply with quote

Just a shot in the dark,.. but the delay_cycles in the driver can be a sort of a got ya. That is because your clock may not be the same as my clock. replace the delay_cycles with a delay_ms(200)
thats a big number, and can be changed to something resonable if it fixes anything.
newbie4life



Joined: 18 Dec 2006
Posts: 2

View user's profile Send private message

PostPosted: Thu Jan 11, 2007 6:29 pm     Reply with quote

Hi, thanks for the input, but yeah, that was one of the first things I've tried.
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