Hello! Please, help me.
I use Eclipse + gcc + JTAG to programm AT91SAM7S64. I get universal code
to use with my LCD with controller (hereunder). The lines like LCD.E=0;
Delay(>20ms); should be modified correctly and structure LCD with pins
sould be declared. I would like to understand how to use constructions
like LCD.E=1. Currently I use mask in my code:
In board.h define pins of LCD ----------------
#define DB0 (1<<0) // DB0 pin of LCD
#define DB1 (1<<1) // DB1 pin of LCD
#define DB2 (1<<2) // DB2 pin of LCD
#define DB3 (1<<3) // DB3 pin of LCD
#define A0 (1<<4) // A0 pin of LCD
#define RDRW (1<<5) // Read/Write pin
#define E (1<<6) // E pin
#define DB7 (1<<7) // DB7
#define DB6 (1<<9) // DB6
#define DB5 (1<<10) // DB5
#define DB4 (1<<11) // DB4
#define MY_MASK (DB0|DB1|DB2|DB3|A0|RDRW|E|DB7|DB6|DB5|DB4)
--------------------------------------------
And in main.c I write to init LCD something like this:
/// Swith off all pins
pPIO->PIO_CODR = E; //OFF
pPIO->PIO_CODR = A0; //OFF
pPIO->PIO_CODR = RDRW; //OFF
pPIO->PIO_CODR = DB7; //OFF
pPIO->PIO_CODR = DB6; //OFF
pPIO->PIO_CODR = DB5; //OFF
pPIO->PIO_CODR = DB4; //OFF
pPIO->PIO_CODR = DB3; //OFF
pPIO->PIO_CODR = DB2; //OFF
pPIO->PIO_CODR = DB1; //OFF
pPIO->PIO_CODR = DB0; //OFF
// Step 1
wait(150);
pPIO->PIO_CODR = E; //OFF
wait(10);
pPIO->PIO_CODR = A0; //OFF
pPIO->PIO_SODR = DB5; //ON
pPIO->PIO_SODR = DB4; //ON
pPIO->PIO_SODR = E; //ON
// Step 3
wait(100);
pPIO->PIO_CODR = E; //OFF
wait(10);
pPIO->PIO_SODR = DB5; //ON
......
----------------------------------------------
In PIC C I can make something like this
LCD={E==portA.1,A0==PortA.5, RDRW==portA.4, DB7==portA.7, ....,
DB0==portB4};
And use LCD.E=0; or LCD.1=0; in code. Or write LCD = 0x0040; without
pPIO->PIO_CODR etc.
How can I bild some structure with links to set of pins in gcc? And how
can I work with it without commands like "pPIO->" using just "=" and
HEX, DEC or binary numbers? I would like to use downloaded code
hereunder:
UNIVERSAL CODE FOR LCD: --------------------
#define MT10S1 //Type of LCD
#define Len1 8 //Symbols in first line of LCD
#define Len2 2 //Symbols in second line of LCD
#define Len3 0 //In 3th
#define Len4 0 //In 4th
const char Text1[Len1]={ 'M','E','L','T',' ','1','0','S' };
const char Text2[Len2]={ '1',24 };
void main(void) {
int i;
LCDinit();
WriteCmd(0x80); //Set cursor in start of first line
#if Len1>0
for(i=0;i<Len1;i++) { WriteData(Text1[i]); }
#endif
#if Len3>0
for(i=0;i<Len3;i++) { WriteData(Text3[i]); }
#endif
WriteCmd(0x80+0x40); //Set in start of second line
#if Len2>0
for(i=0;i<Len2;i++) { WriteData(Text2[i]); }
#endif
#if Len4>0
for(i=0;i<Len4;i++) { WriteData(Text4[i]); }
#endif
}
void LCDinit(void) {
LCD.E=0; Delay(>20ms);
//Set data pins for exit if needed
LCD.RW=0; LCD.A0=0; LCD.D=0x30; //8 bit interface setup
Delay(>40ns); //Pause
LCD.E=1; Delay(>230ns); //Время предустановки данных попало сюда
(tDSW)
LCD.E=0; Delay(>40us); //Пауза между командами
LCD.E=1; Delay(>230ns); //Минимально допустимая длительность сигнала
E=1
LCD.E=0; Delay(>40us); //Пауза между командами
LCD.E=1; Delay(>230ns);
LCD.E=0; Delay(>270ns); //Минимально допустимый интервал между
сигналами E=1
//Здесь индикатор входит в рабочий режим с установленным типом
интерфейса и можно подавать команды как обычно
WriteCmd(0x3A); //Настройка правильного режима ЖКИ
WriteCmd(0x0C); //Включение индикатора, курсор выключен
WriteCmd(0x01); //LCD CLEAR
WriteCmd(0x06); //Установка режима ввода данных: сдвигать курсор
вправо
}
void WriteCmd(byte b) { WriteByte(b,0); }
void WriteData(byte b) { WriteByte(b,1); }
void WriteByte(byte b, bit cd) {
//Сначала проверим готовность индикатора
//При необходимости настроить здесь шину данных на ввод
LCD.RW=1; LCD.A0=0; //Чтение флага занятости
Delay(>40ns); //Это время предустановки адреса (tAS)
LCD.E=1; Delay(>230ns); //Это минимально допустимая длительность
сигнала E=1 (информация на шину данных индикатором будет выдана раньше,
не более чем через 120нс)
while(LCD.D.7==1); //Ждать сброса флага занятости
LCD.E=0; Delay(>270ns); //Минимально допустимый интервал между
сигналами E=1
//При необходимости настроить здесь шину данных на вывод
LCD.RW=0; LCD.A0=cd; LCD.D=b;
Delay(>40ns); //Это время предустановки адреса (tAS)
LCD.E=1; Delay(>230ns); //Время предустановки данных попало сюда
(tDSW)
LCD.E=0; Delay(>270ns); //Минимально допустимый интервал между
сигналами E=1
}