| ??? 09/14/06 04:48 Read: times |
#124265 - Matrix Keyboard not working |
Hello All,
I am facing the probs when I interface 4 * 4 Matrix Keyboard with 8051 and the corresponding key pressed is to be shown on LCD wiht 8 bit data bus. LCD is not a probs as I am using 8 bit data bus. The Probs is in the Logic of Matrix Keyboard. Below is the code I am using, can anyone give me some guidelines where I am doing the mistakes. regards Arvind Shrivastava
$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
|



