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:
Klicke auf die Grafik für eine größere Ansicht

Name:	Schaltplan 2.png
Hits:	6
Größe:	10,2 KB
ID:	24967

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:
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
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.

Vielen Dank für jede Hilfe.

MfG
Der Eisvogel