{"id":1084,"date":"2016-01-26T22:05:00","date_gmt":"2016-01-26T22:05:00","guid":{"rendered":"http:\/\/wp.andreas.bieri.name\/myblog\/?p=1084"},"modified":"2016-01-26T22:05:00","modified_gmt":"2016-01-26T22:05:00","slug":"democode-tastenentprellung","status":"publish","type":"post","link":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/26\/democode-tastenentprellung\/","title":{"rendered":"Democode Tastenentprellung (Arduino)"},"content":{"rendered":"<p>Tastatureingaben wird man immer brauchen. Hier eine universelle Routine zur Entprelllung. Als Zusatzfunktion k\u00f6nnen lange und kurze Tastendr\u00fccke erkannt werden. Diese Routine l\u00e4uft auf g\u00e4ngigen Arduinos. F\u00fcr den Mikro C Compiler gibt es <a href=\"http:\/\/wp.andreas.bieri.name\/myblog\/index.php\/2016\/01\/26\/democode-tastenentprellung-mikro-c\/\">hier<\/a> eine angepasste Version.<\/p>\n<p>Link:\u00a0<a href=\"http:\/\/www.mikrocontroller.net\/articles\/AVR-Tutorial:_Tasten\">http:\/\/www.mikrocontroller.net\/articles\/AVR-Tutorial:_Tasten<\/a><\/p>\n<p><strong>Keys.c<\/strong><\/p>\n<p><span style=\"color: #3366ff;\">\/\/ &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- Debounced Keys &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/span><br \/>\n<span style=\"color: #3366ff;\">\/\/ Idee: Peter Dannegger, \u00fcberarbeitet A. Bieri<\/span><br \/>\n<span style=\"color: #3366ff;\">\/\/ einlesen von allen 8 Tasten eines Ports gleichzeitig (active low), interruptgesteuerte Entprellung<\/span><br \/>\n<span style=\"color: #3366ff;\">\/\/ Es k\u00f6nnen kurze und lange Tastendr\u00fccke unterschieden werden, optional mit Repeat Funktion<\/span><br \/>\n<span style=\"color: #3366ff;\">\/\/ mit Bitmasken wird das Verhalten definiert<\/span><br \/>\n<span style=\"color: #3366ff;\">\/\/ Jede Taste wird immer nur einmal ausgelesen, muss aber auch manuell gel\u00f6scht werden, sonst bleibt der Tastendruck<\/span><br \/>\n<span style=\"color: #3366ff;\">\/\/ gespeichert (reset_all_keys)<\/span><br \/>\n<span style=\"color: #3366ff;\">\/\/<\/span><br \/>\n<span style=\"color: #3366ff;\">\/\/ Anpassungen: Frequenz, Zeiten, Tastenmaske, Port, Interrupt-Timer, Interruptroutine in Hauptprogramm kopieren<\/span><\/p>\n<p><span style=\"color: #3366ff;\">\/\/ ***************** ARDUINO VERSION ************************<\/span><\/p>\n<pre>#include \"Keys.h\"<\/pre>\n<pre>volatile uint8_t key_state;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ debounced and noninverted key state:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ bit = 0: key pressed\nvolatile uint8_t key_press;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ key press detect\nvolatile uint8_t key_rpt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ key long press and repeat\nvolatile uint8_t key_long;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ key long press no repeat<\/pre>\n<pre>\/\/\n\/\/ check if a key has been pressed. Each pressed key is reported only once\n\/\/\nuint8_t get_key_press( uint8_t key_mask )\n{\n\u00a0 CLI\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ interrupt disable\n\u00a0 key_mask &amp;= key_press;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ read key(s)\n\u00a0 key_press ^= key_mask;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ clear key(s)\n\u00a0 SEI\n\u00a0 return key_mask;\n}<\/pre>\n<pre>\/\/\n\/\/ check if a key has been pressed long enough such that the\n\/\/ key repeat functionality kicks in. After a small setup delay\n\/\/ the key is reported beeing pressed in subsequent calls\n\/\/ to this function. This simulates the user repeatedly\n\/\/ pressing and releasing the key.\n\/\/\nuint8_t get_key_rpt( uint8_t key_mask )\n{\n\u00a0 CLI;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ read and clear atomic !\n\u00a0 key_mask &amp;= key_rpt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ read key(s)\n\u00a0 key_rpt ^= key_mask;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ clear key(s)\n\u00a0 SEI;\n\u00a0 return key_mask;\n}<\/pre>\n<pre>\/\/\n\/\/ check if a key has been pressed long enough such that the\n\/\/ secondary functionality kicks in.\n\/\/\nuint8_t get_key_long( uint8_t key_mask )\n{\n\u00a0 CLI;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ read and clear atomic !\n\u00a0 key_mask &amp;= key_long;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ read key(s)\n\u00a0 key_long ^= key_mask;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ clear key(s)\n\u00a0 SEI;\n\u00a0 return key_mask;\n}<\/pre>\n<pre>\/\/\n\/\/ read key state and key press atomic !\n\/\/\nuint8_t get_key_short( uint8_t key_mask )\n{\n\u00a0 CLI;\n\u00a0 return get_key_press( ~key_state &amp; key_mask );\n}<\/pre>\n<pre>\/\/\n\/\/ reset all key states\n\/\/\nvoid reset_all_keys( void )\n{\n\u00a0 get_key_short(ALL_KEYS); get_key_long(ALL_KEYS); get_key_rpt(ALL_KEYS);\n}<\/pre>\n<pre>\/\/ in Hauptprogramm kopieren und Timer anpassen\n\/\/ --------------------------------------------------------------------------\n\/*void timerinterrupt( void )\u00a0 org IVT_ADDR_TIMER0_OVF\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ every 10ms\n{\n\u00a0 static uint8_t ct0, ct1, rpt, secac;\n\u00a0 volatile uint8_t i;<\/pre>\n<pre>\u00a0 TCNT0 = (uint8_t)(int16_t)-(F_CPU \/ 1024 * 10e-3 + 0.5);\u00a0 \/\/ preload for 10ms<\/pre>\n<pre>\u00a0 i = key_state ^ KEY_PIN;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ key changed ?\n\u00a0 ct0 = ~( ct0 &amp; i );\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ reset or count ct0\n\u00a0 ct1 = ct0 ^ (ct1 &amp; i);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ reset or count ct1\n\u00a0 i &amp;= ct0 &amp; ct1;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ count until roll over ?\n\u00a0 key_state ^= i;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ then toggle debounced state\n\u00a0 key_press |= key_state &amp; i;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ 0-&gt;1: key press detect\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ missing: reset key repeat when key is released<\/pre>\n<pre>\u00a0 if( (key_state &amp; LONG_MASK) == 0 )\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ check secondary function\n\u00a0\u00a0\u00a0\u00a0 secac = LONG_START;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ start delay\n\u00a0 if( --secac == 0 ){\n\u00a0\u00a0\u00a0 key_long |= key_state &amp; LONG_MASK;\n\u00a0 }\n\u00a0 if( (key_state &amp; REPEAT_MASK) == 0 )\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ check repeat function\n\u00a0\u00a0\u00a0\u00a0 rpt = REPEAT_START;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ start delay\n\u00a0 if( --rpt == 0 ){\n\u00a0\u00a0\u00a0 rpt = REPEAT_NEXT;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ repeat delay\n\u00a0\u00a0\u00a0 key_rpt |= key_state &amp; REPEAT_MASK;\n\u00a0 }\n}*\/<\/pre>\n<p><strong>Keys.h<\/strong><\/p>\n<pre>#ifndef Keys\n#define Keys\n\n#ifndef F_CPU\n#define F_CPU 8000000 \/\/ processor clock frequency\n#endif\n#define KEY_DDR DDRB \/\/ alle Tasten am Port B gleichzeitig auslesbar\n#define KEY_PORT PORTB\n#define KEY_PIN PINB\n#define KEY0 0\n#define KEY1 1\n#define KEY2 2\n#define KEY3 3\n#define ALL_KEYS (1&lt;&lt;KEY0 | 1&lt;&lt;KEY1 | 1&lt;&lt;KEY2) \/\/ where keys are connected\n#define REPEAT_MASK (1&lt;&lt;KEY0 | 1&lt;&lt;KEY2) \/\/ repeat: key2\n#define REPEAT_START 100 \/\/ after 1000ms\n#define REPEAT_NEXT 10 \/\/ every 100ms\n#define LONG_MASK (1&lt;&lt;KEY1) \/\/ secondary action on long press: key1\n#define LONG_START 100 \/\/ after 1000ms\n#define LONG_NEXT 10 \/\/ every 100ms\n#define CLI SREG_I_bit = 0;\n#define SEI SREG_I_bit = 1;\n\ntypedef unsigned short uint8_t;\ntypedef signed int int16_t;\n\nextern volatile uint8_t key_state; \/\/ debounced and noninverted key state:\n \/\/ bit = 0: key pressed\nextern volatile uint8_t key_press; \/\/ key press detect\nextern volatile uint8_t key_rpt; \/\/ key long press and repeat\nextern volatile uint8_t key_long;\n\nuint8_t get_key_press(uint8_t);\nuint8_t get_key_rpt(uint8_t);\nuint8_t get_key_long(uint8_t);\nuint8_t get_key_short(uint8_t);\nvoid reset_all_keys( void );\n\/\/void timerinterrupt( void ) org IVT_ADDR_TIMER0_OVF;\n#endif<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Tastatureingaben wird man immer brauchen. Hier eine universelle Routine zur Entprelllung. Als Zusatzfunktion k\u00f6nnen lange und kurze Tastendr\u00fccke erkannt werden. Diese Routine l\u00e4uft auf g\u00e4ngigen Arduinos. F\u00fcr den Mikro C Compiler gibt es hier eine angepasste Version. Link:\u00a0http:\/\/www.mikrocontroller.net\/articles\/AVR-Tutorial:_Tasten Keys.c \/\/ &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- Debounced Keys &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; \/\/ Idee: Peter Dannegger, \u00fcberarbeitet A. Bieri \/\/ einlesen von allen [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[13],"tags":[18,38],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v18.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Democode Tastenentprellung (Arduino) - Merkbar.<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/26\/democode-tastenentprellung\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Democode Tastenentprellung (Arduino) - Merkbar.\" \/>\n<meta property=\"og:description\" content=\"Tastatureingaben wird man immer brauchen. Hier eine universelle Routine zur Entprelllung. Als Zusatzfunktion k\u00f6nnen lange und kurze Tastendr\u00fccke erkannt werden. Diese Routine l\u00e4uft auf g\u00e4ngigen Arduinos. F\u00fcr den Mikro C Compiler gibt es hier eine angepasste Version. Link:\u00a0http:\/\/www.mikrocontroller.net\/articles\/AVR-Tutorial:_Tasten Keys.c \/\/ &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- Debounced Keys &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; \/\/ Idee: Peter Dannegger, \u00fcberarbeitet A. Bieri \/\/ einlesen von allen [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/26\/democode-tastenentprellung\/\" \/>\n<meta property=\"og:site_name\" content=\"Merkbar.\" \/>\n<meta property=\"article:published_time\" content=\"2016-01-26T22:05:00+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"wp_blogadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/#website\",\"url\":\"http:\/\/52.29.166.97\/myblog\/\",\"name\":\"Merkbar.\",\"description\":\"IT, Elektronik und Mathematik\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/52.29.166.97\/myblog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/26\/democode-tastenentprellung\/#webpage\",\"url\":\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/26\/democode-tastenentprellung\/\",\"name\":\"Democode Tastenentprellung (Arduino) - Merkbar.\",\"isPartOf\":{\"@id\":\"http:\/\/52.29.166.97\/myblog\/#website\"},\"datePublished\":\"2016-01-26T22:05:00+00:00\",\"dateModified\":\"2016-01-26T22:05:00+00:00\",\"author\":{\"@id\":\"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d\"},\"breadcrumb\":{\"@id\":\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/26\/democode-tastenentprellung\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/26\/democode-tastenentprellung\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/26\/democode-tastenentprellung\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"http:\/\/52.29.166.97\/myblog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Democode Tastenentprellung (Arduino)\"}]},{\"@type\":\"Person\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d\",\"name\":\"wp_blogadmin\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/52.29.166.97\/myblog\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g\",\"caption\":\"wp_blogadmin\"},\"url\":\"http:\/\/wp.andreas.bieri.name\/myblog\/author\/wp_blogadmin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Democode Tastenentprellung (Arduino) - Merkbar.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/26\/democode-tastenentprellung\/","og_locale":"de_DE","og_type":"article","og_title":"Democode Tastenentprellung (Arduino) - Merkbar.","og_description":"Tastatureingaben wird man immer brauchen. Hier eine universelle Routine zur Entprelllung. Als Zusatzfunktion k\u00f6nnen lange und kurze Tastendr\u00fccke erkannt werden. Diese Routine l\u00e4uft auf g\u00e4ngigen Arduinos. F\u00fcr den Mikro C Compiler gibt es hier eine angepasste Version. Link:\u00a0http:\/\/www.mikrocontroller.net\/articles\/AVR-Tutorial:_Tasten Keys.c \/\/ &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- Debounced Keys &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; \/\/ Idee: Peter Dannegger, \u00fcberarbeitet A. Bieri \/\/ einlesen von allen [&hellip;]","og_url":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/26\/democode-tastenentprellung\/","og_site_name":"Merkbar.","article_published_time":"2016-01-26T22:05:00+00:00","twitter_card":"summary","twitter_misc":{"Verfasst von":"wp_blogadmin","Gesch\u00e4tzte Lesezeit":"4 Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebSite","@id":"http:\/\/52.29.166.97\/myblog\/#website","url":"http:\/\/52.29.166.97\/myblog\/","name":"Merkbar.","description":"IT, Elektronik und Mathematik","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/52.29.166.97\/myblog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"de"},{"@type":"WebPage","@id":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/26\/democode-tastenentprellung\/#webpage","url":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/26\/democode-tastenentprellung\/","name":"Democode Tastenentprellung (Arduino) - Merkbar.","isPartOf":{"@id":"http:\/\/52.29.166.97\/myblog\/#website"},"datePublished":"2016-01-26T22:05:00+00:00","dateModified":"2016-01-26T22:05:00+00:00","author":{"@id":"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d"},"breadcrumb":{"@id":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/26\/democode-tastenentprellung\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/26\/democode-tastenentprellung\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/wp.andreas.bieri.name\/myblog\/2016\/01\/26\/democode-tastenentprellung\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"http:\/\/52.29.166.97\/myblog\/"},{"@type":"ListItem","position":2,"name":"Democode Tastenentprellung (Arduino)"}]},{"@type":"Person","@id":"http:\/\/52.29.166.97\/myblog\/#\/schema\/person\/47691942dec3f2eb9d34bb8b5507870d","name":"wp_blogadmin","image":{"@type":"ImageObject","@id":"http:\/\/52.29.166.97\/myblog\/#personlogo","inLanguage":"de","url":"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g","contentUrl":"http:\/\/1.gravatar.com\/avatar\/d0dc804558b03f640b22e497ec010c9a?s=96&d=mm&r=g","caption":"wp_blogadmin"},"url":"http:\/\/wp.andreas.bieri.name\/myblog\/author\/wp_blogadmin\/"}]}},"_links":{"self":[{"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/posts\/1084"}],"collection":[{"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/comments?post=1084"}],"version-history":[{"count":0,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/posts\/1084\/revisions"}],"wp:attachment":[{"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/media?parent=1084"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/categories?post=1084"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/wp.andreas.bieri.name\/myblog\/wp-json\/wp\/v2\/tags?post=1084"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}