Department of Computer Science and Information Engineering

advertisement
LCD AND KEYBOARD
INTERFACING
The 8051 Microcontroller and Embedded
Systems: Using Assembly and C
Mazidi, Mazidi and McKinlay
Chung-Ping Young
楊中平
Home Automation, Networking, and Entertainment Lab
Dept. of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
LCD
INTERFACING
‰
LCD is finding widespread use
replacing LEDs
¾
LCD Operation
¾
¾
¾
HANEL
The declining prices of LCD
The ability to display numbers, characters,
and graphics
Incorporation of a refreshing controller
into the LCD, thereby relieving the CPU of
the task of refreshing the LCD
Ease of programming for characters and
graphics
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
2
Pin Descriptions for LCD
LCD
INTERFACING
LCD Pin
Descriptions
- Send displayed
information or
instruction
command codes to
the LCD
- Read the contents
of the LCD’s
internal registers
HANEL
Pin
Symbol
I/O
Descriptions
1
VSS
--
Ground
2
VCC
--
+5V power supply
3
VEE
--
Power supply to control contrast
4
RS
I
RS=0 to select command register,
RS=1 to select data register
5
R/W
I
R/W=0 for write,
R/W=1 for read
6
E
I/O
Enable
7
DB0
I/O
The 8-bit data bus
8
DB1
I/O
The 8-bit data bus
9
DB2
I/O
The 8-bit data bus
10
DB3
I/O
The 8-bit data bus
11
DB4
I/O
The 8-bit data bus
12
DB5
I/O
The 8-bit data bus
13
DB6
I/O
The 8-bit data bus
14
DB7
I/O
The 8-bit data bus
used by the
LCD to latch
information
presented to
its data bus
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
3
LCD Command Codes
Code (Hex) Command to LCD Instruction Register
LCD
INTERFACING
LCD Command
Codes
HANEL
1
Clear display screen
2
Return home
4
Decrement cursor (shift cursor to left)
6
Increment cursor (shift cursor to right)
5
Shift display right
7
Shift display left
8
Display off, cursor off
A
Display off, cursor on
C
Display on, cursor off
E
Display on, cursor blinking
F
Display on, cursor blinking
10
Shift cursor position to left
14
Shift cursor position to right
18
Shift the entire display to the left
1C
Shift the entire display to the right
80
Force cursor to beginning to 1st line
C0
Force cursor to beginning to 2nd line
38
2 lines and 5x7 matrix
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
4
LCD
INTERFACING
Sending Data/
Commands to
LCDs w/ Time
Delay
+5V
8051
P1.0
VCC
D0
VEE
LCD
P1.7
D7
VSS
RS R/W E
P2.0
P2.1
P2.2
HANEL
10k
POT
To send any of the commands to the LCD, make pin RS=0. For data,
make RS=1. Then send a high-to-low pulse to the E pin to enable the
internal latch of the LCD. This is shown in the code below.
;calls a time delay before sending next data/command
;P1.0-P1.7 are connected to LCD data pins D0-D7
;P2.0 is connected to RS pin of LCD
;P2.1 is connected to R/W pin of LCD
;P2.2 is connected to E pin of LCD
ORG
0H
MOV
A,#38H ;INIT. LCD 2 LINES, 5X7 MATRIX
ACALL COMNWRT ;call command subroutine
ACALL DELAY
;give LCD some time
MOV
A,#0EH ;display on, cursor on
ACALL COMNWRT ;call command subroutine
ACALL DELAY
;give LCD some time
MOV
A,#01
;clear LCD
ACALL COMNWRT ;call command subroutine
ACALL DELAY
;give LCD some time
MOV
A,#06H ;shift cursor right
ACALL COMNWRT ;call command subroutine
ACALL DELAY
;give LCD some time
MOV
A,#84H ;cursor at line 1, pos. 4
ACALL COMNWRT ;call command subroutine
ACALL DELAY
;give LCD some time
.....
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
5
.....
LCD
INTERFACING
Sending Data/
Commands to
LCDs w/ Time
Delay
(cont’)
8051
P1.0
+5V
VCC
D0
VEE
LCD
P1.7
D7
VSS
RS R/W E
P2.0
P2.1
P2.2
HANEL
10k
POT
MOV
ACALL
ACALL
MOV
ACALL
AGAIN: SJMP
COMNWRT:
MOV
CLR
CLR
SETB
ACALL
CLR
RET
DATAWRT:
MOV
SETB
CLR
SETB
ACALL
CLR
RET
DELAY: MOV
HERE2: MOV
HERE:
DJNZ
DJNZ
RET
END
A,#’N’
DATAWRT
DELAY
A,#’O’
DATAWRT
AGAIN
P1,A
P2.0
P2.1
P2.2
DELAY
P2.2
;display letter N
;call display subroutine
;give LCD some time
;display letter O
;call display subroutine
;stay here
;send command to LCD
;copy reg A to port 1
;RS=0 for command
;R/W=0 for write
;E=1 for high pulse
;give LCD some time
;E=0 for H-to-L pulse
P1,A
P2.0
P2.1
P2.2
DELAY
P2.2
;write data to LCD
;copy reg A to port 1
;RS=1 for data
;R/W=0 for write
;E=1 for high pulse
;give LCD some time
;E=0 for H-to-L pulse
R3,#50
;50 or higher for fast CPUs
R4,#255 ;R4 = 255
R4,HERE ;stay until R4 becomes 0
R3,HERE2
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
6
LCD
INTERFACING
Sending Data/
Commands to
LCDs w/ Time
Delay
(cont’)
8051
P1.0
+5V
VCC
D0
VEE
LCD
P1.7
D7
VSS
RS R/W E
P2.0
10k
POT
;Check busy flag before sending data, command to LCD
;p1=data pin
;P2.0 connected to RS pin
;P2.1 connected to R/W pin
;P2.2 connected to E pin
ORG
0H
MOV
A,#38H
;init. LCD 2 lines ,5x7 matrix
ACALL COMMAND
;issue command
MOV
A,#0EH
;LCD on, cursor on
ACALL COMMAND
;issue command
MOV
A,#01H
;clear LCD command
ACALL COMMAND
;issue command
MOV
A,#06H
;shift cursor right
ACALL COMMAND
;issue command
MOV
A,#86H
;cursor: line 1, pos. 6
ACALL COMMAND
;command subroutine
MOV
A,#’N’
;display letter N
ACALL DATA_DISPLAY
MOV
A,#’O’
;display letter O
ACALL DATA_DISPLAY
HERE:SJMP HERE
;STAY HERE
.....
P2.1
P2.2
HANEL
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
7
LCD
INTERFACING
Sending Codes
and Data to
LCDs w/ Busy
Flag
(cont’)
8051
P1.0
+5V
VCC
D0
VEE
LCD
P1.7
D7
VSS
RS R/W E
P2.0
P2.1
P2.2
10k
POT
.....
COMMAND:
ACALL READY
;is LCD ready?
MOV
P1,A
;issue command code
CLR
P2.0
;RS=0 for command
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
RET
DATA_DISPLAY:
ACALL READY
;is LCD ready?
MOV
P1,A
;issue data
SETB P2.0
;RS=1 for data
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
RET
To read the command register, we make R/W=1,
READY:
RS=0, and a H-to-L pulse for the E pin.
SETB P1.7
;make P1.7 input port
CLR
P2.0
;RS=0 access command reg
SETB P2.1
;R/W=1 read command reg
;read command reg and check busy flag
BACK:SETB P2.2
;E=1 for H-to-L pulse
CLR
P2.2
;E=0 H-to-L pulse
JB
P1.7,BACK
;stay until busy flag=0
RET
If bit 7 (busy flag) is high, the LCD is busy
END
and no information should be issued to it.
HANEL
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
8
LCD Timing for Read
LCD
INTERFACING
Sending Codes
and Data to
LCDs w/ Busy
Flag
tD = Data output delay time
D0 – D7
Data
tD
E
R/W
tAS
tAH
(cont’)
RS
tAH = Hold time after E has
come down for both RS and
R/W = 10 ns (minimum)
tAS = Setup time prior to E
(going high) for both RS and
R/W = 140 ns (minimum)
Note : Read requires an L-to-H pulse for the E pin
HANEL
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
9
LCD Timing for Write
LCD
INTERFACING
Sending Codes
and Data to
LCDs w/ Busy
Flag
tDSW = Data set up time
= 195 ns (minimum)
Data
tH
tDSW
E
R/W
tH = Data hold time
= 10 ns (minimum)
tAS
tPWH
tAH
(cont’)
RS
tAH = Hold time after E has
come down for both RS and
R/W = 10 ns (minimum)
tPWH = Enable pulse width
= 450 ns (minimum)
tAS = Setup time prior to E
(going high) for both RS and
R/W = 140 ns (minimum)
HANEL
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
10
LCD
INTERFACING
LCD Data Sheet
‰
One can put data at any location in the
LCD and the following shows address
locations and how they are accessed
RS
R/W
0
0
¾
¾
The upper address
range can go as
high as 0100111
for the 40character-wide
LCD, which
corresponds to
locations 0 to 39
HANEL
DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1
A
A
A
A
A
A
A
AAAAAAA=000_0000 to 010_0111 for line1
AAAAAAA=100_0000 to 110_0111 for line2
LCD Addressing for the LCDs of 40×2 size
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
Line1 (min) 1
0
0
0
0
0
0
0
Line1 (max) 1
0
1
0
0
1
1
1
Line2 (min) 1
1
0
0
0
0
0
0
Line2 (max) 1
1
1
0
0
1
1
1
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
11
LCD
INTERFACING
Sending
Information to
LCD Using
MOVC
Instruction
HANEL
;Call a time delay before sending next data/command
; P1.0-P1.7=D0-D7, P2.0=RS, P2.1=R/W, P2.2=E
ORG
MOV
C1:
CLR
MOVC
ACALL
ACALL
INC
JZ
SJMP
SEND_DAT:
MOV
D1:
CLR
MOVC
ACALL
ACALL
INC
JZ
SJMP
AGAIN: SJMP
.....
0
DPTR,#MYCOM
A
A,@A+DPTR
COMNWRT ;call command subroutine
DELAY
;give LCD some time
DPTR
SEND_DAT
C1
DPTR,#MYDATA
A
A,@A+DPTR
DATAWRT ;call command subroutine
DELAY
;give LCD some time
DPTR
AGAIN
D1
AGAIN
;stay here
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
12
LCD
INTERFACING
Sending
Information to
LCD Using
MOVC
Instruction
(cont’)
HANEL
.....
COMNWRT:
MOV
CLR
CLR
SETB
ACALL
CLR
RET
DATAWRT:
MOV
SETB
CLR
SETB
ACALL
CLR
RET
DELAY: MOV
HERE2: MOV
HERE:
DJNZ
DJNZ
RET
ORG
MYCOM: DB
MYDATA: DB
END
P1,A
P2.0
P2.1
P2.2
DELAY
P2.2
;send command to LCD
;copy reg A to P1
;RS=0 for command
;R/W=0 for write
;E=1 for high pulse
;give LCD some time
;E=0 for H-to-L pulse
P1,A
P2.0
P2.1
P2.2
DELAY
P2.2
;write data to LCD
;copy reg A to port 1
;RS=1 for data
;R/W=0 for write
;E=1 for high pulse
;give LCD some time
;E=0 for H-to-L pulse
R3,#250 ;50 or higher for fast CPUs
R4,#255 ;R4 = 255
R4,HERE ;stay until R4 becomes 0
R3,HERE2
300H
38H,0EH,01,06,84H,0 ; commands and null
“HELLO”,0
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
13
LCD
INTERFACING
Example 12-2
Write an 8051 C program to send letters ‘M’, ‘D’, and ‘E’ to the LCD
using the busy flag method.
Sending
Information to
LCD Using
MOVC
Instruction
Solution:
(cont’)
#include <reg51.h>
sfr ldata = 0x90; //P1=LCD data pins
sbit rs = P2^0;
sbit rw = P2^1;
sbit en = P2^2;
sbit busy = P1^7;
void main(){
lcdcmd(0x38);
lcdcmd(0x0E);
lcdcmd(0x01);
lcdcmd(0x06);
lcdcmd(0x86);
//line 1, position 6
lcdcmd(‘M’);
lcdcmd(‘D’);
lcdcmd(‘E’);
}
.....
HANEL
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
14
LCD
INTERFACING
Sending
Information to
LCD Using
MOVC
Instruction
(cont’)
.....
void lcdcmd(unsigned char value){
lcdready();
//check the LCD busy flag
ldata = value;
//put the value on the pins
rs = 0;
rw = 0;
en = 1;
//strobe the enable pin
MSDelay(1);
en = 0;
return;
}
void lcddata(unsigned char value){
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;
}
.....
HANEL
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
15
LCD
INTERFACING
Sending
Information to
LCD Using
MOVC
Instruction
(cont’)
HANEL
.....
void lcdready(){
busy = 1;
rs = 0;
rw = 1;
while(busy==1){
en = 0;
MSDelay(1);
en = 1;
}
//make the busy pin at input
//wait here for busy flag
//strobe the enable pin
void lcddata(unsigned int itime){
unsigned int i, j;
for(i=0;i<itime;i++)
for(j=0;j<1275;j++);
}
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
16
KEYBOARD
INTERFACING
‰
Keyboards are organized in a matrix of
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
‰
HANEL
In IBM PC keyboards, a single
microcontroller takes care of hardware
and software interfacing
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
17
KEYBOARD
INTERFACING
Scanning and
Identifying the
Key
‰
A 4x4 matrix connected to two ports
¾
The rows are connected to an output port
and the columns are connected to an
input port
Matrix Keyboard Connection to ports
Vcc
D0
D1
If all the rows are
grounded and a key
is pressed, one of
the columns will
have 0 since the key
pressed provides the
path to ground
HANEL
D2
3
2
1
0
7
6
5
4
B
A
9
8
F
E
D
C
D3
Port 1
(Out)
D3
D2
D1
D0
Port 2
(In)
If no key has
been pressed,
reading the
input port will
yield 1s for all
columns since
they are all
connected to
high (Vcc)
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
18
‰
KEYBOARD
INTERFACING
‰
Grounding
Rows and
Reading
Columns
It is the function of the microcontroller
to scan the keyboard continuously to
detect and identify the key pressed
To detect a pressed key, the
microcontroller grounds all rows by
providing 0 to the output latch, then it
reads the 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
HANEL
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
19
KEYBOARD
INTERFACING
Grounding
Rows and
Reading
Columns
‰
Starting with the top row, the
microcontroller grounds it by providing
a low to row D0 only
¾
‰
(cont’)
It grounds the next row, reads the
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
¾
HANEL
It reads the columns, if the data read is all
1s, no key in that row is activated and the
process is moved to the next row
Find out which column the pressed key
belongs to
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
20
KEYBOARD
INTERFACING
Grounding
Rows and
Reading
Columns
(cont’)
Example 12-3
From Figure 12-6, identify the row and column of the pressed key for
each of the following.
(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
Solution :
From Figure 13-5 the row and column can be used to identify the key.
(a) The row belongs to D0 and the column belongs to D2; therefore,
key number 2 was pressed.
(b) The row belongs to D1 and the column belongs to D3; therefore,
key number 7 was pressed.
D0
D1
D2
D3
Port 1
(Out)
HANEL
3
2
1
0
7
6
5
4
B
A
9
8
F
E
D
C
Vcc
D3
D2
D1
D0
Port 2
(In)
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
21
KEYBOARD
INTERFACING
Grounding
Rows and
Reading
Columns
(cont’)
‰
Program 12-4 for detection and
identification of key activation goes
through the following stages:
1.
To make sure that the preceding key has
been released, 0s are output to all rows
at once, and the columns are read and
checked repeatedly until all the columns
are high
ƒ
HANEL
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
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
22
KEYBOARD
INTERFACING
Grounding
Rows and
Reading
Columns
(cont’)
HANEL
2.
To see if any key is pressed, the columns
are scanned over and over in an infinite
loop until one of them has a 0 on it
ƒ
ƒ
Remember that the output latches connected
to rows still have their initial zeros (provided
in stage 1), making them grounded
After the key press detection, it waits 20 ms
for the bounce and then scans the columns
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
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
23
KEYBOARD
INTERFACING
3.
To detect which row key press belongs to,
it grounds one row at a time, reading the
columns each time
ƒ
Grounding
Rows and
Reading
Columns
ƒ
(cont’)
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
ƒ
ƒ
HANEL
If it finds that all columns are high, this means
that the key press cannot belong to that row
– Therefore, it grounds the next row and
continues until it finds the row the key
press belongs to
Upon finding the row that the key press
belongs to, it sets up the starting address for
the look-up table holding the scan codes (or
ASCII) for that row
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
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
24
1
Flowchart for Program 12-4
KEYBOARD
INTERFACING
Grounding
Rows and
Reading
Columns
Read all columns
Start
Ground all rows
no
All keys
down?
yes
Read all columns
Wait for debounce
(cont’)
All keys
open?
Read all columns
yes
no
1
no
All keys
down?
yes
2
HANEL
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
25
2
KEYBOARD
INTERFACING
Grounding
Rows and
Reading
Columns
(cont’)
Ground next row
no
All keys
down?
yes
Find which key
is pressed
Get scan code
from table
Return
HANEL
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
26
KEYBOARD
INTERFACING
Grounding
Rows and
Reading
Columns
(cont’)
Program 12-4: Keyboard Program
;keyboard subroutine. This program sends the ASCII
;code for pressed key to P0.1
;P1.0-P1.3 connected to rows, P2.0-P2.3 to column
K1:
K2:
OVER:
MOV
MOV
MOV
P2,#0FFH
P1,#0
A,P2
;make P2 an input port
;ground all rows at once
;read all col
;(ensure keys open)
ANL A,00001111B
;masked unused bits
CJNE A,#00001111B,K1 ;till all keys release
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
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
....
HANEL
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
27
KEYBOARD
INTERFACING
Grounding
Rows and
Reading
Columns
(cont’)
HANEL
....
OVER1: MOV P1, #11111110B ;ground row 0
MOV A,P2
;read all columns
ANL A,#00001111B
;mask unused bits
CJNE A,#00001111B,ROW_0 ;key row 0, find col.
MOV P1,#11111101B
;ground row 1
MOV A,P2
;read all columns
ANL A,#00001111B
;mask unused bits
CJNE A,#00001111B,ROW_1 ;key row 1, find col.
MOV P1,#11111011B
;ground row 2
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
....
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
28
....
KEYBOARD
INTERFACING
Grounding
Rows and
Reading
Columns
(cont’)
HANEL
ROW_0: MOV DPTR,#KCODE0
;set DPTR=start of row 0
SJMP FIND
;find col. Key belongs to
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
SJMP FIND
;find col. Key belongs to
ROW_3: MOV DPTR,#KCODE3
;set DPTR=start of row 3
FIND: RRC A
;see if any CY bit low
JNC MATCH
;if zero, get ASCII code
INC DPTR
;point to next col. addr
SJMP FIND
;keep searching
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
Department of Computer Science and Information Engineering
National Cheng Kung University, TAIWAN
29
Download