1. Trang chủ
  2. » Công Nghệ Thông Tin

LCD AND KEYBOARD INTERFACING pptx

29 201 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 29
Dung lượng 215,69 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

LCD INTERFACING LCD Pin Descriptions Pin Descriptions for LCD Pin Symbol I/O Descriptions 2 VCC -- +5V power supply Power supply to control contrastRS=0 to select command register, RS=

Trang 1

Home Automation, Networking, and Entertainment Lab

Chung-Ping Young

楊中平

LCD AND KEYBOARD

INTERFACING

The 8051 Microcontroller and Embedded

Systems: Using Assembly and C

Mazidi, Mazidi and McKinlay

Trang 2

¾ 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

Trang 3

LCD

INTERFACING

LCD Pin

Descriptions

Pin Descriptions for LCD

Pin Symbol I/O Descriptions

2 VCC +5V power supply

Power supply to control contrastRS=0 to select command register, RS=1 to select data register

R/W=0 for write, R/W=1 for readEnable

The 8-bit data busThe 8-bit data busThe 8-bit data busThe 8-bit data busThe 8-bit data busThe 8-bit data busThe 8-bit data busThe 8-bit data bus

Trang 4

38 2 lines and 5x7 matrix

Clear display screen Return home

Decrement cursor (shift cursor to left) Increment cursor (shift cursor to right) Shift display right

Shift display left Display off, cursor off Display off, cursor on Display on, cursor off Display on, cursor blinking Display on, cursor blinking Shift cursor position to left Shift cursor position to right Shift the entire display to the left Shift the entire display to the right Force cursor to beginning to 1st line Force cursor to beginning to 2nd line

Trang 5

;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 0HMOV A,#38H ;INIT LCD 2 LINES, 5X7 MATRIXACALL COMNWRT ;call command subroutine

ACALL DELAY ;give LCD some timeMOV A,#0EH ;display on, cursor onACALL COMNWRT ;call command subroutineACALL DELAY ;give LCD some time

MOV A,#01 ;clear LCDACALL COMNWRT ;call command subroutineACALL DELAY ;give LCD some time

MOV A,#06H ;shift cursor rightACALL COMNWRT ;call command subroutineACALL DELAY ;give LCD some time

MOV A,#84H ;cursor at line 1, pos 4ACALL COMNWRT ;call command subroutineACALL DELAY ;give LCD some time

LCD

+5V

Trang 6

MOV A,#’O’ ;display letter OACALL DATAWRT ;call display subroutineAGAIN: SJMP AGAIN ;stay here

COMNWRT: ;send command to LCD

MOV P1,A ;copy reg A to port 1CLR P2.0 ;RS=0 for command

CLR P2.1 ;R/W=0 for writeSETB P2.2 ;E=1 for high pulseACALL DELAY ;give LCD some timeCLR P2.2 ;E=0 for H-to-L pulseRET

DATAWRT: ;write data to LCD

MOV P1,A ;copy reg A to port 1SETB P2.0 ;RS=1 for data

CLR P2.1 ;R/W=0 for writeSETB P2.2 ;E=1 for high pulseACALL DELAY ;give LCD some timeCLR P2.2 ;E=0 for H-to-L pulseRET

DELAY: MOV R3,#50 ;50 or higher for fast CPUsHERE2: MOV R4,#255 ;R4 = 255

HERE: DJNZ R4,HERE ;stay until R4 becomes 0

DJNZ R3,HERE2RET

LCD

+5V

Trang 7

MOV A,#0EH ;LCD on, cursor onACALL COMMAND ;issue command

MOV A,#01H ;clear LCD commandACALL COMMAND ;issue command

MOV A,#06H ;shift cursor rightACALL COMMAND ;issue command

MOV A,#86H ;cursor: line 1, pos 6ACALL COMMAND ;command subroutine

MOV A,#’N’ ;display letter NACALL DATA_DISPLAY

MOV A,#’O’ ;display letter OACALL DATA_DISPLAY

HERE:SJMP HERE ;STAY HERE

LCD

+5V

Trang 8

ACALL READY ;is LCD ready?

MOV P1,A ;issue command codeCLR P2.0 ;RS=0 for commandCLR P2.1 ;R/W=0 to write to LCDSETB P2.2 ;E=1 for H-to-L pulseCLR P2.2 ;E=0,latch in

RETDATA_DISPLAY:

ACALL READY ;is LCD ready?

MOV P1,A ;issue dataSETB P2.0 ;RS=1 for dataCLR P2.1 ;R/W =0 to write to LCDSETB P2.2 ;E=1 for H-to-L pulseCLR P2.2 ;E=0,latch in

RETREADY:

SETB P1.7 ;make P1.7 input portCLR P2.0 ;RS=0 access command regSETB P2.1 ;R/W=1 read command reg

;read command reg and check busy flagBACK: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=0RET

LCD

+5V

If bit 7 (busy flag) is high, the LCD is busy and no information should be issued to it.

Trang 9

Data

tAS tAH

tD

tD = Data output delay time

tAS = Setup time prior to E (going high) for both RS and R/W = 140 ns (minimum)

tAH = Hold time after E has come down for both RS and R/W = 10 ns (minimum)

Note : Read requires an L-to-H pulse for the E pin

D0 – D7

Trang 10

tAH = Hold time after E has come down for both RS and R/W = 10 ns (minimum)

Trang 11

¾ AAAAAAA=000_0000 to 010_0111 for line1

¾ AAAAAAA=100_0000 to 110_0111 for line2

101

11

01

0000

1

0101

11

01

Trang 12

MOVC A,@A+DPTRACALL COMNWRT ;call command subroutineACALL DELAY ;give LCD some time

INC DPTR

JZ SEND_DATSJMP C1

SEND_DAT:

MOV DPTR,#MYDATAD1: CLR A

MOVC A,@A+DPTRACALL DATAWRT ;call command subroutineACALL DELAY ;give LCD some time

INC DPTR

JZ AGAINSJMP D1AGAIN: SJMP AGAIN ;stay here

Trang 13

COMNWRT: ;send command to LCD

MOV P1,A ;copy reg A to P1CLR P2.0 ;RS=0 for commandCLR P2.1 ;R/W=0 for writeSETB P2.2 ;E=1 for high pulseACALL DELAY ;give LCD some timeCLR P2.2 ;E=0 for H-to-L pulseRET

DATAWRT: ;write data to LCD

MOV P1,A ;copy reg A to port 1SETB P2.0 ;RS=1 for data

CLR P2.1 ;R/W=0 for writeSETB P2.2 ;E=1 for high pulseACALL DELAY ;give LCD some timeCLR P2.2 ;E=0 for H-to-L pulseRET

DELAY: MOV R3,#250 ;50 or higher for fast CPUsHERE2: MOV R4,#255 ;R4 = 255

HERE: DJNZ R4,HERE ;stay until R4 becomes 0

DJNZ R3,HERE2RET

ORG 300HMYCOM: DB 38H,0EH,01,06,84H,0 ; commands and nullMYDATA: DB “HELLO”,0

END

Trang 14

lcdcmd(‘E’);

}

Trang 15

void lcdcmd(unsigned char value){

lcdready(); //check the LCD busy flag ldata = value; //put the value on the pins

void lcddata(unsigned char value){

lcdready(); //check the LCD busy flag ldata = value; //put the value on the pins

Trang 16

while(busy==1){ //wait here for busy flag

en = 0; //strobe the enable pin MSDelay(1);

}

Trang 17

ƒ 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

Trang 18

‰ 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

B

37

F

A

26

E

9

15

D

8

04

C

D0 D1 D2 D3

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

Trang 19

‰ 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

Trang 20

a low to row D0 only

¾ 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

‰ 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

¾ Find out which column the pressed key belongs to

Trang 21

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.

B

3 7 F

A

2 6 E 9

1 5 D 8

0 4 C

D3 D2 D1 D0

D0 D1 D2 D3

Port 1

(In) Vcc

Trang 22

‰ 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

ƒ 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

Trang 23

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

Trang 24

3 To detect which row key press belongs to,

it grounds one row at a time, reading the columns each time

ƒ 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

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

Trang 25

Ground all rows

Read all columns

All keys open?

no

1yes

1

Read all columns

All keys down?

yesno

Wait for debounce

Read all columns

All keys down?

2yesno

Trang 26

Find which key

is pressed

Get scan code from table

Return

Trang 27

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

MOV P2,#0FFH ;make P2 an input portK1: MOV P1,#0 ;ground all rows at once

MOV A,P2 ;read all col

;(ensure keys open)ANL A,00001111B ;masked unused bitsCJNE A,#00001111B,K1 ;till all keys releaseK2: 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 rowSJMP K2 ;check till key pressed

OVER: ACALL DELAY ;wait 20 msec debounce time

MOV A,P2 ;check key closureANL A,00001111B ;mask unused bitsCJNE A,#00001111B,OVER1;key pressed, find rowSJMP K2 ;if none, keep polling

Trang 28

OVER1: MOV P1, #11111110B ;ground row 0

ANL A,#00001111B ;mask unused bitsCJNE A,#00001111B,ROW_0 ;key row 0, find col.MOV P1,#11111101B ;ground row 1

ANL A,#00001111B ;mask unused bitsCJNE A,#00001111B,ROW_1 ;key row 1, find col.MOV P1,#11111011B ;ground row 2

ANL A,#00001111B ;mask unused bitsCJNE A,#00001111B,ROW_2 ;key row 2, find col.MOV P1,#11110111B ;ground row 3

ANL A,#00001111B ;mask unused bitsCJNE A,#00001111B,ROW_3 ;key row 3, find col.LJMP K2 ;if none, false input,

;repeat

Trang 29

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 3FIND: RRC A ;see if any CY bit low

JNC MATCH ;if zero, get ASCII codeINC DPTR ;point to next col addrSJMP FIND ;keep searching

MATCH: CLR A ;set A=0 (match is found)

MOVC A,@A+DPTR ;get ASCII from tableMOV P0,A ;display pressed keyLJMP K1

;ASCII LOOK-UP TABLE FOR EACH ROW

ORG 300HKCODE0: DB ‘0’,’1’,’2’,’3’ ;ROW 0 KCODE1: DB ‘4’,’5’,’6’,’7’ ;ROW 1KCODE2: DB ‘8’,’9’,’A’,’B’ ;ROW 2KCODE3: DB ‘C’,’D’,’E’,’F’ ;ROW 3

END

Ngày đăng: 23/03/2014, 09:20

TỪ KHÓA LIÊN QUAN