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