Äsch. Det är svårt att veta vilken nivå man ska förklara på. Jag brinner för det här med knappar, jag kan inte hålla mig
Jag försöker bryta ner det i bitar (ursäkta skämtet).
Om detta inte intresserar dig så kan du ignorera denna post. Kanske finns det någon annan knappfetischist därute som blir glad.
Ok.
Om du redan har ett delay i din loop och inte planerar att utöka koden rejält så blir det ungefär samma effekt som en interrupt.
Vad jag försökte förklara var en lösning där EN knapptryckning endast registreras som ETT tryck. Alltså när input pinnen växlas från det "statiska" till det "aktiva", eller "dynamiska" som du kallade det.
Tänk ett pärlband med svarta och vita pärlor som läggs på rad vid varje läsning. Vit för icke nertryckt, svart för nertryckt. Det du behöver leta efter då är en sekvens av TVÅ pärlor där första vit och andra svart. Alla andra kombinationer räknas som icke nertryckt. Ok?
Detta är bra för att det går att utöka lätt om du vill ha större precision.
Låt säga att du vill läsa knappen i en väldigt snabb loop. 100kHz t.ex.
Då är det lätt att få kontaktstudsar. En så kallad bounce effekt. Där kontaktelementen glappar till några gånger vid till och av.
Detta skulle då ge ett pärlband av först en massa vita(statiska) pärlor och sedan - när knappen trycks ner - ett gäng vita och svarta huller om början för att sedan landa i bara svarta.
Då min vän, zoomar man ut och letar efter en rad som ser ut så här tex:
vit-svart-svart-svart-svart-svart-svart-svart
Den nervösa studsningen har då förhoppningsvis passerat och man kan tolka detta som en nertryckt knapp.
Eftersom jag valde 8 pärlor i mitt synfält så har jag gjort en 8 bitars "debounce" funktion. Ryms bra i en byte.
Kommer inte ihåg vilket språk du skriver men i C ser det ut så här:
static unsigned char debounceByte = 0; // vårt pärlband
unsigned char debMask = 0xFF; // vi begränsar synfältet till en byte, 8 bitar
unsigned char debMatch = 0x7F; // en vit till höger, resten svarta
// gör plats för en ny pärla till höger genom att skifta pärlbandet till vänster. Lägg sedan till input pinnen som 1 eller 0. 1 är alltså biten längst till höger i byten(pärlbandet). Så kallad LSB (least significant bit)
debounceByte = (debounceByte << 1) + inputPin;
// kolla om pärlbandet matchar vårt mönster
if((debounceByte & debMask) == debMatch) {
// booyaa!!
}
Vill man ha ännu bättre responskänsla tar man en tvåbitars match vid nertryckt samt en 8 bitars på uppsläppt. Sedan lägger dessa i ytterligare en static och letar efter en två bitars == 0x1 i den. Då har man supersnabb superlösning!!
Som sagt. Ursäkta malandet ... nu tar vi helg !!