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

Graphic LCD driver ST7920

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



Joined: 27 Nov 2007
Posts: 4

View user's profile Send private message

Graphic LCD driver ST7920
PostPosted: Tue Nov 27, 2007 8:37 am     Reply with quote

Any body could say me where I can find any driver for a Graphic LCD with the controller ST7920 from Sitronix, and a classic hardware interface of 16 pins (RS, RW, E, D0-D7). The microcontroller that I use is 18F2520, and the display is MG1903AC-SYL from Everbouquet.
Thank you, very much.
_________________
Atentamente, Javier
javierviana



Joined: 27 Nov 2007
Posts: 4

View user's profile Send private message

Graphic LCD driver ST7920
PostPosted: Fri Dec 07, 2007 4:45 am     Reply with quote

Here it is my driver. It work fine with the example graphics.c an some predefines:

Code:

#byte PORTA = 0xF80
#bit RA0   = PORTA.0
#bit RA1   = PORTA.1
#bit RA2   = PORTA.2
#bit RA3   = PORTA.3
#bit RA4   = PORTA.4
#bit RA5   = PORTA.5
#bit RA6   = PORTA.6
#bit RA7   = PORTA.7

#byte PORTB = 0xF81
#bit RB0   = PORTB.0
#bit RB1   = PORTB.1
#bit RB2   = PORTB.2
#bit RB3   = PORTB.3
#bit RB4   = PORTB.4
#bit RB5   = PORTB.5
#bit RB6   = PORTB.6
#bit RB7   = PORTB.7

#byte PORTC = 0xF82
#bit RC0   = PORTC.0
#bit RC1   = PORTC.1
#bit RC2   = PORTC.2
#bit RC3   = PORTC.3
#bit RC4   = PORTC.4
#bit RC5   = PORTC.5
#bit RC6   = PORTC.6
#bit RC7   = PORTC.7

#byte PORTE = 0xF84
#bit RE3   = PORTE.3


/////////////////////////////////////////////////////////////////////////
////                           mg1903a.h                             ////
////                                                                 ////
//// This file contains drivers for using a Everbouquet MG1903A with ////
//// a ST7920 display controller. The MG1903A is 192 by 32 pixels.   ////
//// The driver treats the upper left pixel as (0,0).                ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////
////                                                                 ////
//// LCD Pin connections:                                            ////
////  * 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 C7              ////
////  * 5: R/W - Read or Write is connected to C6                    ////
////  * 6: Enable is connected to C5                                 ////
////  * 7-14: Data Bus 0 to 7 is connected to port B                  ////
////  * 15: Positive voltage for LED backlight is connected to +5V    ////
////  * 16: Negavtive voltage for LED backlight is connected to GND   ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////
////                                                                 ////
////  glcd_init ()                                                   ////
////     * Must be called before any other function.                 ////
////                                                                 ////
////  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                                  ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////

#define GLCD_RS      RC7   // Display Data / Control Data.
#define GLCD_RW      RC6   // Read / Write
#define GLCD_E      RC5   // Enable Signal.

#define GLCD_WIDTH   192

#define RS_FUNCTION   0
#define RS_DATA      1
#define RW_WRITE   0
#define RW_READ      1
#define TRIS_READ   0xFF
#define TRIS_WRITE   0x00

// Valores de color:
#define ON   1
#define OFF   0

typedef union
{
  int16 word;
  BYTE byte[2];
} Dots;

typedef struct
{
  BOOLEAN refrescar;
  Dots dots[32][12];   // Diemensiones máximas del display (x,y) = (191,31).
} GDRAM;      // El punto (0,0) corresponde a la esquina superior izquierda.

GDRAM gdram;


/*----------------------------------------------------------------------------------------------
 * Nombre:   glcd_readByte
 *
 * Propósito:   Reads a byte of data from the LCD.
 *
 * In/Out:      
 *
 * Return:   A byte of data read from the LCD.
 *
 * Requisitos:   
 *
 * Descripción:   
 *--------------------------------------------------------------------------------------------*/

BYTE glcd_readByte (BYTE address)
{
  BYTE data;   // Stores the data read from the LCD

  set_tris_b (TRIS_READ);   // Set PORTB to input
  GLCD_RS = address;
  delay_cycles(1);
  GLCD_RW = RW_READ;      // Set for reading
  delay_cycles (1);
  GLCD_E = 1;      // Pulse the enable pin
  delay_cycles (1);
  data = PORTB;      // Get the data from the display's output register
  GLCD_E = 0;
  return data;
}


/*----------------------------------------------------------------------------------------------
 * Nombre:   glcd_writeByte
 *
 * Propósito:   Write a byte of data to the LCD.
 *
 * In/Out:      
 *
 * Return:
 *   - data   (in): the byte of data to write.
 *
 * Requisitos:   
 *
 * Descripción:   
 *
 *--------------------------------------------------------------------------------------------*/

void glcd_writeByte (BYTE address, BYTE data)
{
  GLCD_RS = RS_FUNCTION;
  while ( bit_test (glcd_readByte(RS_FUNCTION), 7) ) ;   // Whait Busy Flag = FALSE!
  set_tris_b (TRIS_WRITE);   // Set PORTB to output
  GLCD_RS = address;
  delay_cycles(1);
  GLCD_RW = RW_WRITE;      // Set for writing
  delay_cycles(1);
  GLCD_E = 0;
  PORTB = data;         // Put the data on the port
  delay_cycles (1);
  GLCD_E = 1;         // Pulse the enable pin
  delay_cycles(5);
  GLCD_E = 0;
}


/*----------------------------------------------------------------------------------------------
 * Nombre:   glcd_fillScreen
 *
 * Propósito:   Fill the LCD screen with the passed in color.
 *
 * In/Out:
 *   - color   (in):
 *          ON  - turn all the pixels on.
 *         OFF - turn all the pixels off.
 *
 * Return:      
 *
 * Requisitos:   
 *
 * Descripción:   Sólo trabaja sobre la caché del display.
 *
 *--------------------------------------------------------------------------------------------*/

void glcd_fillScreen (BYTE color)
{
  int8 v, h;
  int16 d;

  d = (color == ON ? 0xFFFFL : 0x0000L);

  for (v=0; v<32; v++)
  {
    for (h=0; h<12; h++)
    {
      gdram.dots[v][h].word = d;
    }
  }
  gdram.refrescar = TRUE;
}


/*----------------------------------------------------------------------------------------------
 * Nombre:   glcd_update
 *
 * Propósito:   Update the LCD with data from the display cache.
 *
 * In/Out:
 *
 * Return:      
 *
 * Requisitos:   
 *
 * Descripción:   
 *--------------------------------------------------------------------------------------------*/

void glcd_update ()
{
  int8 v, h;

  if (gdram.refrescar)
  {
    for (v=0; v<32; v++)
    {
      glcd_writeByte (RS_FUNCTION, 0x80 | v);   // Set Vertical Address.
      glcd_writeByte (RS_FUNCTION, 0x80 | 0);   // Set Horizontal Address.

      for (h=0; h<12; h++)
      {
        glcd_writeByte (RS_DATA, gdram.dots[v][h].byte[1]);   // Write High Byte.
        glcd_writeByte (RS_DATA, gdram.dots[v][h].byte[0]);   // Write Low Byte.
      }
    }
    gdram.refrescar = FALSE;
  }
}


/*----------------------------------------------------------------------------------------------
 * Nombre:   glcd_init
 *
 * Propósito:   Inicialza el LCD.
 *
 * In/Out:
 *   - mode   (in): OFF/ON - Turns the LCD off/on.
 *
 * Return:      
 *
 * Requisitos:   Call before using any other LCD function.
 *
 * Descripción:   
 *--------------------------------------------------------------------------------------------*/

void glcd_init ()
{
  set_tris_b (TRIS_WRITE);   // PORTB as output.
  GLCD_RS = RS_FUNCTION;
  GLCD_RW = RW_WRITE;
  GLCD_E = 0;
  delay_ms (40);

  glcd_writeByte (RS_FUNCTION, 0x30);    // Specify 8 bit interface and basic instruction set.
  delay_us (100);
  glcd_writeByte (RS_FUNCTION, 0x30);    // Specify 8 bit interface and basic instruction set.
  delay_us (37);
  glcd_writeByte (RS_FUNCTION, 0x0C);    // Specify Display on, Cursor off and Blink off.
  delay_us (100);
  glcd_writeByte (RS_FUNCTION, 0x01);    // Display clear.
  delay_ms (10);
  glcd_writeByte (RS_FUNCTION, 0x06);    // AC Increase (cursor move right), don't shift the display.
  delay_us (72);
  glcd_writeByte (RS_FUNCTION, 0x34);    // Select extended instruction set.
  delay_us (72);
  glcd_writeByte (RS_FUNCTION, 0x36);    // Graphic display ON.

  glcd_fillScreen (OFF);
  glcd_update ();
}


/*----------------------------------------------------------------------------------------------
 * Nombre:   
 *
 * Propósito:   Turn a pixel on a graphic LCD on or off.
 *
 * In/Out:
 *   - x   (in): the x coordinate of the pixel.
 *   - y   (in): y - the y coordinate of the pixel.
 *   - color   (in): ON or OFF.
 *
 * Return:      
 *
 * Requisitos:   
 *
 * Descripción:   
 *--------------------------------------------------------------------------------------------*/

void glcd_pixel(int8 x, int8 y, int1 color)
{
  int8 v, h, b;

  v = y;
  h = x/16;
  b = 16 - (x%16);

  // Modify the actual word.
  if (color == ON) bit_set (gdram.dots[v][h].word, b);
  else bit_clear (gdram.dots[v][h].word, b);
 
  gdram.refrescar = TRUE;
}


_________________
Atentamente, Javier
javierviana



Joined: 27 Nov 2007
Posts: 4

View user's profile Send private message

PostPosted: Fri Dec 07, 2007 4:52 am     Reply with quote

Sorry, the function glcd_pixel is:
Code:

void glcd_pixel(int8 x, int8 y, int1 color)
{
  int8 v, h, b;

  v = y;
  h = x/16;
  b = 15 - (x%16);

  // Modify the actual word.
  if (color == ON) bit_set (gdram.dots[v][h].word, b);
  else bit_clear (gdram.dots[v][h].word, b);
 
  gdram.refrescar = TRUE;
}

_________________
Atentamente, Javier
yazid



Joined: 28 Dec 2007
Posts: 2

View user's profile Send private message

PostPosted: Sat Dec 29, 2007 11:59 am     Reply with quote

good work javier,
have you tested writing text on your LCD?.
regards
javierviana



Joined: 27 Nov 2007
Posts: 4

View user's profile Send private message

main example
PostPosted: Wed Jan 16, 2008 12:46 pm     Reply with quote

Yes. This is the CCS’s example, a little modified to work with this driver.
Code:

#include "mg1903a.h"
#include "graphics.h"

#include <math.h>


#pragma zero_ram
void main()
{
  int1  warn = FALSE;
  int16  adc = 0L, adc_old = 0L;
  char  voltText[] = "Volts", warning[] = "Warning", W[] = "W";
  float theta = 0;

  inicializarMicro ();   // Inicializa los registros de configuración del MCU y perifericos.
  inicializarSD ();   // Inicializa las estructuras de datos utilizadas por el programa.
  activarSalidas ();   // Inicializar las salidas.

  glcd_rect(1, 5, 126, 15, NO, ON);   // Outline the bar
  glcd_text57(30, 18, voltText, 1, ON);   // Display "Volts"
  glcd_circle(145, 16, 10, NO, ON);   // Draw the clock circle

  while (TRUE)
  {
    adc = entradaAnalogica.valor;   // Read a value from the ADC
    displayVoltage (adc);      // Display the reading
    adc = (adc > 249L) ? 249L : adc;   // Keep the value 249 or less

    if(adc != adc_old)
    {
      glcd_rect (adc/2+1, 6, adc_old/2+1, 14, YES, OFF);   // Clears the old bar
      glcd_rect (1, 6, adc/2+1, 14, YES, ON);         // Draws a new bar
      adc_old = adc;                  // Set old value to new

      if (adc > 200 && !warn)   // Check if over 4 volts.
      {
        glcd_rect (68, 20, 110, 28, YES, ON);   // Draw a filled black rectangle
        glcd_text57 (70, 21, warning, 1, OFF);   // Write "Warning" on the LCD
        glcd_text57 (165, 10, W, 2, ON);   // Escribir una W con el doble de tamaño.
        warn = TRUE;
      }
      else if (adc <= 200 && warn)
      {
        glcd_rect (68, 20, 110, 28, YES, OFF);   // Draw a filled white rectangle
        glcd_rect (165, 10, 180, 28, YES, OFF);   // Draw a filled white rectangle
        warn = FALSE;
      }
    }

    // The following 3 lines make the clock hand spin around
    glcd_line (145, 16, 145+(int)(8*sin(theta)+.5), 16-(int)(8*cos(theta)+.5), OFF);
    theta = (theta > 5.9) ? 0 : (theta += .3);
    glcd_line (145, 16, 145+(int)(8*sin(theta)+.5), 16-(int)(8*cos(theta)+.5), ON);

    glcd_update ();
//    delay_ms(100);    // Reduces flicker by allowing pixels to be on much longer than off.
  }
}

_________________
Atentamente, Javier
yazid



Joined: 28 Dec 2007
Posts: 2

View user's profile Send private message

PostPosted: Thu Jan 31, 2008 4:32 am     Reply with quote

thank you for your great reply
best regards
cbarberis



Joined: 01 Oct 2003
Posts: 172
Location: Punta Gorda, Florida USA

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

PostPosted: Tue Mar 18, 2008 7:55 pm     Reply with quote

I have tried the above driver with a CrystalFontz module using a ST7920 and cannot get it to work.
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