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