RFsolution, Here ia a snipit of code I wrote back somewhere in 2003. I hope this helps....



I2CWRITE SDA,SCL,UNIT0,[%11110000] 'ALL COLLUM LINEs LOW
AGAIN:
GOSUB READKBD
GOTO AGAIN


'************************************************* ********************
READKBD: 'READ DIGITAL INPUTS FROM KEYBOARD
'************************************************* ********************
KEYDOWN = 1
I2CREAD SDA,SCL,UNIT0,[KEYPRESS] 'LOOK FOR SWITCHES DOWN
KEYPRESS = KEYPRESS >> 4
IF KEYPRESS < 15 THEN 'KEY NOW BEING PRESSED
IF KEYFLG = 1 THEN 'KEY ALREADY BEEN FLAGED & PROCESSED
GOTO DONEKEY
ENDIF
INCDEC = 1 'INCREMENT DEBOUNCE COUNTER
IF DEBOUNCE = 65535 THEN '16 Ms. THRU ROUTINE TO KEY
FOR JUNK = 0 TO 3 'CYCLE THRU COLLUMS
I2CWRITE SDA,SCL,UNIT0,[~(DCD JUNK)] 'ONE LINE LOW @ A TIME
I2CREAD SDA,SCL,UNIT0,[KEYPRESS] 'LOOK FOR SWITCHES DOWN
KEYPRESS = KEYPRESS >> 4
IF KEYPRESS < 15 THEN MAP 'IF SWITCH IS PRESSED THEN
NEXT
I2CWRITE SDA,SCL,UNIT0,[%11110000] 'ALL COLLUM LINEs LOW
GOTO DONEKEY
MAP: KEYFLG = 1 ' Set Debounce flag
KEYPRESS = NCD((~KEYPRESS) & 15)
KEYPRESS = KEYPRESS + (JUNK * 4)
LOOKUP KEYPRESS,[0,49,52,55,42,50,53,56,48,51,54,57,35],INKEY ' Map of the keypad legends
LCDOUT $FE,$80
PAUSEUS 100
LCDOUT DEC2 KEYPRESS,"=",INKEY
I2CWRITE SDA,SCL,UNIT0,[%11110000] 'ALL COLLUM LINEs LOW
ENDIF
ELSE
IF DEBOUNCE > 0 THEN
INCDEC = 0 'DECREMENT DEBOUNCE COUNTER
ELSE
KEYFLG = 0 ' No key pressed, so Reset debounce flag
KEYDOWN = 0 ' No key pressed, so Reset key Debounce flag
ENDIF
ENDIF
DONEKEY:
RETURN


Dave Purola,
N8NTA