Gordons Projects

--> Projects Top-Level GIT

Initial migration to GIT
[piTrak] / keypad.c
1
2 // keypad.c
3 //      Handle the PiTrak keypad
4 //
5 // OK. This might not seem the "usual" way, but it's working for me...
6 //      What I'm doing here is keeping all 8 line as inputs and setting
7 //      some high/low using the internal pull-up/down resistors, then
8 //      scanning the matrix. It's not the best way, but for now I think
9 //      I may have soldered the limiting resistors to the wrong pins
10 //      on the connector and I'm too lazy to un-solder them.
11 //      that's the trouble with using a keypad I made 25+ years ago -
12 //      I've forgotten how I wired it up...
13
14 #undef  DEBUG
15
16 #ifdef  DEBUG
17 #  include <stdio.h>
18 #endif
19
20 #include <wiringPi.h>
21
22 #include "keypad.h"
23
24 #define KEYPAD_LOCK     0
25
26 static int rows [4] = { 14, 13, 10, 12 } ;
27 static int cols [4] = { 11,  4,  1,  7 } ;
28
29 static int remap [16] =
30 {
31 /*
32   0 4 8 12
33   1 5  9 13
34   2 6 10 14
35   3 7 11 15
36
37   1, 2, 3 A
38   4  5  6 B
39   7  8  9 C
40   E  0  F D
41 */
42
43    1,  4,  7, 15,
44    2,  5,  8,  0,
45    3,  6,  9, 14,
46   10, 11, 12, 13,
47 } ;
48   
49 static int keypadKey = -1 ;
50
51 static PI_THREAD (keypadScanner)
52 {
53   int row, col, myKey ;
54
55   piHiPri (10) ;
56   delay   (100) ;
57
58 // Scan
59
60   for (;;)
61   {
62
63 // Wait for the last key to be read
64
65     while (keypadKey != -1)
66       delay (10) ;
67
68 // Scan the matrix until we get a key
69
70     myKey = -1 ;
71     for (row = 0 ; row < 4 ; ++row)
72     {
73       digitalWrite (rows [row], HIGH) ; delay (1) ;
74
75       for (col = 0 ; col < 4 ; ++col)
76       {
77         if (digitalRead (cols [col]) != 0)
78         {
79           myKey = row * 4 + col ;
80           break ;
81         }
82         if (myKey != -1)
83           break ;
84       }
85
86       digitalWrite (rows [row], LOW) ;  delay (1) ;
87     }
88
89     if (myKey == -1)    // Nothing pressed
90       continue ;
91
92     piLock (KEYPAD_LOCK) ;
93       keypadKey = myKey ;
94     piUnlock (KEYPAD_LOCK) ;
95
96     digitalWrite (8, HIGH) ;
97
98 #ifdef  DEBUG
99     printf ("Scan Got key %d\n", keypadKey);
100 #endif
101
102
103 // Now wait for all keys to be released
104
105     delay (20) ;        // Debounce?
106     for (row = 0 ; row < 4 ; ++row)
107       digitalWrite (rows [row], HIGH) ;
108
109 #ifdef  DEBUG
110     printf ("Waiting for release ... ") ; fflush (stdout) ;
111 #endif
112
113     row = 1 ;
114     while (row != 0)
115     {
116       delay (20) ;
117       for (col = row = 0 ; col < 4 ; ++col)
118         row += digitalRead (cols [col]) ;
119     }
120     for (row = 0 ; row < 4 ; ++row)
121       digitalWrite (rows [row], LOW) ;
122
123     digitalWrite (8, LOW) ;
124
125 #ifdef  DEBUG
126     printf ("done\n") ;
127 #endif
128
129   }
130   return 0 ;    // Not reached
131 }
132
133
134 /*
135  * readKeypad:
136  *      This is the main interface - get the next character, or return -1
137  *      if there is nothing to read.
138  *********************************************************************************
139  */
140
141 int keypadPressed (void)
142 {
143   return keypadKey != -1 ;
144 }
145
146
147 int keypadGetchar (void)
148 {
149   int key ;
150
151   while (!keypadPressed ())
152     delay (10) ;
153
154   key       = keypadKey ;
155   keypadKey = -1 ;
156
157   return remap [key] ;
158 }
159
160
161 /*
162  * setupKeypad:
163  *********************************************************************************
164  */
165
166 void setupKeypad (void)
167 {
168   int row, col ;
169
170   for (row = 0 ; row < 4 ; ++row)
171   {
172     pinMode      (rows [row], OUTPUT) ;
173     digitalWrite (rows [row], LOW) ;
174   }
175
176   for (col = 0 ; col < 4 ; ++col)
177   {
178     pinMode         (cols [col], INPUT) ;
179     pullUpDnControl (cols [col], PUD_DOWN) ;
180   }
181
182 // Keypad LED
183
184   pinMode      (8, OUTPUT) ;
185   digitalWrite (8, LOW) ;
186
187   piThreadCreate (keypadScanner) ;
188 }