My Logo & Home Link Answers Coding Examples
Help in Electronics
IT logo & Link

   
 

ORG 0 /*PROGRAM START VECTOR*/ JMP main ORG 0003H /*EXTERNAL INT1 START VECTOR*/ JMP runKeyISR /************************************************************************ *Program to scan a keypad on P1 and output the pressed kay value to P0 * *P1.0 - P1.3 rows P1.4 - P1.7 columns * *Process key flag = 4OH * ************************************************************************/ ORG 0030H /* MAIN START VECTOR*/ main: MOV TMOD, #01H /*SET T0 FOR 16 BIT TIMER*/ SETB IT0 /*SET EX0 AS EDGE ACTIVATED*/ SETB EX0 /*SET EXTERNAL KEY PRESS INT*/ CLR P1.0 /*SET ROWS AS OUTPUTS FOR SCAN*/ CLR P1.1 CLR P1.2 CLR P1.3 SETB P0.4 /*SET COLUMNS AS INPUTS FOR SCAN*/ SETB P1.5 SETB P1.6 SETB P1.7 loop: SETB EA /*ENABLE INTS*/ JNB 40H, $ /*WAIT FOR KEY DOWN INT IF NO KEY FOUND YET*/ CLR 40H /*CLEAR PROCESS KEY FLAG*/ MOV P0, A /*MOVE SCANNED NUMBER FROM A TO P0*/ JMP loop /*JUMP BACK TO WAITING FOR KEY DOWN*/ runKeyISR: CLR EX0 /*DISABLE INT0 INT*/ CALL debounce /*RUN DELAY TO CANCEL OUT DEBOUNCE*/ CALL scanPad /*GET KEY DOWN NUMBER*/ CALL clearPad /*IN PLACE OF waitForKeyRelease*/ CLR IE0 /*CLR INT0 FLAG*/ SETB EX0 /*ENABLE INT0 INT*/ CLR EA /*DISABLE INTS*/ RETI debounce: CLR TR0 /*STOP TIMER IN CASE ITS LEFT RUNNING*/ MOV TH0, #8AH /*SET TIMER0 FOR 35,536 (8AD0)*/ MOV TL0, #0D0H SETB TR0 /*START TIMER*/ JNB TF0, $ /* WAIT FOR OVERFLOW*/ CLR TF0 /*CLEAR OVERFLOW*/ CLR TR0 /*STOP TIMER0*/ RET scanPad: MOV A,0H /*CLEAR A READY FOR NEW KEY DOWN NUMBER*/ CLR P1.0 /*CLEAR 1ST ROW*/ SETB P1.1 /*SET ALL OTHER ROWS*/ SETB P1.2 SETB P1.3 CALL colScan /*SCAN THE COLUMNS*/ JB 40H, return /*TEST FOR KEY*/ SETB P1.0 CLR P1.1 /*CLEAR 2ND ROW*/ SETB P1.2 /*SET ALL OTHER ROWS*/ SETB P1.3 CALL colScan /*SCAN THE COLUMNS*/ JB 40H, return /*TEST FOR KEY*/ SETB P1.0 SETB P1.1 CLR P1.2 /*CLEAR 3RD ROW*/ SETB P1.3 /*SET ALL OTHER ROWS*/ CALL colScan /*SCAN COLUMNS*/ JB 40H, return /*TEST FOR KEY*/ SETB P1.0 /*SET ALL OTHER ROWS*/ SETB P1.1 SETB P1.2 CLR P1.3 /*CLEAR 4TH ROW*/ CALL colScan /*SCAN COLUMNS*/ return: RET colScan: JNB P1.4, skip /*SCAN FIRST COLUNM*/ INC A /*INC A FOR KEY ID*/ JNB P1.5, skip /*SCAN SECOND COLUMN*/ INC A /*INC A FOR KEY ID*/ JNB P1.6, skip /*SCAN THIRD COLUNM*/ INC A /*INC A FOR KEY ID*/ JNB P1.7, skip /*SCAN FOURTH COLUMN*/ INC A /*INC A FOR KEY ID*/ RET /*RETURN IF NO KEY FOUND ON THAT COLUMN*/ skip: SETB 40H /*KEY FOUND SO SET TO JUMP OUT OF JNB WAIT LOOP*/ RET clearPad: CLR P1.0 /*CLEAR THE KEYPAD ROWS READY FOR NEXT SCAN*/ CLR P1.1 CLR P1.2 CLR P1.3 RET END
 

Valid XHTML 1.0 Transitional