LCDInfo.com
http://forum.lcdinfo.com/

PIC Adapted Rotine to T6963C LCD 240x64
http://forum.lcdinfo.com/viewtopic.php?f=9&t=2963
Page 1 of 1

Author:  Pbranquinho [ Mon Apr 05, 2010 1:29 ]
Post subject:  PIC Adapted Rotine to T6963C LCD 240x64

Hi.

I was adapted the rotine developed by John P. Beale, write to work with PC parallel port, to work with PIC microcontroler.

Original rotine:

http://www.skippari.net/lcd/controlt6963c_c.txt


Adapted rotine:

/* ----------------------------------------------------------
* Program to control a T6963C-based 240x64 pixel LCD display
* using the Microchip PIC16F648A Microcontroller
* written in CCS C++
*
* Original Written by John P. Beale May 3-4, 1997 beale@best.com
* Adapted by Plínio Branquinho Apr 5, 2010 plinio.branquinho@hotmail.com
*
* Based on information from Steve Lawther,
* "Writing Software for T6963C based Graphic LCDs", 1997 which is at
* http://ourworld.compuserve.com/homepage ... t6963c.pdf
*
* and the Toshiba T6963C data sheet, also on Steve's WWW page
*
* and info at: http://www.citilink.com/~jsampson/lcdindex.htm
* http://www.cs.colostate.edu/~hirsch/LCD.html
* http://www.hantronix.com/
* ----------------------------------------------------------*/

// Pin numbers refer to pins on PIC16F648A.
// Recall that SEL (pin 17), LF (14), and STROBE (1) control ouputs
// are inverted, but Init (16) is true.
//
// LCD pin numbering for TOSHIBA TLX-711A-E0 (uses T6963C controller)
//
// LCD Pin ----- PC Port Pin Status Reg. bit
// ------------------------------------------
// C/D (8) <--> RA1(17) /SEL 3
// /WR (5) <--> RA6(16) Init 2
// /RD (6) <--> RA7(14) /LF 1
// /CE (7) <--> RA0(1) /Strobe 0
// -----------------------
// D0 (11) <--> RB0(2) D0
// D1 (12) <--> RB1(3) D1
// D2 (13) <--> RB2(4) D2
// D3 (14) <--> RB3(5) D3
// D4 (15) <--> RB4(6) D4
// D5 (16) <--> RB5(7) D5
// D6 (17) <--> RB6(8) D6
// D7 (18) <--> RB7(9) D7
// GND (2) <--> GND
// --------------------------------------------------------------
// FG (1) frame ground
// +5V (3) LCD logic supply
// -7.8V (4) LCD display contrast
// FS (19) font select
// RST (10) active low
// --------------------------------------------------------------

#bit CE = 0x05.0 // CE (7) <--> RA0
#bit RD = 0x05.7 // RD (6) <--> RA7
#bit WR = 0x05.6 // WR (5) <--> RA6
#bit CD = 0x05.1 // C/D (8) <--> RA1

/* ----- Definitions concerning LCD internal memory ------ */

#define G_BASE 0x0200 // base address of graphics memory
#define T_BASE 0x0000 // base address of text memory
#define BYTES_PER_ROW 40 // how many bytes per row on screen

/* This will be 30 with 8x8 font, 40 with 6x8 font, for both
Text & Graphics modes. Font selection by FS pin on LCD module:
FS=High: 6x8 font. FS=Low: 8x8 font. */

/* ----------------------------------------------------------- */
#define XMAX 239 // limits of (x,y) LCD graphics drawing
#define XMIN 0
#define YMAX 63
#define YMIN 0

#include <string>

void dput(int dbyte); // write data byte to LCD module
int dget(void); // get data byte from LCD module
int sget(void); // check LCD display status pbrt
void cput(int dbyte); // write command byte to LCD module
void lcd_setup(); // make sure control lines are at correct levels
void lcd_init(); // initialize LCD memory and display modes
void lcd_print(char *string); // send string of characters to LCD
void lcd_clear_graph(); // clear graphics memory of LCD
void lcd_clear_text(); // clear text memory of LCD
void lcd_xy(int x, int y); // set memory pointer to (x,y) position (text)
void lcd_setpixel(int column, int row); // set single pixel in 240x64 array

#define home() dput(T_BASE%256);dput(T_BASE>>8);cput(0x24); // upper-left

void lcd_clear_graph() // clear graphics memory of LCD
{
long int i;

dput(G_BASE%256);
dput(G_BASE>>8);
cput(0x24); // addrptr at address G_BASE

for (i=0;i<2560>>8);
cput(0x24); // addrptr at address T_BASE

for (i=0;i<320;i++) {
dput(0); cput(0xc0); // write data, inc ptr.
} // end for(i)

} // lcd_clear_text()

/* ----------------------------------------------------------- */

void lcd_print(char *string) // send string of characters to LCD
{
int i;
int c;

for (i=0;i<strlen(string);i++) {
c = string[i] - 0x20; // convert ASCII to LCD char address
if (c<0>>8); cput(0x24); // set LCD addr. pointer
cput(0xf8 | (5-(column%6)) ); // set bit-within-byte command

} // end lcd_setpixel()

/* ----------------------------------------------------------- */

void lcd_xy(int x, int y) // set memory pointer to (x,y) position (text)
{
int addr;

addr = T_BASE + (y * BYTES_PER_ROW) + x;
dput(addr%256); dput(addr>>8); cput(0x24); // set LCD addr. pointer

} // lcd_xy()

/* ==============================================================
* Low-level I/O routines to interface to LCD display
* based on four routines:
*
* dput(): write data byte
* cput(): write control byte
* dget(): read data byte (UNTESTED)
* sget(): read status
* ============================================================== */

void lcd_setup() // make sure control lines are at correct levels
{
CE=1; //HI; // disable chip
RD=1; //HI; // disable reading from LCD
WR=1; //HI; // disable writing to LCD
CD=1; //HI; // command/status mode
set_tris_b(0x00); //DATAOUT; // make 8-bit parallel port an output port
} // end lcd_setup()

/* ----------------------------------------------------------- */

void lcd_init() // initialize LCD memory and display modes
{
dput(G_BASE%256);
dput(G_BASE>>8);
cput(0x42); // set graphics memory to address G_BASE

dput(BYTES_PER_ROW%256);
dput(BYTES_PER_ROW>>8);
cput(0x43); // n bytes per graphics line

dput(T_BASE%256);
dput(T_BASE>>8);
cput(0x40); // text memory at address T_BASE

dput(BYTES_PER_ROW%256);
dput(BYTES_PER_ROW>>8);
cput(0x41); // n bytes per text line

cput(0x80); // mode set: Graphics OR Text, ROM CGen

cput(0xa7); // cursor is 8 lines high
dput(0x00);
dput(0x00);
cput(0x21); // put cursor at (x,y) location

cput(0x97); // Graphics & Text ON, cursor blinking
// (For cursor to be visible, need to set up position)

} // end lcd_init()

/* ----------------------------------------------------------- */

int sget(void) // get LCD display status byte
{
int lcd_status;

set_tris_b(0xFF); //DATAIN; // make 8-bit parallel port an input
CD=1; //HI; // bring LCD C/D line high (read status byte)
RD=0; //LO; // bring LCD /RD line low (read active)
CE=0; //LO; // bring LCD /CE line low (chip-enable active)
lcd_status = portb; //inp(pdata); // read LCD status byte
CE=1; //HI; // bring LCD /CE line high, disabling it
RD=1; //HI; // deactivate LCD read mode
set_tris_b(0x00); //DATAOUT; // make 8-bit parallel port an output port

return(lcd_status);
} // sget()

/* ----------------------------------------------------------- */

void dput(int dbyte) // write data byte to LCD module over par. port
// assume PC port in data OUTPUT mode
{
do {} while ((0x03 & sget()) != 0x03); // wait until display ready
CD=0; //LO;
WR=0; //LO; // activate LCD's write mode
portb = dbyte; //outp(pdata, byte); // write value to data port
CE=0; //LO; // pulse enable LOW > 80 ns (hah!)
CE=1; //HI; // return enable HIGH
WR=1; //HI; // restore Write mode to inactive

// using my P5/75 MHz PC with ISA bus, CE stays low for 2 microseconds

} // end dput()

/* ----------------------------------------------------------- */

int dget(void) // get data byte from LCD module
{
int lcd_byte;

do {} while ((0x03 & sget()) != 0x03); // wait until display ready
set_tris_b(0xFF); //DATAIN; // make PC's port an input port
WR=1; //HI; // make sure WRITE mode is inactive
CD=0; //LO; // data mode
RD=0; //LO; // activate READ mode
CE=0; //LO; // enable chip, which outputs data
lcd_byte = portb; //inp(pdata); // read data from LCD
CE=1; //HI; // disable chip
RD=1; //HI; // turn off READ mode
set_tris_b(0x00); //DATAOUT; // make 8-bit parallel port an output port

return(lcd_byte);
} // dget()

/* ----------------------------------------------------------- */

void cput(int dbyte) // write command byte to LCD module
// assumes port is in data OUTPUT mode
{
do {} while ((0x03 & sget()) != 0x03); // wait until display ready

portb = dbyte; //outp(pdata, byte); // present data to LCD on PC's port pins

CD=1; //HI; // control/status mode
RD=1; //HI; // make sure LCD read mode is off
WR=0; //LO; // activate LCD write mode
CE=0; //LO; // pulse ChipEnable LOW, > 80 ns, enables LCD I/O
CE=1; //HI; // disable LCD I/O
WR=1; //HI; // deactivate write mode

} // cput()

/* ----------------------------------------------------------- */

Enjoy :-)

Author:  Pbranquinho [ Tue Apr 06, 2010 22:33 ]
Post subject:  A little example to use.

Following a little example to use the "adapted rotine"

First you coppy all rotine and save as file like "24064PGB.c".
Now you can use this file like a library.

I make a simple project to print "TEST" on display, I copy all source here.

Souce code:

#include <16F648A>

#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=4000000)

#byte porta=5 //Define a Porta de Saida a como PortA, do registrador 5h
#byte portb=6 //Define a Porta de Saida b como PortB, do registrador 6h

#include <24064PGB>

char texto[20];

void main()
{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

// TODO: USER CODE!!

porta=0;
portb=0;
set_tris_a(0x00); // todo como saída
set_tris_b(0x00); // todo como entrada
porta=0;
portb=0;

lcd_setup();
lcd_init();
lcd_clear_text();
cput(0x97); // Graphics & Text ON, cursor blinking
lcd_xy(0,0);
texto = "TESTE";


do{


delay_ms(5000);
lcd_print(texto);
lcd_xy(0,0);

}while(true);


}

Page 1 of 1 All times are UTC + 2 hours
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/