I have seen how helpfull henri has been, and was impressed and hopefull that I could receive some help here.
I have got to interface this LCD to a Atmel Mega 128 processor. At the present stage, after following all the information provided to me through data sheets etc, i cannot get it to display a single thing...
The language i am using is C.
This is my code so far, just for initialisation....and i get nothing....?
Code:
//ICC-AVR application builder : 3/20/2003 5:32:05 PM
// Target : M128
// Crystal: 8.0000Mhz
#include <iom128v.h>
#include <macros.h>
//# define for LCD controls
#define CELO PORTA &= 0xBF //set chip enable on
#define CEHI PORTA |= ~0xBF //set chip enable off
#define WRLO PORTG &= 0x1B //set write signal enable
#define WRHI PORTG |= ~0x1B //set write signal off
#define RDLO PORTA &= 0x7F //set read sig enable
#define RDHI PORTA |= ~0x7F //set read sig off
#define CDLO PORTA &= 0xDF //set CD sig low
#define CDHI PORTA |= ~0xDF //set CD high
#define Reset_on PORTA &= 0xEF //reset LCD
#define Reset_off PORTA |= ~0xEF //stop reset
#define reset PORTF = 0x00 //turn off LED's
//#define for LED indicators on and off
#define LED_STS1 PORTF |= 0x04 //turn status LED on
#define LED_STS0 PORTF &= ~0x04 //turn status LED off
void port_init(void)
{
PORTA = 0xF0;
DDRA = 0xFF;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0xFF;
PORTD = 0x00;
DDRD = 0x00;
PORTE = 0x00;
DDRE = 0x06;
PORTF = 0x00;
DDRF = 0xFF;
PORTG = 0x04;
DDRG = 0x04;
}
void Delay_L(void) //this is a visible delay (long)
{
int x ; //define variables used
unsigned char y, z;
for (x = 1; x<25; x++)
{
//PORTF = 0x04 ; //turn on LED to indicate at this position
for (y = 1; y; y++)
{
for (z = 1; z; z++)
{
_NOP() ; //perform no operation
_NOP() ;
_NOP() ;
}
//PORTF = 0x00 ; //turn off indicator LED
}
}
}
void Delay(void) //short delay - cannot be detected by human eye
{
unsigned char a, b;
for (a=1; a; a++)
for (b=1; b; b++)
;
}
//call this routine to initialise all peripherals
void init_devices(void) /*This routine is inserted by the built in wizard*/
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x00; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialised
}
void CE_strobe(void) //takes chip enable low and then high
{ //after a short delay
CELO ;
_NOP() ;
_NOP() ;
CEHI ;
return ;
}
unsigned char Status_return(void) //enables specfic status check
{ //returns full status for user to check in main code
unsigned char status1 ; //variable for storing status
DDRC = 0x00 ; //sets up port c for input
CDHI ; //sets up ports correctly for reading in from LCD
RDLO ;
WRHI ;
CELO ;
Delay() ;
status1 = PINC ; //reads the values on all pins of port C
CEHI ;
DDRC = 0xFF ;
return (status1) ; //returns the status to the main
}
void Status_chk(void) //a generic status check with pins 1 & 2 not busy
{ //returns to position when called & executed
unsigned char status2, w ; //continues to check until status ok
DDRC = 0x00 ; //sets up port c for input
CDHI ; //sets up ports correctly for reading in from LCD
RDLO ;
WRHI ;
do
{
CELO ; //set CE low
_NOP() ;
_NOP() ;
status2 = PINC ; //read status of port C
CEHI ; //sets ce high again
w = status2 & 0x03 ; // does logical and with 0000 0011
}
while (w != 0x03) ; //this checks if status of bits 0 & 1 is ok to go
DDRC = 0xFF ; //set portC back to output port
//port_init() ; //reset ports to orig and these must be
//set by each operation after status check
//LED_STS1 ; //turns on LED's to indicate that status is ok.
return ;
}
void data_w(void)
{
CDLO ; //setting ports for a data write
WRLO ; //CD taken low, WE low, RD hi
RDHI ;
Status_chk() ; //check LCD status for write
CE_strobe() ; //strobe chip enable to write data
return ;
}
void data_r(void)
{
CDLO ;
RDLO ;
WRHI ;
return ;
}
void command_w(void)
{
CDHI ;
WRLO ;
RDHI ;
Status_chk() ;
CE_strobe() ;
return ;
}
void LCD_init(void)
{
//mode
PORTC = 0x80 ; //put 0x80 to port C to set mode of LCD
//"or" mode with built in ROM enabled
command_w() ; //write command to LCD controller
//control word - graphic home add
PORTC = 0x00 ; //put 00 on port C twice to set graphic home add
data_w() ; //and write it to the LCD
PORTC = 0x00 ;
data_w() ;
PORTC = 0x42 ; //put 0x42 on port C - signifies Graphic home add
command_w() ; //write to LCD
//graphic area
PORTC = 0x1E ; //set graphics area - 1E is 30 columns
data_w() ;
PORTC = 0x00 ;
data_w() ;
PORTC = 0x43 ; //graphic area command tag
command_w() ;
//text home address
PORTC = 0x00 ; //send 00 to port C to set text home add lower
data_w() ;
PORTC = 0x10 ; //send 10 to port C to set text home add upper
data_w() ;
PORTC = 0x40 ; //text home add set command
command_w() ;
//text area set
PORTC = 0x1E ; //no. of text area = 30 colums
data_w() ;
PORTC = 0x00 ;
data_w() ;
PORTC = 0x41 ; //text area set cmd
command_w() ;
}
void main(void)
{
unsigned char st = 0x00, gp = 0x00 ; //stat, b ;
init_devices();
Reset_on ; //Hardware LCD reset
Delay_L() ; //Delay >=1ms
Reset_off ; //Set reset back to high
//Status_chk() ;
LCD_init() ;
PORTF = 0x04 ; //turns on status LED to indicate initialisation
//complete
Delay_L() ;
//port_init() ;
//PORTF = 0x02 ;
/* do
{
st = Status_return() ;
gp = st & 0x03 ;
}
while (gp != 0x03) ;
PORTF = st ;
*/
PORTC = 0x90 ; //ensure cursor is off
command_w() ;
//Delay_L() ;
//Status_chk() ;
do
{
st = Status_return() ;
gp = st & 0x03 ;
}
while (gp != 0x03) ;
PORTF = st ;
PORTC = 0x93 ; //turn cursor on and blink
command_w() ;
Delay_L() ;
//reset ;
PORTC = 0x01 ; //to set cursor position
data_w() ;
PORTC = 0x01 ;
data_w() ;
PORTC = 0x21 ;
command_w() ;
PORTC = 0x00 ; //8 line width cursor
data_w() ;
PORTC = 0x00 ;
data_w() ;
PORTC = 0xA7 ;
command_w() ;
do
{
st = Status_return() ;
gp = st & 0x03 ;
}
while (gp != 0x03) ;
PORTF = st ;
}
These final status checks are to get the status back and display it on some led's i have hooked up - that is all.
If someone could help i would be eternally gratefull....
NOTE: if anyone wants a picture of the layout i can provide that - just ask