How to write in C for LCD? Programming AT91SAM7S64

OP #1172974
Rate this post
• ▲ useful
▼ not useful
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
}

Reply

Note: the original post is older than 6 months. Please don't ask any new questions in this thread, but start a new one.

Formatting
  • [c]C-Code[/c]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]
  • [[Title]] – link to an article
  • Link to another post: right-click its post ID (#8078628), copy the address, paste it into the text

More about formatting

Post long source code as an attachment, not in the text.

Already registered? Log in

Not shown to anyone. We send you a link; your post appears once you confirm it there.

By submitting you create a free account and accept the terms of use.