PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 4x4 Matrixtastatur in C



the_Ghost666
26.03.2005, 12:42
Ich habe einen Code gebastelt, der eine 4x4 Tastatur abfragen soll. Ich würde euch bitten, dass mal anzusehen und zu schauen, ob es so klappen würde.



/*Funktion für 4x4Matrix Tastatur, i/o und pullups müssen vorher eingestellt werden */

#define Port PORTB
/*RB0-RB3 sind Ausgänge, RB4-RB7 sind Eingänge; Ausgänge auf high ausser einer, wenn eine Taste auf low, dann muss sie gedrückt sein gedrückt */


char Tastatur (void)
{
char Taste=1;
uns8 i,j;

Port=0b.0000.1110

for (i=1;i<5;i++)
{
Port = Port << 1;
Port++;

for (j=4;j<8;j++)
{
if Port.j!=0
Taste++;
else
return Taste;
}
}
}


was ich besonders unsicher finde ist mein Ausdruck "if Port.j!=0" . klappt das so?
"Port = Port << 1;
Port++;"
ist dazu da um immer einen Output auf Low zu legen, das carryflag wird mit dem befehl automatisch vorher gelöscht, deswegen danach noch +1. so schieb ich die eine null durch die untere hälfte von Port.
das ganze soll dann für MPLAB 7.10 mit CC5x free compiler benutzt werden.
es fehlen jetzt noch die zuweisungen für die tasten, momentan sind die ja einfach nur durchnummeriert, aber das kommt wenn es so klappt.

Felix G
26.03.2005, 13:04
was ich besonders unsicher finde ist mein Ausdruck "if Port.j!=0" . klappt das so?schreib doch einfach if(Port & (1 << j))

so klappts garantiert

the_Ghost666
26.03.2005, 15:02
ähm was macht dieser code den du da gepostet hast, ich versteh das nicht ganz

Felix G
26.03.2005, 15:49
Ok, ich versuch mal es zu erklären...

Die 1, also binär 00000001, wird mit dem Linksshift-Operator um j Stellen nach links geschoben. (es wird quasi das Bit "j" gesetzt)
Das resultierende Bitmuster wird anschließend und-verknüpft mit Port.

d.h. der gesamte Ausdruck liefert 0, wenn Bit-j in Port nicht gesetzt ist und sonst eben eine Zahl ungleich 0.


Hier mal zwei Rechenbeispiele:



j = 5
=> (1 << j) = 00100000

Port = 11010010
(Port & (1 << j)):

11010010
& 00100000
----------
= 00000000 = 0



j = 6
=> (1 << j) = 01000000

Port = 01110100
(Port & (1 << j)):

01110100
& 01000000
----------
= 01000000 = 64