Väckarklocka med Tetris att bevisa att du är vaken (5 / 16 steg)
Steg 5: Knappen debouncing
Avbrottet händer varje 4.1 ms (se steg 4) och jag väntar på 8 på varandra följande läsning av knappen Öppna eller slutna att deklarera knappen intryckt eller inte. Så knappen måste vara hantera trycks ned och släpps för 8 x 4,1 ms eller 32,8 ms. jag det genom att flytta en osignerad 1-byte variabel till vänster av 1 och sätta det aktuella läget för knappen i den minst signifikanta biten. Om den resulterande variabeln är 0xFF förklarar jag det tryckte och om det är 0x00 jag förklarar det inte intryckt. Också, du vill inte flera knapptryckningar för att registrera om växeln hålls längre än 32,8 ms så har staten om knappen pressas för närvarande inte att förklara det tryckte och vice versa.
Jag ökar också värdet för en variabel för att hålla reda på de totala knapptryckningar och antalet särskilda knapptryckningar. Dessa variabler är minskas när knappen tas om hand i funktionen standard loop(). Detta sätt knapptryckningar registreras omedelbart men den kod som faktiskt gör något nyttigt är inte i rutinen avbrott bogging ner. En avbrottsbegäran rutin bör hållas så kort som möjligt.
Det finns andra, kanske enklare, sätt att Dämpningstid växlar men jag har hittat detta sätt ganska robust, tillförlitlig och förbrukaren vänlig i en mängd tillämpningar.