??? 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 |