Hallo Community, ich beschäftige mich neuerdings mit uC-Programmierung und habe eine Frage bzgl Flankenerkennung. Ich muss eine Tastatur (4x4 Tasten) einlesen und dabei eine positive Flanke (Drücken) und eine negative Flanke (Loslassen) erkennen. Die Zustände der Tasten lege ich in einer 16-Bit Variablen ab. Je nach Taste wird dann ein Display ein oder ausgeschaltet (Nur nebenbei) Leider habe ich keine Ahnung wie ich diese Flankenerkennung durchführen kann bzw wie ich aus meiner 16-Bit Variablen jetz bestimmen kann ob da eine positive oder negative Flanke anliegt. Hier mein Code bis jetzt:
1 | #include <XC161.h> |
2 | |
3 | #define D_IC2 (*(unsigned short volatile *)0x100002) //IC2 initialisieren
|
4 | #define D_IC3 (*(unsigned short volatile *)0x100004) //IC3 initialisieren
|
5 | |
6 | sbit P_IC3 = P7^6; // IC3 aktivieren |
7 | sbit Display = P7^4; // Hintergrundbeleuchtung |
8 | |
9 | unsigned short readKeys(void) { // 16-Bit darum short |
10 | |
11 | unsigned short var1; // 16-Bit Variable für Tastenzustände |
12 | int i=0,k=0; |
13 | |
14 | for(i=0; i<4; i++) { // 4 Transistoren 0-3 |
15 | |
16 | D_IC3 = (1 << i); // Transistoren durchschalten (0x00000001) 1 i-mal nach links schieben |
17 | for(k=0; k<=100, k++) {} // Wartezeit |
18 | |
19 | var1 = var1 | (P5&OxF); // Alter Wert von var wird mit einberechnet // P5&OxF -> Schalter drücken = 0 1111 & 1101 -> 1101 |
20 | |
21 | if(i != 3) { |
22 | |
23 | var1 = (var1 << 4); } // Letzten Zustand merken bzw 4Bit nach links schieben |
24 | |
25 | }
|
26 | var1 = ~var1; // Negieren damit Pos-Flanke Drücken & Neg-Flanke Loslassen |
27 | return var1; |
28 | }
|
29 | |
30 | void main (void){ |
31 | |
32 | unsigned static short keyState=0, keyEventPos, keyEventNeg, keyStateLast; |
33 | |
34 | DP7=0x00F0; // P7-Port Ausgangsport |
35 | DP5=0x0000; // P5-Port Eingangsport |
36 | |
37 | while(1) { |
38 | |
39 | P_IC3 = 0; // Warum?? |
40 | |
41 | keyStateLast = keyState; // Letzten Zustand merken |
42 | keyState = readKeys(); // Funktionsaufruf Tasten einlesen |
43 | |
44 | D_IC2 = keyState|(keyState>>8); // LED-Ansteuerung 1-8 |
45 | |
46 | }
|