Hi guys have been looking at connecting a 4 x4 matrix keyboard via 1 adc pin on a pic , ( yes i do like to not waist pins if i can help it ) found this around the internet as some one has done it in basic .

It was noted that the on resistance of each key needed be consistent even over time to ensure this to work correctly.

My question is ,
1. has anyone tried this at all , and how would membrane keys pad go with consistency using ACD.
2. has anyone tried using self learn routine on a ACD input such that a keyboard "on" resistance changes over time that it can adjust without input from the user to accommodate for change over time - may be a hard ask of a routine ?
Name:  KeyPad Using ADC.JPG
Views: 8775
Size:  75.4 KB
Code:
; One keypad (3x4) to one ADC pin, all Atoms
; 28 January 2010 By Ken Jennejohn
; Wiring: check wiring diagram supplied with post (this is now a 3x4 keypad!)

;****** Variable Assignments *******
kpad_in var word
old_kpad_in var word
old_kpad_in = 0
key var byte
old_key var byte
result var word

result = 0
looper var byte  ; for loops less than 256
bigloop var byte

pause 1000  ; Needed for PIC to initialize internally

serout s_out, i19200,[0, 7]  ; clear the screen, sound terminal "bell" 

MAIN
; Initialize main variables
key = "X"
result = 0
kpad_in = 0
old_kpad_in = 0
;Is a key pressed (ADC reading less than 900)? If not, go back to MAIN. 
ADIN P6, kpad_in
IF kpad_in > 900 then MAIN
; Falls thru when key pressed...

;  These two loops look for a legit key press, and determine which one.
pause 50  ; This allows keypad switch to finish "bounce"
FOR bigloop = 1 to 3  ; has to ID same key three times to pass
FOR looper = 1 to 10  ; read keypad input 10 times
   ADIN P6, kpad_in
; keypad switch "bounce" handled next

; Uncomment the next line for troubleshooting
;serout s_out, i19200, [dec (ABS(old_kpad_in - kpad_in)), 13]

; The difference between this key press and the last must be
; less than ten. We use the ABS(olute) modifier to keep results
; positive and avoid negative results. Greater than 10, do it over.
   IF ABS (old_kpad_in - kpad_in) > 10 then
      old_kpad_in = 0
      looper = 0
      result = 0
   ENDIF
   result = result + kpad_in
   old_kpad_in = kpad_in
next  ; looper
; get average of readings
result = result / 10

; This next output routine is available for troubleshooting, just uncomment it.
;serout s_out, i19200, ["result: ", dec result,13]

; We next do a gosub to routine that determines which key has been pressed
gosub Key_Is_

; Upon returning, we determine if the key was properly determined
IF key = "X" then MAIN  ; If key still "X" we failed
; If passed, we save it to check later. Must pass this three times to accept key press value.
IF key <> old_key then
   bigloop = 0  ; If comparison fails, restart bigloop
ENDIF
old_key = key  ; it's OK, save latest key value

next  ; bigloop

; If key press looks good after three tries we report it here and sound terminal "bell".
Report_
serout s_out, i19200, |   ; We use pipe symbol (the "|") to continue to the next line
[key, 7]  ; clear screen, home cursor first
   
; We wait here for key release
stay_here_
ADIN P6, kpad_in
IF kpad_in < 900 then stay_here_

; And then we do it all over again.
GOTO MAIN

;****** SubRoutine(s) ******
Key_Is_
; Uncomment the next line for troubleshooting
;serout s_out, i19200, ["key_is_ result val: ", dec result, 13]
IF result > 592 AND result < 602 then
         key = "1"
ENDIF   
IF result > 615 AND result < 625 then
         key = "2"
ENDIF
IF result > 640 AND result < 650 then
         key = "3"
ENDIF
IF result > 425 AND result < 435 then
         key = "4"
ENDIF
IF result > 465 AND result < 475 then
         key = "5"
ENDIF
IF result > 502 AND result < 512 then
         key = "6"
ENDIF
IF result > 695 AND result < 705 then
         key = "7"
ENDIF
IF result > 710 AND result < 720 then
         key = "8"
ENDIF
IF result > 725 AND result < 735 then
         key = "9"
ENDIF
IF result > 778 AND result < 782 then
         key = "0"
ENDIF
IF result > 0 AND result < 0 then
         key = "A"
ENDIF
IF result > 0 AND result < 0 then
         key = "B"
ENDIF
IF result > 0 AND result < 0 then
         key = "C"
ENDIF
IF result > 0 AND result < 0 then
         key = "D"
ENDIF
IF result > 768 AND result < 772 then
         key = "*"
ENDIF
IF result > 790 AND result < 801 then
         key = "#"
ENDIF

return

_________________
kenjj
http://blog.basicmicro.com/
http://kjennejohn.wordpress.com/