|
|
View previous topic :: View next topic |
Author |
Message |
javierviana
Joined: 27 Nov 2007 Posts: 4
|
Graphic LCD driver ST7920 |
Posted: Tue Nov 27, 2007 8:37 am |
|
|
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
|
Graphic LCD driver ST7920 |
Posted: Fri Dec 07, 2007 4:45 am |
|
|
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
|
|
Posted: Fri Dec 07, 2007 4:52 am |
|
|
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
|
|
Posted: Sat Dec 29, 2007 11:59 am |
|
|
good work javier,
have you tested writing text on your LCD?.
regards |
|
|
javierviana
Joined: 27 Nov 2007 Posts: 4
|
main example |
Posted: Wed Jan 16, 2008 12:46 pm |
|
|
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
|
|
Posted: Thu Jan 31, 2008 4:32 am |
|
|
thank you for your great reply
best regards |
|
|
cbarberis
Joined: 01 Oct 2003 Posts: 172 Location: Punta Gorda, Florida USA
|
|
Posted: Tue Mar 18, 2008 7:55 pm |
|
|
I have tried the above driver with a CrystalFontz module using a ST7920 and cannot get it to work. |
|
|
|
|
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
|