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 is finding widespread use
    LCD
INTERFACING
                    replacing LEDs
                    ¾   The declining prices of LCD
LCD Operation       ¾   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
      HANEL     National Cheng Kung University, TAIWAN                       2
                         Pin Descriptions for LCD
                              Pin   Symbol    I/O     Descriptions
    LCD
                              1     VSS       --      Ground
INTERFACING                   2     VCC       --      +5V power supply
                              3     VEE       --      Power supply to control contrast
  LCD Pin                     4     RS        I       RS=0 to select command register,
Descriptions                                          RS=1 to select data register
                              5     R/W       I       R/W=0 for write,
                                                      R/W=1 for read
                                                                             used by the
                              6     E         I/O     Enable                 LCD to latch
                              7     DB0       I/O     The 8-bit data bus     information
 - Send displayed             8     DB1       I/O     The 8-bit data bus     presented to
 information or                                                              its data bus
                              9     DB2       I/O     The 8-bit data bus
 instruction
 command codes to             10    DB3       I/O     The 8-bit data bus
 the LCD                      11    DB4       I/O     The 8-bit data bus
 - Read the contents          12    DB5       I/O     The 8-bit data bus
 of the LCD’s                 13    DB6       I/O     The 8-bit data bus
 internal registers           14    DB7       I/O     The 8-bit data bus
                       Department of Computer Science and Information Engineering
        HANEL          National Cheng Kung University, TAIWAN                            3
                 LCD Command Codes
                     Code (Hex) Command to LCD Instruction Register
    LCD              1          Clear display screen
                     2          Return home
INTERFACING
                     4          Decrement cursor (shift cursor to left)
                     6          Increment cursor (shift cursor to right)
LCD Command          5          Shift display right
    Codes            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
     HANEL    National Cheng Kung University, TAIWAN                       4
                                  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
    LCD                           internal latch of the LCD. This is shown in the code below.
                                  ;calls a time delay before sending next data/command
INTERFACING                       ;P1.0-P1.7 are connected to LCD data pins D0-D7
                                  ;P2.0 is connected to RS pin of LCD
Sending Data/                     ;P2.1 is connected to R/W pin of LCD
                                  ;P2.2 is connected to E pin of LCD
Commands to                               ORG   0H
LCDs w/ Time                              MOV   A,#38H ;INIT. LCD 2 LINES, 5X7 MATRIX
                                          ACALL COMNWRT ;call command subroutine
   Delay                                  ACALL DELAY   ;give LCD some time
                                          MOV   A,#0EH ;display on, cursor on
                          +5V
8051                VCC
                                          ACALL COMNWRT ;call command subroutine
  P1.0   D0                               ACALL DELAY   ;give LCD some time
                    VEE     10k           MOV   A,#01   ;clear LCD
                            POT
              LCD                         ACALL COMNWRT ;call command subroutine
  P1.7   D7         VSS                   ACALL DELAY   ;give LCD some time
         RS R/W E
                                          MOV   A,#06H ;shift cursor right
                                          ACALL COMNWRT ;call command subroutine
                                          ACALL DELAY   ;give LCD some time
 P2.0
                                          MOV   A,#84H ;cursor at line 1, pos. 4
 P2.1                                     ACALL COMNWRT ;call command subroutine
                                          ACALL DELAY   ;give LCD some time
 P2.2                             .....
                                  Department of Computer Science and Information Engineering
               HANEL              National Cheng Kung University, TAIWAN                                5
                                  .....
                                           MOV     A,#’N’    ;display letter N
                                           ACALL   DATAWRT   ;call display subroutine
    LCD
                                           ACALL   DELAY     ;give LCD some time
                                           MOV     A,#’O’     ;display letter O
INTERFACING                                ACALL
                                  AGAIN: SJMP
                                                   DATAWRT
                                                   AGAIN
                                                             ;call display subroutine
                                                             ;stay here
                                  COMNWRT:                   ;send command to LCD
Sending Data/                              MOV
                                           CLR
                                                   P1,A
                                                   P2.0
                                                             ;copy reg A to port 1
                                                             ;RS=0 for command
Commands to                                CLR     P2.1      ;R/W=0 for write
LCDs w/ Time
                                           SETB    P2.2      ;E=1 for high pulse
                                           ACALL   DELAY     ;give LCD some time
   Delay                                   CLR
                                           RET
                                                   P2.2      ;E=0 for H-to-L pulse
         (cont’)          +5V     DATAWRT:                   ;write data to LCD
8051                VCC                    MOV     P1,A      ;copy reg A to port 1
  P1.0   D0                                SETB    P2.0      ;RS=1 for data
                    VEE     10k            CLR     P2.1      ;R/W=0 for write
                            POT
              LCD                          SETB    P2.2      ;E=1 for high pulse
                                           ACALL   DELAY     ;give LCD some time
  P1.7   D7         VSS
                                           CLR     P2.2      ;E=0 for H-to-L pulse
         RS R/W E                          RET
                                  DELAY: MOV       R3,#50   ;50 or higher for fast CPUs
 P2.0
                                  HERE2: MOV       R4,#255 ;R4 = 255
                                  HERE:    DJNZ    R4,HERE ;stay until R4 becomes 0
 P2.1                                      DJNZ    R3,HERE2
                                           RET
 P2.2                                      END
                                  Department of Computer Science and Information Engineering
               HANEL              National Cheng Kung University, TAIWAN                       6
                                  ;Check busy flag before sending data, command to LCD
                                  ;p1=data pin
    LCD                           ;P2.0 connected to RS pin
INTERFACING                       ;P2.1 connected to R/W pin
                                  ;P2.2 connected to E pin
                                        ORG   0H
Sending Data/                           MOV   A,#38H       ;init. LCD 2 lines ,5x7 matrix
Commands to
                                        ACALL COMMAND      ;issue command
                                        MOV   A,#0EH       ;LCD on, cursor on
LCDs w/ Time                            ACALL COMMAND      ;issue command
                                        MOV   A,#01H       ;clear LCD command
   Delay                                ACALL COMMAND      ;issue command
         (cont’)          +5V
                                        MOV   A,#06H       ;shift cursor right
8051                VCC                 ACALL COMMAND      ;issue command
  P1.0   D0                             MOV   A,#86H       ;cursor: line 1, pos. 6
                            10k
                    VEE
                            POT
                                        ACALL COMMAND      ;command subroutine
              LCD                       MOV   A,#’N’       ;display letter N
  P1.7   D7         VSS                 ACALL DATA_DISPLAY
         RS R/W E                       MOV   A,#’O’       ;display letter O
                                        ACALL DATA_DISPLAY
                                  HERE:SJMP HERE           ;STAY HERE
 P2.0                             .....
 P2.1
 P2.2
                                  Department of Computer Science and Information Engineering
               HANEL              National Cheng Kung University, TAIWAN                       7
                                  .....
                                  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
Sending Codes
                                        CLR   P2.2          ;E=0,latch in
                                        RET
 and Data to                      DATA_DISPLAY:
                                        ACALL READY         ;is LCD ready?
LCDs w/ Busy                            MOV   P1,A          ;issue data
     Flag
                                        SETB P2.0           ;RS=1 for data
                                        CLR   P2.1          ;R/W =0 to write to LCD
         (cont’)          +5V
                                        SETB P2.2           ;E=1 for H-to-L pulse
8051                VCC                 CLR   P2.2          ;E=0,latch in
  P1.0   D0                             RET         To read the command register, we make R/W=1,
                    VEE     10k   READY:
                            POT                     RS=0, and a H-to-L pulse for the E pin.
              LCD                       SETB P1.7           ;make P1.7 input port
  P1.7   D7         VSS                 CLR   P2.0          ;RS=0 access command reg
                                        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.
                                  Department of Computer Science and Information Engineering
               HANEL              National Cheng Kung University, TAIWAN                              8
                 LCD Timing for Read
    LCD                                      tD = Data output delay time
INTERFACING
                D0 – D7                       Data
Sending Codes                      tD
 and Data to
LCDs w/ Busy         E
     Flag          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
                Department of Computer Science and Information Engineering
       HANEL    National Cheng Kung University, TAIWAN                                    9
                 LCD Timing for Write
    LCD          tDSW = Data set up time
INTERFACING      = 195 ns (minimum)
                                                     Data
Sending Codes                                                               tH = Data hold time
 and Data to                                                 tH             = 10 ns (minimum)
LCDs w/ Busy          E                           tDSW
     Flag          R/W         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)
                Department of Computer Science and Information Engineering
       HANEL    National Cheng Kung University, TAIWAN                                             10
                        One can put data at any location in the
    LCD
INTERFACING
                         LCD and the following shows address
                         locations and how they are accessed
LCD Data Sheet        RS         R/W   DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
                         0        0     1        A       A       A       A       A       A       A
                             ¾   AAAAAAA=000_0000 to 010_0111 for line1
                             ¾   AAAAAAA=100_0000 to 110_0111 for line2
 The upper address
 range can go as     LCD Addressing for the LCDs of 40×2 size
 high as 0100111
                                       DB7   DB6     DB5     DB4     DB3     DB2     DB1     DB0
 for the 40-
 character-wide        Line1 (min) 1         0       0       0       0       0       0       0
 LCD, which            Line1 (max) 1         0       1       0       0       1       1       1
 corresponds to        Line2 (min) 1         1       0       0       0       0       0       0
 locations 0 to 39     Line2 (max) 1         1       1       0       0       1       1       1
                     Department of Computer Science and Information Engineering
         HANEL       National Cheng Kung University, TAIWAN                                          11
                 ;Call a time delay before sending next data/command
    LCD          ; P1.0-P1.7=D0-D7, P2.0=RS, P2.1=R/W, P2.2=E
INTERFACING              ORG      0
                         MOV      DPTR,#MYCOM
   Sending       C1:     CLR      A
                         MOVC     A,@A+DPTR
Information to           ACALL    COMNWRT ;call command subroutine
  LCD Using              ACALL
                         INC
                                  DELAY
                                  DPTR
                                            ;give LCD some time
    MOVC                 JZ       SEND_DAT
  Instruction
                         SJMP     C1
                 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
                 .....
                 Department of Computer Science and Information Engineering
      HANEL      National Cheng Kung University, TAIWAN                       12
                 .....
                 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
   Sending               ACALL
                         CLR
                                  DELAY
                                  P2.2
                                            ;give LCD some time
                                            ;E=0 for H-to-L pulse
Information to           RET
                 DATAWRT:                   ;write data to LCD
  LCD Using              MOV      P1,A      ;copy reg A to port 1
    MOVC                 SETB
                         CLR
                                  P2.0
                                  P2.1
                                            ;RS=1 for data
                                            ;R/W=0 for write
  Instruction            SETB     P2.2      ;E=1 for high pulse
                         ACALL    DELAY     ;give LCD some time
    (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
                 Department of Computer Science and Information Engineering
       HANEL     National Cheng Kung University, TAIWAN                       13
                 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.
   Sending       Solution:
Information to   #include <reg51.h>
                 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
                   lcdcmd(‘M’);
                   lcdcmd(‘D’);
                   lcdcmd(‘E’);
                 }
                 .....
                 Department of Computer Science and Information Engineering
       HANEL     National Cheng Kung University, TAIWAN                                 14
                 .....
    LCD          void lcdcmd(unsigned char value){
                   lcdready();      //check the LCD busy flag
INTERFACING        ldata = value;   //put the value on the pins
                   rs = 0;
   Sending         rw = 0;
                   en = 1;          //strobe the enable pin
Information to     MSDelay(1);
  LCD Using        en = 0;
                   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;
                 }
                 .....
                 Department of Computer Science and Information Engineering
       HANEL     National Cheng Kung University, TAIWAN                       15
                 .....
    LCD          void lcdready(){
INTERFACING        busy = 1;
                   rs = 0;
                                          //make the busy pin at input
                   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++);
                 }
                 Department of Computer Science and Information Engineering
       HANEL     National Cheng Kung University, TAIWAN                       16
                 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
              Department of Computer Science and Information Engineering
     HANEL    National Cheng Kung University, TAIWAN                        17
                             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)
                          Department of Computer Science and Information Engineering
         HANEL            National Cheng Kung University, TAIWAN                                             18
                  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
              Department of Computer Science and Information Engineering
     HANEL    National Cheng Kung University, TAIWAN                       19
                 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
              Department of Computer Science and Information Engineering
      HANEL   National Cheng Kung University, TAIWAN                       20
              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
                                      7        6        5    4
                                D1
                                      B        A        9    8
                                D2
                                      F        E        D    C
                                D3
                                                                        Vcc
                             Port 1
                             (Out)        D3       D2       D1   D0   Port 2
                                                                       (In)
              Department of Computer Science and Information Engineering
      HANEL   National Cheng Kung University, TAIWAN                                 21
                  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
              Department of Computer Science and Information Engineering
      HANEL   National Cheng Kung University, TAIWAN                         22
                  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
              Department of Computer Science and Information Engineering
      HANEL   National Cheng Kung University, TAIWAN                       23
                  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
              Department of Computer Science and Information Engineering
      HANEL   National Cheng Kung University, TAIWAN                       24
                Flowchart for Program 12-4
                                                                    1
 KEYBOARD
                                                             Read all columns
INTERFACING                           Start
 Grounding                    Ground all rows
                                                        no       All keys
                                                                  down?
 Rows and
                                                                        yes
  Reading                    Read all columns
  Columns                                                    Wait for debounce
   (cont’)
                                    All keys
                                     open?                   Read all columns
                                           yes
                               no                       no       All keys
                                       1                          down?
                                                                        yes
              Department of Computer Science and Information Engineering
      HANEL   National Cheng Kung University, TAIWAN                             25
                                             2
 KEYBOARD
INTERFACING
                                       Ground next row
 Grounding
 Rows and                         no      All keys
                                           down?
  Reading
                                                 yes
  Columns
   (cont’)                             Find which key
                                          is pressed
                                        Get scan code
                                         from table
                                           Return
              Department of Computer Science and Information Engineering
      HANEL   National Cheng Kung University, TAIWAN                       26
              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             MOV   P2,#0FFH ;make P2 an input port
              K1:      MOV   P1,#0    ;ground all rows at once
 Rows and              MOV   A,P2     ;read all col
  Reading                             ;(ensure keys open)
                       ANL A,00001111B      ;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
              ....
              Department of Computer Science and Information Engineering
      HANEL   National Cheng Kung University, TAIWAN                       27
              ....
 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
  Reading             ANL A,#00001111B            ;mask unused bits
                     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
              ....
              Department of Computer Science and Information Engineering
      HANEL   National Cheng Kung University, TAIWAN                       28
              ....
              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
  Columns
                      INC DPTR            ;point to next col. addr
                      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
              Department of Computer Science and Information Engineering
      HANEL   National Cheng Kung University, TAIWAN                       29