PDA

View Full Version : I2C PCF8574 4X4 Keypad routine



RFsolution
- 27th January 2007, 15:35
Hi all

I was wondering if someone made some code to use a 4X4 or any other matrix keypad by I2C using an IO expander PCF8574 ?

I found some code examples on 4X4 keypad routines like Mister_E etc...

To avoid waisting IO's on the PIC I2C might be a nice solution.

Anyone ?

Dave
- 28th January 2007, 19:51
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

mister_e
- 28th January 2007, 21:25
You could still use 1 Analog pin and few resistor.. kind of R-2R network.

You could refer to tip #5,6 and #7 of the Microchip Tips and trick DS40040B
http://ww1.microchip.com/downloads/en/devicedoc/40040b.pdf