
$MOD51
; **********************************************************************

;***LCD program to display the keypressed in 4 * 4 Matrix Keyboard attached to PORT 1	***
;***PORT 2 is used to connect to the LCD databus and PORT 3 pins P3.5, P3.6, P3.7 		***
;***is connected to control lines EN, RS and RW	  					***

; **********************************************************************


lcd_rs	bit	p3.5
lcd_rw	bit	p3.6
lcd_en	bit	p3.7

col1	bit	p1.0
col2	bit	p1.1
col3	bit	p1.2
col4	bit	p1.3

row1	bit	p1.4
row2	bit	p1.5
row3	bit	p1.6
row4	bit	p1.7



ORG	000H
ljmp	START


;=================================================================; 
; BUSY FLAG STATUS CHECKING
;================================================================= 
BUSY_STATUS:
      clr  lcd_en
      mov  p2, #0ffh
      clr  lcd_rs
      setb lcd_rw

BUSY:
     clr  lcd_en
     setb lcd_en
     jb	  p2.7, BUSY
     clr  lcd_en
     ret

;===============================================================
;		60 MS DELAY SUBROUTINE
;===============================================================

DELAY:
      mov   r0, #30
SUB:	
      acall DELAY_MS
      djnz  r0, SUB
      ret

DELAY_MS:
      mov   r1, #250
LOOP:	
      nop
      nop
      djnz  r1, LOOP
      ret

;===============================================================
;		WRITE DATA TO LCD
;===============================================================
WRITE_DATA:
      acall   BUSY_STATUS
      mov     p2, a
      setb    lcd_rs
      clr     lcd_rw
      setb    lcd_en
      clr     lcd_en
      ret


;===============================================================
;				WRITE COMMAND TO LCD
;===============================================================
WRITE_COMMAND:
     acall   BUSY_STATUS
     mov     p2, a
     clr     lcd_rs
     clr     lcd_rw
     setb    lcd_en
     clr    lcd_en
     ret

;=====================================================
; INITIALIZING WITH LCD ROUTINES
;=====================================================
INIT_LCD:
     mov     a, #038h
     acall   WRITE_COMMAND
     acall   DELAY

     acall   WRITE_COMMAND
     acall   DELAY

     acall   WRITE_COMMAND
     acall   DELAY

     acall   WRITE_COMMAND
     acall   DELAY

     mov     a, #0eh
     acall   WRITE_COMMAND

     mov     a, #06h
     acall   WRITE_COMMAND

     mov     a, #080h
     acall   WRITE_COMMAND

     ret

;===============================================================
;	MAIN PROGRAM BEGINS FROM HERE
;===============================================================

START:
     mov    p1, #0ffh
     mov    p2, #0ffh
     mov    p3, #0ffh

     acall  INIT_LCD

REPEAT:
     acall   SCAN_MATRIX_KEYBOARD
     mov     a, #01h
     acall   WRITE_COMMAND
     ;mov    a, r6
     pop     acc
     acall   WRITE_DATA

DEBOUNCE:
     mov      p1, #0ffh
     mov      a, p1
     cjne     a, #0ffh, DEBOUNCE
     sjmp    REPEAT

SCAN_MATRIX_KEYBOARD:
     acall   DELAY
     mov     a, p1
     push    acc
     anl     a, #0fh
     cjne    a, #0fh, AHEAD
     sjmp    SCAN_MATRIX_KEYBOARD

AHEAD:
     pop     acc
     anl     a, #0f0h
     cjne    a, #0f0h, PROCESS_SCAN
     sjmp    SCAN_MATRIX_KEYBOARD

PROCESS_SCAN:
      mov    a, p1
      cpl    a
      jz     SCAN_MATRIX_KEYBOARD
      cpl    a
      push   acc
      anl    a, #0fh
      cjne   a, #0fh, ROW_SCAN_1
      sjmp   SCAN_MATRIX_KEYBOARD

ROW_SCAN_1:
      pop   acc
      anl   a, #0f0h
      cjne  a, #0e0h, ROW_SCAN_2
      sjmp  ROW_1

ROW_SCAN_2:
     cjne   a, #0d0h, ROW_SCAN_3
     sjmp   ROW_2

ROW_SCAN_3:
     cjne   a, #0b0h, ROW_SCAN_4
     sjmp   ROW_3

ROW_SCAN_4:
     cjne   a, #70h, SCAN_MATRIX_KEYBOARD
     sjmp   ROW_4

ROW_1:
     mov    dptr, #CODE1
     sjmp   FINAL

ROW_2:
     mov    dptr, #CODE2
     sjmp   FINAL

ROW_3:
     mov    dptr, #CODE3
     sjmp   FINAL

ROW_4:
     mov    dptr, #CODE4

FINAL:
     mov     a, p1
     clr     c

SUB_FINAL:
     rrc     a
     jnc     MATCH
     inc     dptr
     sjmp    SUB_FINAL

MATCH:
     clr     a
     movc    a,@a+dptr
     ;mov    r6, a
     push    acc
     ret


CODE1: db '1','2','3','4'
CODE2: db '5','6','7','8'
CODE3: db '9','10','11','12'
CODE4: db '13','14','15','16'





;*************************************************************************
END

