where : ibrtses embedded

connecting a LM1100SYL 4x20 LCD to the 8535 in C

assume the LM1100SYL from SOLOMON, a 4x20 LCD with LED backlight being connected as :

; Display
;  PORTC	:parallel I/O bidirectional
;  PD5 : output :RS
;  PD6 : output :RW
;  PD7 : output :E

/*char LCD_Clear = 0x01;
char LCD_Inc =0x06;
char LCD_Off  =0x08;
char LCD_On =0x0C;
char LCD_OnC=0x0E; // with cursor
char LCD_OnB=0x0D; // with blink

;  PD5 : output :RS  low = & DF  high = |20
;  PD6 : output :RW  low = & BF  high = |40
;  PD7 : output :E   low = & 7F  high = |80
*/
#define LCD_Reset 0x3F
#define LCD_Off  0x08
#define LCD_Clear 0x01
#define LCD_Inc 0x06
#define LCD_OnC 0x0E
#define LCD_On 0x0C
#define LCD_OnB 0x0D

void wait100us(void)	// @ 4MHz
{
 char u1;
 for (u1=100; u1>0; u1--);
}
 

void LCD_WI(char u1) 
{
  PORTC = u1;		// instruction to port
  DDRC = 0xFF;		// as output
  PORTD = PORTD & 0xDF; // RS:=low
  PORTD = PORTD & 0xBF; // RW:=low
  PORTD = PORTD | 0x80; // E:=high
  _NOP();
  _NOP();
  _NOP();
  PORTD = PORTD & 0x7F; // E:=low
  PORTD = PORTD | 0x40; // RW:=high
  DDRC = 0x00;		// as input
}

void LCD_WD(char u1)
{
  PORTC = u1;		// instruction to port
  DDRC = 0xFF;		// as output
  PORTD = PORTD | 0x20; // RS:=high
  PORTD = PORTD & 0xBF; // RW:=low
  PORTD = PORTD | 0x80; // E:=high
  _NOP();
  _NOP();
  _NOP();
  PORTD = PORTD & 0x7F; // E:=low
  PORTD = PORTD | 0x40; // RW:=high
  DDRC = 0x00;		// as input
}

void LCD_Wait(void)
{
  char u1;
  PORTC = 0x00;		// clear port
  DDRC = 0x00;		// as input
  u1 = 0x80;
  while ((u1 & 0x80)!=0)
  {
  PORTD = PORTD & 0xDF; // RS:=low
  PORTD = PORTD | 0x40; // RW:=high
  PORTD = PORTD | 0x80; // E:=high
  _NOP();
  _NOP();
  u1 = PINC;
  u1 = PINC;
  _NOP();
  PORTD = PORTD & 0x7F; // E:=low
  }
}
void LCD_init(void)
{
 char u1;
 int uw;
 debugout(5);
 for (uw = 10000; uw>0; uw--){ wait100us(); } // wait 1s 
 debugout(6);
 LCD_WI(LCD_Reset);//LCD_Reset
 for (u1 = 40; u1>0; u1--){ wait100us(); } // wait 4ms
 LCD_WI(LCD_Reset);
 wait100us();
 LCD_WI(LCD_Reset);
 wait100us();
 LCD_WI(LCD_Off);
 wait100us();
 LCD_Wait();
 LCD_WI(LCD_Clear);
 wait100us();
 LCD_Wait();
 LCD_WI(LCD_Inc);
 wait100us();
 LCD_Wait();
 LCD_WI(LCD_OnC);
 wait100us();
 LCD_Wait();
}
void LCD_Adr(char u1)
{
 LCD_WI(u1 | 0x80);
 wait100us();
 LCD_Wait();
}
void LCD_Char(char u1)
{
 LCD_WD(u1);
 wait100us();
 LCD_Wait();
}
void LCD_CursorOn(void)
{
 LCD_WI(LCD_OnC);
 LCD_Wait();
}
void LCD_CursorOff(void)
{
 LCD_WI(LCD_On);
 LCD_Wait();
}

void LCD_CursorXY(char X,char Y)
{
 LCD_WI(LCD_OnC);
 LCD_Wait();
 switch (Y) {
  case 1: LCD_Adr(X); break;
  case 2: LCD_Adr(X+0x40); break;
  case 3: LCD_Adr(X+0x14); break;
  case 4: LCD_Adr(X+0x54); break;
 }
}

void LCD_StringY(char Y,mystring *S)
{
 char loop;
 // set adress
 switch(Y) {
  case 1:LCD_Adr(0x00); break;
  case 2:LCD_Adr(0x40); break;
  case 3:LCD_Adr(0x14); break;
  case 4:LCD_Adr(0x54); break;
 }
 for (loop =0; loop < (*S).len; loop++) {
   debugout((*S).s[loop]);
   LCD_Char((*S).s[loop]);
 }
}
use :

the string to be displayed are defined as :

typedef struct {char len; char s[16]; } mystring;

mystring displaybuffer ={16,"xxxxxxxxxxxxxxxx"};

LCD_init();
LCD_StringY(1,&displaybuffer);

displays the content of displaybuffer on the first line


disclaimer




Questions ?
Suggestions?
Feedback ?







sponsored links




AVR index
embedded software pages
home

last updated: 10.nov.99



Copyright (99,2001) Ing.Büro R.Tschaggelar