Lecture 5
Lecture 5
INTERFACING
P2.2
.....
COMMAND:
ACALL READY ;is LCD ready?
LCD MOV
CLR
P1,A
P2.0
;issue command code
;RS=0 for command
INTERFACING CLR P2.1 ;R/W=0 to write to LCD
SETB P2.2 ;E=1 for H-to-L pulse
CLR P2.2 ;E=0,latch in
Sending Codes RET
and Data to DATA_DISPLAY:
ACALL READY ;is LCD ready?
LCDs w/ Busy MOV P1,A ;issue data
SETB P2.0 ;RS=1 for data
Flag CLR P2.1 ;R/W =0 to write to LCD
(cont’) +5V
SETB P2.2 ;E=1 for H-to-L pulse
8051 CLR P2.2 ;E=0,latch in
VCC
P1.0 D0 RET To read the command register, we make R/W=1,
VEE 10k READY: RS=0, and a H-to-L pulse for the E pin.
POT
LCD SETB P1.7 ;make P1.7 input port
VSS
CLR P2.0 ;RS=0 access command reg
P1.7 D7
SETB P2.1 ;R/W=1 read command reg
RS R/W E
;read command reg and check busy flag
BACK:SETB P2.2 ;E=1 for H-to-L pulse
P2.0 CLR P2.2 ;E=0 H-to-L pulse
JB P1.7,BACK ;stay until busy flag=0
P2.1
RET If bit 7 (busy flag) is high, the LCD is busy
P2.2 END
and no information should be issued to it.
LCD Timing for Read
and Data to
LCDs w/ Busy E
(cont’)
RS
tAH = Hold time after E has
come down for both RS and
R/W = 10 ns (minimum)
Data
Sending Codes tH = Data hold time
and Data to tH = 10 ns (minimum)
LCDs w/ Busy E tDSW
(cont’)
RS
tAH = Hold time after E has
come down for both RS and
R/W = 10 ns (minimum)
MOVC JZ SEND_DAT
SJMP C1
Instruction SEND_DAT:
MOV DPTR,#MYDATA
D1: CLR A
MOVC A,@A+DPTR
ACALL DATAWRT ;call command subroutine
ACALL DELAY ;give LCD some time
INC DPTR
JZ AGAIN
SJMP D1
AGAIN: SJMP AGAIN ;stay here
.....
.....
COMNWRT: ;send command to LCD
LCD MOV
CLR
P1,A
P2.0
;copy reg A to P1
;RS=0 for command
INTERFACING CLR P2.1 ;R/W=0 for write
SETB P2.2 ;E=1 for high pulse
ACALL DELAY ;give LCD some time
Sending CLR P2.2 ;E=0 for H-to-L pulse
Information to DATAWRT:
RET
;write data to LCD
LCD Using MOV P1,A ;copy reg A to port 1
SETB P2.0 ;RS=1 for data
MOVC CLR P2.1 ;R/W=0 for write
Instruction SETB P2.2 ;E=1 for high pulse
;give LCD some time
ACALL DELAY
(cont’) CLR P2.2 ;E=0 for H-to-L pulse
RET
DELAY: MOV R3,#250 ;50 or higher for fast CPUs
HERE2: MOV R4,#255 ;R4 = 255
HERE: DJNZ R4,HERE ;stay until R4 becomes 0
DJNZ R3,HERE2
RET
ORG 300H
MYCOM: DB 38H,0EH,01,06,84H,0 ; commands and null
MYDATA: DB “HELLO”,0
END
Example 12-2
LCD Write an 8051 C program to send letters ‘M’, ‘D’, and ‘E’ to the LCD
INTERFACING using the busy flag method.
Solution:
Sending
#include <reg51.h>
Information to sfr ldata = 0x90; //P1=LCD data pins
LCD Using sbit rs = P2^0;
sbit rw = P2^1;
MOVC sbit en = P2^2;
Instruction sbit busy = P1^7;
void main(){
(cont’) lcdcmd(0x38);
lcdcmd(0x0E);
lcdcmd(0x01);
lcdcmd(0x06);
lcdcmd(0x86); //line 1, position 6
lcdDATA(„M‟);
lcdDATA(„D‟);
lcdDATA(„E‟);
}
.....
.....
void lcdcmd(unsigned char value){
LCD lcdready(); //check the LCD busy flag
INTERFACING ldata = value; //put the value on the pins
rs = 0;
rw = 0;
Sending en = 1; //strobe the enable pin
Information to MSDelay(1);
en = 0;
LCD Using return;
MOVC }
Instruction void lcdDATA(unsigned char value){
(cont’) lcdready(); //check the LCD busy flag
ldata = value; //put the value on the pins
rs = 1;
rw = 0;
en = 1; //strobe the enable pin
MSDelay(1);
en = 0;
return;
}
.....
.....
LCD void lcdready(){
busy = 1; //make the busy pin at input
INTERFACING rs = 0;
rw = 1;
Sending while(busy==1){ //wait here for busy flag
en = 0; //strobe the enable pin
Information to MSDelay(1);
LCD Using en = 1;
}
MOVC
Instruction void lcddata(unsigned int itime){
unsigned int i, j;
(cont’) for(i=0;i<itime;i++)
for(j=0;j<1275;j++);
}
Keyboards are organized in a matrix of
KEYBOARD
INTERFACING
rows and columns
The CPU accesses both rows and columns
through ports
Therefore, with two 8-bit ports, an 8 x 8 matrix
of keys can be connected to a microprocessor
When a key is pressed, a row and a
column make a contact
Otherwise, there is no connection between
rows and columns
In IBM PC keyboards, a single
microcontroller takes care of hardware
and software interfacing
A 4x4 matrix connected to two ports
KEYBOARD
INTERFACING The rows are connected to an output port
and the columns are connected to an
Scanning and input port
Matrix Keyboard Connection to ports
Identifying the
Key Vcc
3 2 1 0
D0
7 6 5 4
D1 If no key has
B A 9 8 been pressed,
If all the rows are D2 reading the
grounded and a key F E D C input port will
is pressed, one of D3 yield 1s for all
the columns will columns since
have 0 since the key Port 1 they are all
pressed provides the connected to
(Out) D3 D2 D1 D0 Port 2
path to ground high (Vcc)
(In)
It is the function of the microcontroller
KEYBOARD to scan the keyboard continuously to
INTERFACING detect and identify the key pressed
To detect a pressed key, the
Grounding microcontroller grounds all rows by
Rows and providing 0 to the output latch, then it
Reading reads the columns
Columns If the data read from columns is D3 – D0 =
1111, no key has been pressed and the
process continues till key press is detected
If one of the column bits has a zero, this
means that a key press has occurred
For example, if D3 – D0 = 1101, this means that
a key in the D1 column has been pressed
After detecting a key press, microcontroller will
go through the process of identifying the key
Starting with the top row, the
KEYBOARD microcontroller grounds it by providing
INTERFACING a low to row D0 only
It reads the columns, if the data read is all
Grounding
1s, no key in that row is activated and the
Rows and process is moved to the next row
Reading
Columns It grounds the next row, reads the
(cont’) columns, and checks for any zero
This process continues until the row is
identified
After identification of the row in which
the key has been pressed
Find out which column the pressed key
belongs to
Example 12-3
KEYBOARD From Figure 12-6, identify the row and column of the pressed key for
each of the following.
INTERFACING (a) D3 – D0 = 1110 for the row, D3 – D0 = 1011 for the column
(b) D3 – D0 = 1101 for the row, D3 – D0 = 0111 for the column
Grounding Solution :
Rows and From Figure 13-5 the row and column can be used to identify the key.
Reading (a) The row belongs to D0 and the column belongs to D2; therefore,
key number 2 was pressed.
Columns (b) The row belongs to D1 and the column belongs to D3; therefore,
(cont’) key number 7 was pressed.
3 2 1 0
D0
D1 7 6 5 4
D2 B A 9 8
D3 F E D C
Vcc
Port 1
(Out) D3 D2 D1 D0 Port 2
(In)
Program 12-4 for detection and
KEYBOARD
INTERFACING
identification of key activation goes
through the following stages:
Grounding 1. To make sure that the preceding key has
Rows and been released, 0s are output to all rows
Reading at once, and the columns are read and
Columns checked repeatedly until all the columns
(cont’) are high
When all columns are found to be high, the
program waits for a short amount of time
before it goes to the next stage of waiting for
a key to be pressed
2. To see if any key is pressed, the columns
KEYBOARD are scanned over and over in an infinite
INTERFACING loop until one of them has a 0 on it
Remember that the output latches connected
Grounding to rows still have their initial zeros (provided
Rows and in stage 1), making them grounded
Reading After the key press detection, it waits 20 ms
Columns for the bounce and then scans the columns
(cont’) again
(a) it ensures that the first key press
detection was not an erroneous one due a
spike noise
(b) the key press. If after the 20-ms delay the
key is still pressed, it goes back into the
loop to detect a real key press
3. To detect which row key press belongs to,
KEYBOARD it grounds one row at a time, reading the
INTERFACING columns each time
If it finds that all columns are high, this means
that the key press cannot belong to that row
Grounding – Therefore, it grounds the next row and
Rows and continues until it finds the row the key
press belongs to
Reading
Upon finding the row that the key press
Columns belongs to, it sets up the starting address for
(cont’) the look-up table holding the scan codes (or
ASCII) for that row
4. To identify the key press, it rotates the
column bits, one bit at a time, into the
carry flag and checks to see if it is low
Upon finding the zero, it pulls out the ASCII
code for that key from the look-up table
otherwise, it increments the pointer to point to
the next element of the look-up table
Flowchart for Program 12-4
1
KEYBOARD
Read all columns
INTERFACING Start
yes
no no All keys
1 down?
yes
2
2
KEYBOARD
INTERFACING
Ground next row
Grounding
Rows and no All keys
down?
Reading
yes
Columns
(cont’) Find which key
is pressed
Return
Program 12-4: Keyboard Program
KEYBOARD ;keyboard subroutine. This program sends the ASCII
INTERFACING ;code for pressed key to P0.1
;P1.0-P1.3 connected to rows, P2.0-P2.3 to column
Grounding K1:
MOV
MOV
P2,#0FFH
P1,#0
;make P2 an input port
;ground all rows at once
Rows and MOV A,P2 ;read all col
Reading ANL A,00001111B
;(ensure keys open)
;masked unused bits
Columns CJNE A,#00001111B,K1 ;till all keys release
(cont’) K2: ACALL DELAY ;call 20 msec delay
MOV A,P2 ;see if any key is pressed
ANL A,00001111B ;mask unused bits
CJNE A,#00001111B,OVER;key pressed, find row
SJMP K2 ;check till key pressed
OVER: ACALL DELAY ;wait 20 msec debounce time
MOV A,P2 ;check key closure
ANL A,00001111B ;mask unused bits
CJNE A,#00001111B,OVER1;key pressed, find row
SJMP K2 ;if none, keep polling
....
....
KEYBOARD OVER1: MOV P1, #11111110B ;ground row 0
INTERFACING MOV A,P2 ;read all columns
ANL A,#00001111B ;mask unused bits
CJNE A,#00001111B,ROW_0 ;key row 0, find col.
Grounding MOV P1,#11111101B ;ground row 1
Rows and MOV A,P2 ;read all columns
ANL A,#00001111B ;mask unused bits
Reading CJNE A,#00001111B,ROW_1 ;key row 1, find col.
Columns MOV P1,#11111011B ;ground row 2
(cont’) MOV A,P2 ;read all columns
ANL A,#00001111B ;mask unused bits
CJNE A,#00001111B,ROW_2 ;key row 2, find col.
MOV P1,#11110111B ;ground row 3
MOV A,P2 ;read all columns
ANL A,#00001111B ;mask unused bits
CJNE A,#00001111B,ROW_3 ;key row 3, find col.
LJMP K2 ;if none, false input,
;repeat
....
....
ROW_0: MOV DPTR,#KCODE0 ;set DPTR=start of row 0
KEYBOARD SJMP FIND ;find col. Key belongs to
INTERFACING ROW_1: MOV DPTR,#KCODE1 ;set DPTR=start of row
SJMP FIND ;find col. Key belongs to
ROW_2: MOV DPTR,#KCODE2 ;set DPTR=start of row 2
Grounding SJMP FIND ;find col. Key belongs to
ROW_3: MOV DPTR,#KCODE3 ;set DPTR=start of row 3
Rows and FIND: RRC A ;see if any CY bit low
Reading JNC MATCH ;if zero, get ASCII code
INC DPTR ;point to next col. addr
Columns SJMP FIND ;keep searching
(cont’) MATCH: CLR A ;set A=0 (match is found)
MOVC A,@A+DPTR ;get ASCII from table
MOV P0,A ;display pressed key
LJMP K1
;ASCII LOOK-UP TABLE FOR EACH ROW
ORG 300H
KCODE0: DB „0‟,‟1‟,‟2‟,‟3‟ ;ROW 0
KCODE1: DB „4‟,‟5‟,‟6‟,‟7‟ ;ROW 1
KCODE2: DB „8‟,‟9‟,‟A‟,‟B‟ ;ROW 2
KCODE3: DB „C‟,‟D‟,‟E‟,‟F‟ ;ROW 3
END