Vad jag kan se så beskriver 1-4 samma funktioner som i det förra inlägget du beskrev rutinen i.
Jag har testat rutinen i MPLAB SIM och kommit fram till att den gör vad dessa steg beskriver.
Nu lade jag till steg 5 i min kod (visste inte tidigare vad "Utföra en n-key-rollover" betydde), men det blev ingen skillnad.
Provade nu även att skriva om min rutin från grunden, baserat från stegen i ditt senaste inlägg,
men eftersom jag inte vet vad som var fel i min förra rutin så finns det en risk att felet följer med till den nya rutinen.
Här är iallafall rutinen:
Kod: Markera allt
;1 och 1A: Läs Port->"Temp". AND med ett bitmönster för knapparna om det inte är alla på porten.
movf PORTA, 0 ;Läs PORTA. Resultatet till W.
andlw b'00010000' ;Filtrera bort allt utom bit 4 (PORTA.4 ju..) Resultatet till W.
movwf knapp_temp ;Spara i knapp_temp.
;2: AND med "Previous"
andwf knapp_previous, 0 ;W (knapp_temp) AND med knapp_previous. Resultatet till W.
;3: Spara i "Work" ("Work" är bara en skräp-variabel)
movwf knapp_work ;W (resultatet) till knapp_work.
;4: "Temp" -> "Previous"
movf knapp_temp, 0 ;knapp_temp till W.
movwf knapp_previous ;W (knapp_temp) till knapp_previous.
;5: "Current" = "Current" & "Temp" // Nollar släppta knappar
movf knapp_current, 0 ;knapp_current till W.
andwf knapp_temp, 0 ;W (knapp_current) AND med knapp_temp. Resultatet till W.
movwf knapp_current ;W (resultatet) till knapp_current.
;6: "Key" = ("Work" XOR "Current") AND "Current"
movf knapp_work, 0 ;knapp_work till W.
xorwf knapp_current, 0 ;W (knapp_work) XOR med knapp_current. Resultatet till W.
andwf knapp_current, 0 ;W (knapp_current) AND med knapp_current. Resultatet till W.
movwf knapp_key ;W (resultatet) till knapp_key.
Mindre och renare kod än mitt förra försök.
När jag simulerar den så lyckas jag inte få något annat än noll på knapp_work och knapp_key.
Det känns spontat som ett fel...
Provade ändå att lägga till följande kod för att kunna toggla lysdioder:
Kod: Markera allt
;Knapp_toggle
btfss knapp_key, 4 ; <-- Ger ingen reaktion på lysdioderna.
; knapp_work ger däremot samma resultat som min förra rutin. (Fungerar, men inte bra.)
goto LED_visning
comf knapp_onoff, 0 ;Toggla knapp_onoff. TEST: Resultatet till W.
andlw b'00000001' ;TEST för att försäkra mig om att bara första biten används. <<
movwf knapp_onoff ;TEST tillbaka med resultatet till knapp_onoff.
LED_visning
btfsc knapp_onoff, 0 ;Är knapp_onoff = 1 ? Om inte: Hoppa över nästa rad.
movlw h'00' ;Tänd lysdioderna. (Inverterat, därav 00.)
btfss knapp_onoff, 0 ;Är knapp_onoff = 0 ? Om inte: Hoppa över nästa rad.
movlw h'ff' ;Släck lysdioderna. (Inverterat.)
movwf PORTC ;Lysdioderna..
Men ändå ingen framgång. Kan man inte toggla lysdioderna som jag gjort?
Jag är vilse (och min GPS stödjer inte MPLAB's .map-filer..)
Definiera "Previous", "Current" som bytes som är reserverat till denna rutin.
Hur reserverar man bytes till en rutin i assembler?
Korp:
räkna_knapp skulle inte ha varit med. Jag missade tydligen ; i början på den raden när jag kopierade koden.
(Variabeln kommer från en debug-test som är bortkommenterad i koden och som jag tog bort när jag klistrade in koden här.)
Var har jag missat banksel?
Tack för att du testade!

Då kan jag sluta stirra på knappen.
