Hallo,
für mein derzeitiges Schulprojekt brauche ich eine RGB-LED-Matrix mit Tastern unter den LED's. Dazu verwende ich das Sparkfun ButtonPad 4x4 mit der entsprechenden Platine. Leider haben die Taster einen Widerstand von ca. 100K, was dazu führt, dass mein Controller AT89C5131A-S3SUM das Signal nicht mehr erkennt, da zu wenig Strom fließt. Daher habe ich mir eine Verstärkerschaltung gebastelt:
Die Anschlüsse P0.4 bis P0.7 führen auf den Controller. Die Anschlüsse Row0 bis Row3 führen auf die Zeilen meiner Tastermatrix. Das ganze funktioniert auch soweit, der Controller erkennt die Signale. Solange der Controller eine 1 auf der der entsprechenden Spalte ausgibt, kommen die Zeilensignale an. Jetzt muss ich ja um alle Taster zu erkennen quasi wie beim Multiplexen vorgehen, eine Spalte nach der anderen freigeben und die Zeilensignale auslesen. Das Problem ist jetzt, dass ich manchmal wieder falsche Signale erhalte. Beim loslassen des Tasters, erkennt der Controller plötzlich ein Signal auf allen Spalten und den unteren drei Zeilen, egal welchen Taster ich drücke.
Folgenden Code verwende ich zum auslesen, wobei BUTTON_MATRIX dem Port entspricht, an dem die Matrix angeschlossen ist:
Als Rückgabewert erhalte ich manchmal als falschen Rückgabewert im Akku 11101111b. Habe ich jetzt etwas im Code falsch gemacht, oder ist meine Hardware mal wieder suboptimal, wäre ja nicht das erste Mal.Code:buttonGet: push PSW ;PSW retten clr RS1 ;Registerbank 0 wählen clr RS0 push AR0 push AR1 push AR2 mov R0,#4 mov R1,#11111110b bGLoop: mov BUTTON_MATRIX,R1 mov A,BUTTON_MATRIX anl A,#11110000b cjne A,#0,bGLoopP sjmp bGLoopC bGLoopP: mov R2,BUTTON_MATRIX xch A,R2 cpl A anl A,#00001111b orl A,R2 sjmp bGRet bGLoopC: mov A,R1 rl A mov R1,A djnz R0,bGLoop bGRet: mov BUTTON_MATRIX,#11110000b ;Zeilen freigeben, Spalten aktivieren pop AR2 pop AR1 pop AR0 pop PSW ;PSW wiederherstellen ret
Vielen Dank für jede Hilfe.
MfG
Der Eisvogel







Zitieren

Lesezeichen