You are on page 1of 32

HARDWARE INTERFACES TO

8051
1. LCD
2. KEYBOARD
3. ADC
4. DAC
5. STEPPER MOTOR
6. DC MOTOR
• When data is supplied to data pins, a high- to –
low pulse must be applied to ENABLE pin in
order to latch data present at the data lines.
• Rs=0 to check busy flag bit, the busy flag is D7 &
can be read when R/w =1. if D7=1, lCD is busy
doing some other task, so will not accept any
other data. When D7 goes to 0 , LCD is ready to
receive new data.
• Few commands:
1 clear display
6 increment cursor
38  2 lines 5x7 matrix
In LCD one can put data at any location.
RS R/w DB7 Db6 to Db0
0 0 1 Laaaaaa
L=0 for line 1
L=1 for line 2
# include<reg52.h>
Sfr ldata=0x80;
sbit rs=P3^7;
Sbit rw=P3^6;
sbit en=P3^5;
sbit busy=P0^7;
void delay(unsigned int);
void lcdcmd(unsigned char value);
void lcddata(unsigned char value);
void lcdready();
unsigned char idata msg[15]="HELLO EVERYONE";
unsigned char i;
void main()
{
lcdcmd(0x38);
lcdcmd(0x0e);
lcdcmd(0x01);
lcdcmd(0x06);
lcdcmd(0x80);

for(i=0;i<=13;i++)
{
lcddata(msg[i]);
}
}
void lcdcmd(unsigned char value)
{
lcdready();
ldata=value;
rw=0;
en=1;
rs=0;
delay(1);
en=0;return;
}

void lcddata(unsigned char value)


{
lcdready();
ldata=value;
rw=0;
en=1;
rs=1;
delay(1);
en=0;
return;
}
void lcdready()
{
busy=1;
rs=0;
rw=1;
while(busy==1)
{
en=0;
delay(1);
en=1;
}
return;
}

void delay (unsigned int value)


{
unsigned int x,y;
for(x=0;x<50;x++)
for(y=0;y<value;y++);
return;
}
+5V +5V +5V +5V

1 2 3 /
P 2.0
4 5 6 *
P 2.1

7 8 9 --
P 2.2

C 0 % +
P 2.3

P 2.4 P 2.5 P 2.6 P 2.7


# include<reg52.h>
sfr ldata=0x80;
sbit rs=P3^7;
sbit rw=P3^6;
sbit en=P3^5;
sbit busy=P0^7;
void delay(unsigned int);
void lcdcmd(unsigned char value);
void lcddata(unsigned char value);
void lcdready();
unsigned char getkey();
unsigned char i,j,key=0;
unsigned char idata msg[11]="KEY PRESSED";
unsigned char idata keypad[4][4]={'1','2','3','/','4','5','6','*','7','8','9','-','c','0','%','+'};
void main()
{
lcdcmd(0x38);
lcdcmd(0x0e);
lcdcmd(0x01);
lcdcmd(0x06);
lcdcmd(0x80);
void lcdcmd(unsigned char value)
{
lcdready();
ldata=value;
for(i=0;i<=11;i++)
{ rw=0;
lcddata(msg[i]); en=1;
} rs=0;
delay(1);
en=0;return;
}
while(1) void lcddata(unsigned char value)
{
{
lcdcmd(0xc3);
getkey(); lcdready();
lcddata(key); ldata=value;
delay(10); rw=0;
} en=1;
rs=1;
} delay(1);
en=0;
return;
}
void lcdready()
{
busy=1;
rs=0;
rw=1;
while(busy==1)
{
en=0;
delay(1);
en=1;
}
return;
}

void delay (unsigned int value)


{
unsigned int x,y;
for(x=0;x<50;x++)
for(y=0;y<value;y++);
return;
}
Keyboard
unsigned char getkey() Do // wait till key is pressed

{ {

unsigned char colloc,rowloc; delay(1);

do // to remove previous key colloc=P2;

{ colloc&=0xf0;

P2=0xf0; }while(colloc==0xf0);

colloc=P2;

colloc&=0xf0; delay(10);

}while(colloc!=0xf0); colloc=P2;

Do // switch debounce colloc&=0xf0;

{ }while(colloc==0xf0);
while(1)
{
P2=0xfe;
colloc=P2;
colloc&=0xf0;
if(colloc!=0xf0)
{
rowloc=0;
break;
}
P2=0xfd;
colloc=P2;
colloc&=0xf0;
if(colloc!=0xf0)
{
rowloc=1;
break;
P2=0xfb;
colloc=P2;
colloc&=0xf0;
if(colloc!=0xf0)
{
rowloc=2;
break;
}
P2=0xf7;
colloc=P2;
colloc&=0xf0;
rowloc=3;
break;
}
if(colloc==0xe0)key=(keypad[rowloc][0]);
else if(colloc==0xd0)key=(keypad[rowloc][1]);
else if(colloc==0xb0)key=(keypad[rowloc][2]);
else
key =(keypad[rowloc][3]);
return(key);
}
• ADC0804 Chip
8 bit parallel , needs +5V works, 8 bit
resolution.
CS : Chip select active low input to activate.
RD(read): active low, negative edge
WR ( start of conversion): positive edge triggers
Clk IN & Clk R: to work with external clock
connect to clkIN, OR to use internal clock
connect resistor & capacitor. F= 1/ 1.1 RC
INTR ( end of conversion) : active low, normally high
and when the conversion is finished it goes low.
Vin (+) , Vin (-), Gnd: Vin = Vin(+) – Vin(-)
or Vin(-) is connected to Gnd. Vin(+) is analog signal
Vcc: +5V
Vref/2: reference voltage, it represents the maximum
value of input analog voltage.
if its 2V: analog i/p will be 0 to 4V,
step size 4/256= 15.62mV
D0 – D7: digital data output pins
Dout = Vin / Step size
ADC Program:
RD BIT P2.5
WR BIT P2.6
INTR BIT P2.7
MYDATA EQU P1 CLR RD
MOV P1,#0FFH MOV A, MYDATA
ACALL
SETB INTR CONVERSION
BACK: CLR WR ACALL DISPLAY
SETB WR SETB RD
HERE: JB INTR,HERE SJMP BACK
Programming 0804 in C
#include <reg51.h> {
Sbit RD =P2^5; WR=0;
Sbit WR =P2^6; WR=1;
Sbit INTR =P2^7; WHILE( INTR==1);
SFR MYDATA = P1; RD=0;
Void main() VALUE=MYDATA;
{ MYDATA= 0XFF; CONVERTNDISPLAY(VALUE);
INTR=1; RD=1;
RD=1; }
IN 0 D0

IN 7 D7

Vref (+)
Vref (-)

SC 01
ALE 10 OE 01
EOC

C B A
VCC
RD
CS
CH1
WR
CH2
INTR
CH3
DB0/ MA0
CH4
DB1/ MA1
CH5
DB2/ MA2
CH6
DB3/ MA3, 1
CH7
DB4/ MA4, 0
CH8
DB5
AGND
DB6
Vref
DB7
DGND
ADC

• # include<reg52.h> char);
• sbit rd=P1^1; • void main()
• sbit wr=P1^2; • {
• sbit intr=P1^3; • unsigned char value;
• sbit aen=P1^0; • lcdcmd(0x38);
• sfr mydata1=0xA0; • lcdcmd(0x0e);
• sfr ldata=0x80; • lcdcmd(0x01);
• sbit rs=P3^7; • lcdcmd(0x06);
• sbit rw=P3^6; • lcdcmd(0x83);
• sbit en=P3^5; • lcddata('T');
• sbit busy=P0^7; • mydata1=0xff;
• void delay(unsigned int); • ldata=0x00;
• void lcdcmd(unsigned char value);
• void lcddata(unsigned char value); • while(1)
• void lcdready(); • {
• void convert_display(unsigned
• aen=0; • unsigned char
• wr=0; x,d1,d2,d3,data1,data2,data3;
• wr=1; • x=value/10;
• while(intr==1); • d1=value%10;
• rd=0; • d2=x%10;
• value=mydata1; • d3=x/10;
• value=value-114; • data1=d1|0x30;
• lcdcmd(0xc7); • data2=d2|0x30;
• • data3=d3|0x30;
convert_display(value); • lcddata(data3);
• rd=1; • lcddata(data2);
• delay(10); • lcddata(data1);
• } • return;
• } • }

• void convert_display(unsigned
char value)
• {
Vdd
CH0
SCLK
CH1
CS
CH2
DIN
CH3
SSTRB (END)
CH4
DOUT
CH5
DGND
CH6
AGND
CH7
REFOUT(INTERNAL REF
COM VOLT)
(POWER SAVE) SHDN REFIN (REF I/P)
MAX1112 CONTROL WORD
START SEL2 SEL1 SEL0 UNi/BIP SGL/DF PD1 PD0

START: Must be high to indicate the beginning of control byte


SEL2,SEL1.SEL0 : To select channel
UNI/ BIP: 1: unipolar: digital data output is binary
0: bipolar: digital data output is 2’s complement
SGL/ DF: 1: single ended, 0: differential
PD1: 1= full operational
0= power save
PD0: 1= external clock, SCLK
0= internal clock, SSTRB indicates end of conversion
MC 1408 DAC (DAC 0808)
• Iout= Iref ( D7/2 + D6/4 + D5/8…..+ D0/256)

• MOV A,#00H
• MOV P1,A
• BACK: INC A
• SJMP BACK
Iout=1.99mA
Vout= 1.99mA* 5K= 9.96V
Sine wave

#include<reg52.h>

void main()
{ unsigned char idata table [180]= {128,132,136,141,154,150,150,154,158,163,167,171,175,
180,188,192,195,199,203,206,210,213,216,220,223,226,228,231,234,236,238,241,243,244,246,24,
7,248,249,250,231,228,226,223,220,216,213,210,216,203,199,195,192,188,184,180,175,171,167,
163,158,154,150,145,141,136,132,128,123,119,114,110,105,101,97,92,88,84,83,75,71,67,64,60,
56,52,49,45,39,35,32,29,27,24,21,19,17,14,12,11,9,7,6,4,3,2,1,1,0,0,0,0,0,0,0,1,1,2,3,42,
45,49,52,56,60,64,67,71,75,80,84,88,92,97,101,105,110,114,119,123,128};

unsigned char i;
while(1)
{
for(i=0;i<180;i++)
{
P0=table[i];
}
}
}
SQUARE WAVE
#include<reg52.h>
void delay(unsigned int);
void main()
{

while(1)
{
P0=255;
delay(1);
P0=0;
delay(1);
}
}
void delay (unsigned int value)
{
unsigned int x,y;
for(x=0;x<100;x++)
for(y=0;y<value;y++);
}
TRIANGULAR WAVE

#include<reg52.h>
void main()
{
unsigned char x,i;
while(1)
{
for(x=0;x<255;x++)
{
for(i=0;i<5;i++)
P0=x;
}
for(x=255;x>0;x--)
{
for(i=0;i<5;i++)
P0=x;
}
}
}
DC Motor
# include<reg51.h> msdelay(10);
void msdelay( unsigned int); mtr_1=0;
mtr_2=1;
sbit on = P1^0; msdelay(10);
sbit mtr_1 = P0^7; }
sbit mtr_2 = P0^4; }
void msdelay( unsigned int
void main() count)
{ {
on=1; unsigned int x,y;
while(on) for(x=0;x<5000;x++)
{ for(y=0;y<count;y++);
mtr_2=0; }
mtr_1=1;
Stepper Motor
#include<reg52.h> delay(f);
void delay( unsigned int); P0=0x33;
sbit on = P1^0; delay(f);
void main() P0=0x33;
{ delay(f);
unsigned int f; P0=0x99;
while(on) delay(f);
{ P0=0xcc;
P0=0x66; delay(f);
msdelay(f); P0=0x66;
P0=0xcc; delay(f);
msdelay(f); }
P0=0x99;
void delay( unsigned int count)
{
unsigned int x,y;
for(x=0;x<60;x++)
for(y=0;y<count;y++);
}

You might also like