1.) die Mehrmalsbetätigung des Tasters nennt sich "prellen". Am einfachsten vermeidest du das, indem du noch abfragst, ob der Taster wieder losgelassen wurde und dazwischen ne pause machst...
Das sieht dann ungefähr so aus:
Prüfe Taster T1, wenn gedrückt, dann Routine für T1.
-> Routine T1 -> deine normale Routine, wie bisher...
-> Marke T1wait: Warteschleife (10-50ms, je nachdem wie stark dein Taster prellt)
-> prüfe ob Taster losgelassen, wenn ja, dann Ende Schleife, wenn nein, dann gehe zu T1wait.
Damit erzwingst du, dass die Taste losgelassen wird, bis die nächste Bearbeitung erfolgen kann.
Und mit der Warteschleife erzwingst du, dass das eigentliche Hardware-Prellen des Tasters (bedingt durch das leichte Zittern des Fingers und ähnliche Effekte) sich nicht auswirken.
2.) ANDWF (die anderen sind ähnlich)
Was ist das überhaupt?
AND W F bedeutet ganz einfach: Nimm das, was in F steht, verknüpfe es logisch UND mit dem, was in W steht und speicher das ganze dann in W ab.
Logisch UND verknüpfen ist eigentlich ganz einfach:
- Du hast in W 00011001 stehen.
- Und in F steht 00001111.
UND bedeutet dann, dass du die Schnittmenge bildest, d.h. alles wo beides auf 1 ist, ergibt auch 1.
Ergebnis:
0&0=0 W=00011001, F=00001111
0&0=0 W=00011001, F=00001111
0&0=0 W=00011001, F=00001111
1&0=0 W=00011001, F=00001111
1&1=1 W=00011001, F=00001111
0&1=0 W=00011001, F=00001111
0&1=0 W=00011001, F=00001111
1&1=1 W=00011001, F=00001111
Das Ergebnis wieder in W, damit steht dann in W: 00001001
Das ganze geht über Wahrheitstabellen:
A AND B = X: (und)
Code:
A
B x|0|1
0|0|0
1|0|1
A OR B = X: (oder, auch als Inklusiv-oder bekannt, daher IOR)
Code:
A
B x|0|1
0|0|1
1|1|1
A XOR B = X: (entweder - oder, auch als Exklusiv-oder bekannt)
Code:
A
B x|0|1
0|0|1
1|1|0
A NAND B = X: (nicht und)
Code:
A
B x|0|1
1|0|0
1|0|0
A NOR B = X: (nicht oder)
Code:
A
B x|0|1
0|1|1
1|1|0
A NXOR B = X: (nicht entweder-oder, sehr selten)
Code:
A
B x|0|1
0|1|0
1|0|1
Du hattest dann neben ANDWF noch ANDLW, das bedeutet nichts anderes als:
W AND L -> W, dabei ist L ein sog. Literal, d.h. ein fester Wert, den du schon bei der Programmierung fest einträgst.
Damit man das später noch schön lesen kann und du später nicht an tausenden Stellen im Programm nach dem Wert suchen musst, macht man das häufig über "Define"-Statements. Das sind Präprozessor-Anweisungen, die (automatisch) abgearbeitet werden, bevor dein Assembler drüber geht. Das include ganz am Anfang ist z.B. auch so eine Präprozessor-Anweisung (oder auch P.-Direktive genannt).
Bsp:
Code:
#define WARTEZYKLEN 27 ;Anzahl der Totzyklen für Warteschleife
Der Wert ist, sofern du nichts anderes angibst, dezimal.
Btw. schau dir mal dein Include-File an, dort drinnen findest du jede Menge defines (eigentlich fast ausschließlich). Das komtm daher, dass da drinnen nichts mysteriöses steht, sondern nur in welchem Register sich was befindet - und das dann in Namen verpackt, so dass man nicht für jeden anderen Typ alles umschreiben muss (sondern nur noch kleinere Teile).
Daher bietet es sich eigentlich fast immer an, mit Hilfe von equ und define "variablen" zu "definieren".
MfG
Stefan
Lesezeichen