??? 06/04/04 14:33 Read: times |
#71762 - RE: multiple key press Responding to: ???'s previous message |
Try this
;4*4 Matrix Keyboard. ;Rows Connected To P0.0-P0.3 & Columns To p0.4, p0.5,P0.6. READKEYBOARD : INITKEYCHECK : ;Ensure that no key is pressed initially. MOV P0,#0FFH ;Make P0 output port. CLR P0.0 ;Ground all the rows. CLR P0.1 CLR P0.2 CLR P0.3 JNB P0.4,INITKEYCHECK ;Checking columns to ensure no key pressed. JNB P0.5,INITKEYCHECK JNB P0.6,INITKEYCHECK JNB P0.7,INITKEYCHECK CHECKKEYPRESSED : ;Check if a key is pressed else stay in loop. MOV R3,#2 ;20mS Debounce delay. ACALL DELAY JNB P0.4,ENSUREKEYPRESSED JNB P0.5,ENSUREKEYPRESSED JNB P0.6,ENSUREKEYPRESSED JNB P0.7,ENSUREKEYPRESSED SJMP CHECKKEYPRESSED ENSUREKEYPRESSED : ;Ensure that a key is pressed. MOV R3,#2 ;20mS Debouce delay. ACALL DELAY JNB P0.4,FINDROW JNB P0.5,FINDROW JNB P0.6,FINDROW JNB P0.7,FINDROW SJMP CHECKKEYPRESSED FINDROW : ;Determine row in which key is pressed. MOV P0,#0FFH CLR P0.0 ;Ground rows one by one and check all cols. JNB P0.4,ROW_0 ;Key pressed in row 0. JNB P0.5,ROW_0 JNB P0.6,ROW_0 JNB P0.7,ROW_0 MOV P0,#0FFH CLR P0.1 JNB P0.4,ROW_1 ;Key pressed in row 1. JNB P0.5,ROW_1 JNB P0.6,ROW_1 JNB P0.7,ROW_1 MOV P0,#0FFH CLR P0.2 JNB P0.4,ROW_2 ;Key pressed in row 2. JNB P0.5,ROW_2 JNB P0.6,ROW_2 JNB P0.7,ROW_2 MOV P0,#0FFH CLR P0.3 JNB P0.4,ROW_3 ;Key pressed in row 3. JNB P0.5,ROW_3 JNB P0.6,ROW_3 JNB P0.7,ROW_3 LJMP CHECKKEYPRESSED ;No key pressed go back. ROW_0 : MOV DPTR,#KCODE0 ;Load data pointer with appropriate SJMP FINDKEY ;address of scan codes for each row. ROW_1 : MOV DPTR,#KCODE1 SJMP FINDKEY ROW_2 : MOV DPTR,#KCODE2 SJMP FINDKEY ROW_3 : MOV DPTR,#KCODE3 SJMP FINDKEY FINDKEY : MOV P0,#0FFH CLR P0.0 ;Ground all rows CLR P0.1 CLR P0.2 CLR P0.3 JNB P0.4,MATCHKEY ;Check columns one by one. INC DPTR ;Advance DPTR appropriately so that it points to correct scan code. JNB P0.5,MATCHKEY INC DPTR JNB P0.6,MATCHKEY INC DPTR JNB P0.7,MATCHKEY INC DPTR LJMP CHECKKEYPRESSED MATCHKEY : ;Load ACC with appropriate scan code. CLR A MOVC A,@A+DPTR MOV R7,A RET KCODE3 : DB '1','2','3','0' ;Scan codes. KCODE2 : DB '4','5','6','0' KCODE1 : DB '7','8','9','0' KCODE0 : DB 'C','0','H','0' PASSWORD : DB 5,'7','8','5','6','0' READPASSWORD : LCALL READKEYBOARD MOV A,R7 MOV A,#31H ADD A,R0 MOV R1,A MOV A,R7 MOV @R1,A INC 30H INC R0 MOV A,R7 CJNE A,#'H',READPASSWORD RET CHECKPASSWORD : MOV DPTR,#PASSWORD MOV R0,#00H MOV A,R0 MOVC A,@A+DPTR MOV B,30H CJNE A,B, MAINLOOP MOV R4,#30H MOV R2,A CONTINUECHECK : INC R0 MOV A,R0 MOVC A,@A+DPTR PUSH ACC MOV A,R0 ADD A,R4 MOV R1,A POP ACC MOV B,@R1 PUSH ACC MOV A,B POP ACC CJNE A,B,MAINLOOP DJNZ R2,CONTINUECHECK PASSWORDOK: CLR P2.3 MOV R3,#0FFH LCALL DELAY SETB P2.3 LJMP MAINLOOP DELAY : MOV TMOD,#01H MOV TL0,#0FFH MOV TH0,#0DBH SETB TR0 DELAYLOOP : JNB TF0,DELAYLOOP CLR TR0 CLR TF0 DJNZ R3,DELAY RET |
Topic | Author | Date |
multiple key press | 01/01/70 00:00 | |
RE: multiple key press | 01/01/70 00:00 | |
RE: multiple key press | 01/01/70 00:00 | |
What do you mean? | 01/01/70 00:00 | |
RE: multiple key press | 01/01/70 00:00 | |
RE: multiple key press | 01/01/70 00:00 | |
RE: multiple key press | 01/01/70 00:00 | |
RE: multiple key press![]() | 01/01/70 00:00 |