hello
i'm french and english is not the best but a need your help. For my study, i must programme a LCD with s1d13700, so
it's my .c
#include <S1D13700.h>
S1D13700 glcd;
void setup()
{
}
void loop ()
{
glcd.initLCD();
and my library i modificator
#include "WProgram.h"
#include "S1D13700.h"
int d0=70 , d1 = 71 , d2 = 72 , d3 = 73 , d4 = 78 , d5 = 79 , d6 = 80 , d7 = 81 , rd = 74 , wr = 75 , a0 = 76 , cs = 77 , rst = 82; ====> iT's me
/*Constructor, set pin markers to their default values */
S1D13700::S1D13700(void)
{
this->pins.d0 = d0;
this->pins.d1 = d1;
this->pins.d2 = d2;
this->pins.d3 = d3;
this->pins.d4 = d4;
this->pins.d5 = d5; ====> iT's me
this->pins.d6 = d6;
this->pins.d7 = d7;
this->pins.rd = rd;
this->pins.wr = wr;
this->pins.a0 = a0;
this->pins.cs = cs;
this->pins.rst = rst;
}
/* This function is specified inline for speed reasons*/
inline void attribute ((always_inline)) setData(unsigned char data)
{
pinMode(d0,OUTPUT);
pinMode(d1,OUTPUT);
pinMode(d2,OUTPUT);
pinMode(d3,OUTPUT);
pinMode(d4,OUTPUT); ====> iT's me
pinMode(d5,OUTPUT);
pinMode(d6,OUTPUT);
pinMode(d7,OUTPUT);
digitalWrite(d0, (data & 1));
digitalWrite(d1, ((data & (1 << 1)) >> 1));
digitalWrite(d2, ((data & (1 << 2)) >> 2));
digitalWrite(d3, ((data & (1 << 3)) >> 3));
digitalWrite(d4, ((data & (1 << 4)) >> 4)); ====> iT's me
digitalWrite(d5, ((data & (1 << 5)) >> 5));
digitalWrite(d6, ((data & (1 << 6)) >> 6));
digitalWrite(d7, ((data & (1 << 7)) >> 7));
}
/*The S1D13700 is veyr picky about how things are timed
change these two routines at your own risk */
void S1D13700::writeCommand(unsigned char command)
{
setData(command);
digitalWrite(this->pins.wr, 0);
digitalWrite(this->pins.cs, 0);
digitalWrite(this->pins.wr, 1);
digitalWrite(this->pins.cs, 1);
}
void S1D13700::writeData(unsigned char data)
{
setData(data);
digitalWrite(this->pins.a0, 0);
digitalWrite(this->pins.cs, 0);
digitalWrite(this->pins.wr, 0);
digitalWrite(this->pins.cs, 1);
digitalWrite(this->pins.wr, 1);
digitalWrite(this->pins.a0, 1);
}
void S1D13700::initLCD(void)
{
/Set all control pins as
output and then set them high/
digitalWrite(this->pins.cs, 1);
digitalWrite(this->pins.wr, 1);
digitalWrite(this->pins.rd, 1);
digitalWrite(this->pins.a0, 1);
digitalWrite(this->pins.rst, 1);
pinMode(this->pins.cs, OUTPUT);
pinMode(this->pins.rst, OUTPUT);
pinMode(this->pins.a0, OUTPUT);
pinMode(this->pins.wr, OUTPUT);
pinMode(this->pins.rd, OUTPUT);
hardReset();
/* Now we are going to issue the system set command
and specify operating paramters. If these need to
change for your application, you must study the
S1D13700 datasheet and change the values in
S1D13700.h */
writeCommand(S1D13700_SYSTEM_SET);
delayMicroseconds(1000);
writeData(S1D13700_SYS_P1);
delayMicroseconds(1);
writeData(S1D13700_SYS_P2);
delayMicroseconds(1);
writeData(S1D13700_FY);
delayMicroseconds(1);
writeData(S1D13700_CR);
delayMicroseconds(1);
writeData(S1D13700_TCR);
delayMicroseconds(1);
writeData(S1D13700_LF);
delayMicroseconds(1);
writeData(S1D13700_APL);
delayMicroseconds(1);
writeData(S1D13700_APH);
writeCommand(S1D13700_SCROLL);
writeData(S1D13700_SAD1L);
writeData(S1D13700_SAD1H);
writeData(S1D13700_SL1);
writeData(S1D13700_SAD2L);
writeData(S1D13700_SAD2H);
writeData(S1D13700_SL2);
writeData(S1D13700_SAD3L);
writeData(S1D13700_SAD3H);
writeData(S1D13700_SAD4L);
writeData(S1D13700_SAD4H);
writeCommand(S1D13700_CSRFORM);
writeData(S1D13700_CRX);
writeData(S1D13700_CSRF_P2);
writeCommand(S1D13700_CGRAM_ADR);
writeData(S1D13700_SAGL);
writeData(S1D13700_SAGH);
writeCommand(S1D13700_CSRDIR_R);
writeCommand(S1D13700_HDOT_SCR);
writeData(S1D13700_SCRD);
writeCommand(S1D13700_OVLAY);
writeData(S1D13700_OVLAY_P1);
writeCommand(S1D13700_DISP_ON);
writeData(S1D13700_FLASH);
}
unsigned char S1D13700::readData(void)
{
unsigned char tmp;
digitalWrite(this->pins.cs, 0);
#ifdef S1D13700_CUSTOM_DATA_PINS
pinMode(this->pins.d0, INPUT);
pinMode(this->pins.d1, INPUT);
pinMode(this->pins.d2, INPUT);
pinMode(this->pins.d3, INPUT);
pinMode(this->pins.d4, INPUT);
pinMode(this->pins.d5, INPUT);
pinMode(this->pins.d6, INPUT);
pinMode(this->pins.d7, INPUT);
#endif
digitalWrite(this->pins.rd, 0);
/*S1D13700 takes a bit to output data after the RD pin goes low.
We must force a delay */
READDELAY();
#ifdef S1D13700_CUSTOM_DATA_PINS
tmp = (digitalRead(this->pins.d7) << 7) | (digitalRead(this->pins.d6) << 6) |
(digitalRead(this->pins.d5) << 5) | (digitalRead(this->pins.d4) << 4) |
(digitalRead(this->pins.d3) << 3) | (digitalRead(this->pins.d2) << 2) |
(digitalRead(this->pins.d1) << 1) | (digitalRead(this->pins.d0));
//#else
//tmp = FIXED_PIN;
#endif
digitalWrite(this->pins.cs, 1);
digitalWrite(this->pins.rd, 1);
return tmp;
}
void S1D13700::hardReset(void)
{
digitalWrite(this->pins.rst, 0);
delay(50);
digitalWrite(this->pins.rst, 1);
delay(50);
}
void S1D13700::writeText(char * text)
{
writeCommand(S1D13700_MWRITE);
while(*text)
{
writeData(*text++);
}
}
/*Set a single pixel. We have to read a byte in, modify the appropriate bit
then write is back out */
void S1D13700::setPixel(unsigned int x,unsigned int y, unsigned char state = 1)
{
unsigned char tmp = 0;
unsigned int address = S1D13700_GRAPHICSTART + (40 * y) + (x/8);
setCursorAddress(address);
writeCommand(S1D13700_MREAD);
tmp = readData();
if(state)
{
tmp |= (1 << (S1D13700_FX - (x % 8)));
}
else
{
tmp &= ~(1 << (S1D13700_FX - (x % 8)));
}
setCursorAddress(address);
writeCommand(S1D13700_MWRITE);
writeData(tmp);
}
void S1D13700::setCursorAddress(unsigned int address)
{
writeCommand(S1D13700_CSRW);
writeData((unsigned char)(address & 0xFF));
writeData((unsigned char)(address >> 8));
}
/*This function should be called before text is written
each time */
void S1D13700::textGoTo(unsigned char x, unsigned char y)
{
setCursorAddress((y * 40) + x);
}
void S1D13700::graphicGoTo(unsigned int x, unsigned int y)
{
setCursorAddress(S1D13700_GRAPHICSTART + (y * 40) + x/8);
}
void S1D13700::clearText(void)
{
int i;
textGoTo(0,0);
writeCommand(S1D13700_MWRITE);
for(i = 0; i < 1200; i++)
{
writeData(' ');
}
}
thanks