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

Problem Using 74595 to output data GLCD 192x64

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



Joined: 25 Aug 2009
Posts: 175

View user's profile Send private message Yahoo Messenger

Problem Using 74595 to output data GLCD 192x64
PostPosted: Sun Jan 05, 2014 10:40 pm     Reply with quote

Hi all.
I have a problem when I try to output data for GLCD 192x64 by using 74HC595 shift data.
I worked output data GLCD connect direct with PORTD well, and it display right.Also, I worked with 74HC595 to test shift one byte to led and it worked OK.
In my project using PIC18F4680, CCSC ver 5.015,, and i think the errors occur in GLCD driver when i replace:

Code:
Code:

output_d(data);

by using:
Code:
write_expanded_outputs(&data);


In main program:
Code:


#include <18F4680.h>
#fuses H4,PUT,NOPROTECT,NOLVP,NOWDT,NOPBADEN
#use delay(clock=40000000)
#use rs232(baud=4800, xmit=PIN_C6, rcv=PIN_C7, errors) // HARD UART

#include <string.h>        // library for string
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include <74595.c>
#include <GLCD_192X64.c>   // driver GLCD
#include <graph.c>         // library GLCD
unsigned int8 i_x1=0,i_y1=0, i_x2=0, i_y2=0;
#include <led7_segment.c>
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
//                   CHUONG TRINH CHINH                                              /
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
#use delay(clock=40000000)

void main(void)
{   
   delay_ms (1000);
   set_tris_a (0x00);                       
   set_tris_b (0x00);
   set_tris_c (0x00); 
   set_tris_d (0x00);
   set_tris_e (0x00);     
   
   init_595();
   DELAY_MS(1000);
   glcd_init(OFF);
   glcd_init(ON);

   disp_seg_a(1);
   disp_seg_a(2);
   disp_seg_a(3);   
   disp_seg_a(4);
   while(1)
   {
   }
}


GLCD driver code:
Code:

/////////////////////////////////////////////////////////////////////////
////                           HDM64GS192.c                          ////
////                              ////   
//// This file has been modified to handle the 192 x 64 display        ////
////                             ////
////                                                                 ////
//// This file contains drivers for using a Hantronix HDM64GS12 with ////
//// a KS0108 display controller. The HDM64GS12 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: R/S - Data or Instruction is connected to B2              ////
////  * 5: R/W - Read or Write is connected to B4                    ////
////  * 6: Enable is connected to B5                                 ////
////  *7-14: Data Bus 0 to 7 is connected to port d                  ////
////  *15: Chip Select 1 is connected to B0                          ////
////  *16: Chip Select 2 is connected to B1                          ////
////  *17: Reset is connected to C0                                  ////
////  *18: Negative voltage is also connected to the 20k Ohm POT     ////
////  *19: Positive voltage for LED backlight is connected to +5V    ////
////  *20: Negavtive voltage for LED backlight is connected to 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.              ////
/////////////////////////////////////////////////////////////////////////
 
                                                                                   
#define LARGE_LCD   

#ifndef HDM64GS192             
#define HDM64GS192           
                             
#ifndef GLCD_WIDTH
#define GLCD_WIDTH   192
#endif

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

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

#ifndef GLCD_CS3       
#define GLCD_CS3     PIN_D7   // Chip Selection 3 
#endif

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

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

#ifndef GLCD_E
#define GLCD_E       PIN_D3   // Enable
#endif

#ifndef GLCD_RST
#define GLCD_RST     PIN_D5   // Reset
#endif                         

#define GLCD_LEFT    0
#define GLCD_MID     1
#define GLCD_RIGHT   2

#ifndef ON
#define ON           1
#endif

#ifndef OFF
#define OFF          0
#endif                                   

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

#ifdef FAST_GLCD
struct
{
   unsigned int8 left[512];
   unsigned int8 right[512];
   unsigned int8 mid[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_high(GLCD_CS1);       
   output_high(GLCD_CS2);
   output_high(GLCD_CS3);
                             
   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_MID, 0xC0);
   glcd_writeByte(GLCD_LEFT, 0x40);    // Set the column address to 0
   glcd_writeByte(GLCD_RIGHT, 0x40);
   glcd_writeByte(GLCD_MID, 0x40);
   glcd_writeByte(GLCD_LEFT, 0xB8);    // Set the page address to 0
   glcd_writeByte(GLCD_RIGHT, 0xB8);
   glcd_writeByte(GLCD_MID, 0xB8);
   
   if(mode == ON)
   {
      glcd_writeByte(GLCD_LEFT, 0x3F); // Turn the display on
      glcd_writeByte(GLCD_MID, 0x3F);
      glcd_writeByte(GLCD_RIGHT, 0x3F);
   }
   else
   {                     
      glcd_writeByte(GLCD_LEFT, 0x3E); // Turn the display off
      glcd_writeByte(GLCD_MID, 0x3E);
      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()
{
   unsigned int8 i, j;
   unsigned int8 *p1, *p2, *p3;

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

   // 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_MID, 0x40);
      glcd_writeByte(GLCD_LEFT, i | 0xB8);      // Set page address
      glcd_writeByte(GLCD_RIGHT, i | 0xB8);
      glcd_writeByte(GLCD_MID, 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
         glcd_writeByte(GLCD_MID, *p3++);     // 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(unsigned int8 x, unsigned int8 y, int1 color)
#ifdef FAST_GLCD
{
   unsigned int8* p;
   unsigned int16 temp;
   temp =  y/8;
   temp *= 64;
   temp += x;
                 
   if((x>63)&&(x<128))
   {
      p = displayData.mid + temp - 64;
   }
   else if(x>127)
   {
      p = displayData.right + temp-128;
   }
   else if((x>=0)&&(x<4))                                                           
   {
      p = displayData.left+temp;

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

   if((x>63)&&(x<128))              // Check for first or second display area
   {
      x -= 64;
      side = GLCD_MID;
   }
   else if ((x>127)&&(x<192))
   {                             
      x -=128;
      side=GLCD_RIGHT;
   }                         
   else
   {
      side=GLCD_LEFT;
   }                       

   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
{
   unsigned int8  data;
   unsigned int8  *p1, *p2, *p3;
   unsigned int16 i;
                               
   p1 = displayData.left;                       
   p2 = displayData.right;
   p3 = displayData.mid;
   data = 0xFF * color;

   for(i=0; i<512; ++i)
   {
      *p1++ = data;
      *p2++ = data;
      *p3++ = data;
   }
}
#else
{
   unsigned 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_MID, 0b01000000);
      glcd_writeByte(GLCD_LEFT, i | 0b10111000);// Set page address
      glcd_writeByte(GLCD_RIGHT, i | 0b10111000);
      glcd_writeByte(GLCD_MID, 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_MID, 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(int8 side, BYTE data)
{
//!   set_tris_d(0x00);
//!   out_595(0X00);
   output_low(GLCD_RW);       // Set for writing
                                     
   if(side==0)             // Choose which side to write to
   {   
      output_low(GLCD_CS1);
      output_high(GLCD_CS2);
      output_high(GLCD_CS3); 
   }
   else if(side==1)             
   {   
      output_low(GLCD_CS2);       
      output_high(GLCD_CS1);
      output_high(GLCD_CS3); 
   }
   else                                                                                                                                         
   {   
      output_low(GLCD_CS3);
      output_high(GLCD_CS2);
      output_high(GLCD_CS1); 
   }                   
    delay_us(1);             

   write_expanded_outputs(&data);
   delay_us(1);
   output_high(GLCD_E);       // Pulse the enable pin
   delay_us(5);                                                           
   output_low(GLCD_E);

   output_high(GLCD_CS1);      // Reset the chip select lines
   output_high(GLCD_CS2); 
   output_high(GLCD_CS3); 
}
                                                 
//===============================================================================
// Purpose:    Reads a byte of data from the specified chip
// Ouputs:     A byte of data read from the chip
BYTE glcd_readByte(int8 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==0)                   // Choose which side to write to
   {   
      output_low(GLCD_CS1);
      output_high(GLCD_CS2);
      output_high(GLCD_CS3); 
   } 
   else if(side==1)
   {   
      output_low(GLCD_CS2);
      output_high(GLCD_CS1);
      output_high(GLCD_CS3); 
   } 
   else
   {   
      output_low(GLCD_CS3);
      output_high(GLCD_CS2);
      output_high(GLCD_CS1); 
   } 
                                                                           
   delay_us(1);
   output_high(GLCD_E);       // Pulse the enable pin
   delay_us(4);
   data = input_d();          // Get the data from the display's output register
   output_low(GLCD_E);

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

#endif


Pls show me way to fix it, thanks all.[/list]
_________________
Begin Begin Begin !!!
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