<?xml-stylesheet type="text/xsl" href="https://community.element14.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Blog - All Comments</title><link>/products/raspberry-pi/raspberrypi_projects/b/blog</link><description /><dc:language>en-US</dc:language><generator>Telligent Community 12</generator><item><title>RE: Solving Error: Unknown flash device: An OpenOCD Upgrade for Pi Pico / Xiao and other RP2040 Boards</title><link>https://community.element14.com/products/raspberry-pi/raspberrypi_projects/b/blog/posts/solving-error-unknown-flash-device-an-openocd-upgrade-for-pi-pico-xiao-and-other-rp2040-boards</link><pubDate>Sun, 25 Oct 2026 15:28:08 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:8fe0aa59-dedb-4146-ac86-12b43a89b9ef</guid><dc:creator>Jan Cumps</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Update: solved. &lt;br /&gt;the Open OCD installed by the Raspberry Pi Pico Project extension for&amp;nbsp; VS Code&amp;nbsp; doesn&amp;#39;t need patching anymore.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img height="234" src="/resized-image/__size/998x468/__key/commentfiles/f7d226abd59f475c9d224a79e3f0ec07-8fe0aa59-dedb-4146-ac86-12b43a89b9ef/pastedimage1792942042401v1.png" width="499" alt=" " /&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=27980&amp;AppID=84&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: 74HC595: Build a Keyboard/Keypad/Joypad and more!</title><link>https://community.element14.com/products/raspberry-pi/raspberrypi_projects/b/blog/posts/74hc595-build-a-keyboard-keypad-joypad-and-more</link><pubDate>Wed, 21 Oct 2026 00:01:22 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:b38144e4-e723-443b-8c88-b22e53ef33d6</guid><dc:creator>shabaz</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Decided to set AI the task of figuring out the potential state machine for each button.&lt;/p&gt;
&lt;p&gt;It thinks it is possible to do button debounce, and also have an event when the button is held for a while, in a total of 5 states.&lt;/p&gt;
&lt;p&gt;The code (which expects to be run periodically, e.g. on a millisecond tick), provides a&amp;nbsp;keypad_buttons_take_events function, which would indicate the key events like BTN_EVENT_PRESSED, BTN_EVENT_LONGPRESS and BTN_EVENT_RELEASED (and the event only occurs once, i.e. it is indeed an event, not a state value).&lt;/p&gt;
&lt;p&gt;I specifically asked for a debounce algorithm which immediately provides an event and deals with the debounce after the event, since that&amp;#39;s the&amp;nbsp;way of having a fast response to user input. I asked for the debounce method to just inhibit further button events on that button in question, for a defined period (20&amp;nbsp;ticks or so at 1msec tick).&lt;/p&gt;
&lt;p&gt;I&amp;#39;ve not tried this out yet.&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:77369505-b7ae-4d76-a148-1fe782947c62:type=c_cpp&amp;text=%2F%2A%0A%20%2A%20keypad_buttons.c%0A%20%2A%0A%20%2A%20Polling-based%2C%20per-button%20state%20machine.%20Call%20keypad_buttons_update%28%29%0A%20%2A%20exactly%20once%20every%20KEYPAD_TASK_TICK_PERIOD%20milliseconds%2C%20after%20filling%0A%20%2A%20btn_arr%5B%5D%20with%20the%20latest%20active-high%20button%20bits.%0A%20%2A%0A%20%2A%20Button%200%20is%20bit%200%20of%20btn_arr%5B0%5D%2C%20button%207%20is%20bit%207%20of%20btn_arr%5B0%5D%2C%0A%20%2A%20button%208%20is%20bit%200%20of%20btn_arr%5B1%5D%2C%20etc.%0A%20%2A%0A%20%2A%20Timing%20constants%20are%20MILLISECONDS%2C%20not%20tick%20counts.%0A%20%2A%20Example%3A%201000%20ms%20at%20a%2010%20ms%20tick%20is%20100%20ticks%20%28not%20600%20ticks%29.%0A%20%2A%0A%20%2A%20Debounce%20policy%3A%20the%20first%20opposite-level%20transition%20is%20accepted%0A%20%2A%20immediately%20and%20emits%20an%20event%3B%20further%20opposite-level%20samples%20are%0A%20%2A%20ignored%20until%20the%20lockout%20expires.%20There%20is%20NO%20stability%20validation.%0A%20%2A%20A%20new%20transition%20can%20be%20accepted%20on%20the%20exact%20tick%20the%20lockout%20expires.%0A%20%2A%0A%20%2A%20Long%20press%20starts%20at%20the%20initially%20accepted%20press%2C%20not%20after%20debounce.%0A%20%2A%20Long%20press%20fires%20once%2C%20on%20the%20first%20tick%20at%2Fafter%20the%20threshold%2C%20provided%0A%20%2A%20the%20press%20has%20not%20already%20been%20released.%20A%20release%20at%20the%20exact%20threshold%0A%20%2A%20takes%20precedence%20over%20a%20long%20press.%0A%20%2A%0A%20%2A%20Events%20are%20latched%20until%20retrieved%20with%20keypad_buttons_take_events%28%29.%0A%20%2A%20Repeated%20events%20of%20the%20same%20type%20before%20retrieval%20coalesce%20into%20one%20bit.%0A%20%2A%2F%0A%0A%23include%20%3Cstdint.h%3E%0A%23include%20%3Cstddef.h%3E%0A%0A%23ifndef%20KEYPAD_BUTTON_COUNT%0A%23define%20KEYPAD_BUTTON_COUNT%20%20%20%20%20%20%2016u%0A%23endif%0A%0A%23ifndef%20KEYPAD_TASK_TICK_PERIOD%0A%23define%20KEYPAD_TASK_TICK_PERIOD%20%20%201u%20%20%20%20%20%2F%2A%20milliseconds%3A%201%20through%2010%20%2A%2F%0A%23endif%0A%0A%23ifndef%20BTN_DEBOUNCE_PERIOD%0A%23define%20BTN_DEBOUNCE_PERIOD%20%20%20%20%20%20%2020u%20%20%20%20%2F%2A%20milliseconds%20%2A%2F%0A%23endif%0A%0A%23ifndef%20BTN_LONGPRESS_PERIOD%0A%23define%20BTN_LONGPRESS_PERIOD%20%20%20%20%20%201000u%20%20%2F%2A%20milliseconds%20%2A%2F%0A%23endif%0A%0A%23if%20%28KEYPAD_BUTTON_COUNT%20%3C%201u%29%0A%23error%20%22KEYPAD_BUTTON_COUNT%20must%20be%20at%20least%201%22%0A%23endif%0A%23if%20%28KEYPAD_TASK_TICK_PERIOD%20%3C%201u%29%20%7C%7C%20%28KEYPAD_TASK_TICK_PERIOD%20%3E%2010u%29%0A%23error%20%22KEYPAD_TASK_TICK_PERIOD%20must%20be%20between%201%20and%2010%20ms%22%0A%23endif%0A%23if%20%28BTN_DEBOUNCE_PERIOD%20%3C%20KEYPAD_TASK_TICK_PERIOD%29%20%7C%7C%20%5C%0A%20%20%20%20%28%28BTN_DEBOUNCE_PERIOD%20%25%20KEYPAD_TASK_TICK_PERIOD%29%20%21%3D%200u%29%0A%23error%20%22BTN_DEBOUNCE_PERIOD%20must%20be%20a%20positive%20multiple%20of%20the%20tick%20period%22%0A%23endif%0A%23if%20%28BTN_LONGPRESS_PERIOD%20%3C%201u%29%20%7C%7C%20%28BTN_LONGPRESS_PERIOD%20%3E%205000u%29%0A%23error%20%22BTN_LONGPRESS_PERIOD%20must%20be%20between%201%20and%205000%20ms%22%0A%23endif%0A%0A%23define%20KEYPAD_BUTTON_BYTES%20%20%28%28KEYPAD_BUTTON_COUNT%20%2B%207u%29%20%2F%208u%29%0A%23define%20BTN_DEBOUNCE_TICKS%20%20%20%28BTN_DEBOUNCE_PERIOD%20%2F%20KEYPAD_TASK_TICK_PERIOD%29%0A%2F%2A%20Ceiling%20division%3A%20a%20non-multiple%20hold%20period%20rounds%20up%20to%20a%20scan%20tick.%20%2A%2F%0A%23define%20BTN_LONGPRESS_TICKS%20%20%5C%0A%20%20%20%20%28%28BTN_LONGPRESS_PERIOD%20%2B%20KEYPAD_TASK_TICK_PERIOD%20-%201u%29%20%2F%20KEYPAD_TASK_TICK_PERIOD%29%0A%0Atypedef%20enum%0A%7B%0A%20%20%20%20BTN_UNPRESSED%2C%20%20%20%20%20%20%20%20%20%20%2F%2A%20Idle%3B%20next%20logic%201%20produces%20PRESS%20immediately.%20%2A%2F%0A%20%20%20%20BTN_PRESS_DEBOUNCE%2C%20%20%20%20%20%2F%2A%20PRESS%20emitted%3B%20ignore%20logic%200%20for%20debounce%20time.%20%2A%2F%0A%20%20%20%20BTN_PRESSED%2C%20%20%20%20%20%20%20%20%20%20%20%20%2F%2A%20Press%20accepted%3B%20wait%20for%20release%20or%20long%20press.%20%2A%2F%0A%20%20%20%20BTN_HELD%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2A%20Long-press%20event%20emitted%3B%20wait%20for%20release.%20%2A%2F%0A%20%20%20%20BTN_RELEASE_DEBOUNCE%20%20%20%20%2F%2A%20RELEASE%20emitted%3B%20ignore%20logic%201%20for%20debounce%20time.%20%2A%2F%0A%7D%20ButtonState%3B%0A%0Atypedef%20enum%0A%7B%0A%20%20%20%20BTN_EVENT_NONE%20%20%20%20%20%20%20%3D%200u%2C%0A%20%20%20%20BTN_EVENT_PRESSED%20%20%20%20%3D%201u%20%3C%3C%200%2C%0A%20%20%20%20BTN_EVENT_RELEASED%20%20%20%3D%201u%20%3C%3C%201%2C%0A%20%20%20%20BTN_EVENT_LONGPRESS%20%3D%201u%20%3C%3C%202%0A%7D%20ButtonEvent%3B%0A%0Atypedef%20struct%0A%7B%0A%20%20%20%20ButtonState%20state%3B%0A%20%20%20%20uint16_t%20debounce_ticks%3B%20%20%20%2F%2A%20Ticks%20since%20last%20accepted%20edge.%20%2A%2F%0A%20%20%20%20uint16_t%20press_ticks%3B%20%20%20%20%20%20%2F%2A%20Ticks%20since%20accepted%20press.%20%2A%2F%0A%20%20%20%20uint8_t%20pending_events%3B%20%20%20%20%2F%2A%20Latched%20ButtonEvent%20bits.%20%2A%2F%0A%7D%20ButtonContext%3B%0A%0Astatic%20ButtonContext%20buttons%5BKEYPAD_BUTTON_COUNT%5D%3B%0A%0Astatic%20void%20button_accept_press%28ButtonContext%20%2Abutton%29%0A%7B%0A%20%20%20%20button-%3Estate%20%3D%20BTN_PRESS_DEBOUNCE%3B%0A%20%20%20%20button-%3Edebounce_ticks%20%3D%200u%3B%0A%20%20%20%20button-%3Epress_ticks%20%3D%200u%3B%0A%20%20%20%20button-%3Epending_events%20%7C%3D%20BTN_EVENT_PRESSED%3B%0A%7D%0A%0Astatic%20void%20button_accept_release%28ButtonContext%20%2Abutton%29%0A%7B%0A%20%20%20%20button-%3Estate%20%3D%20BTN_RELEASE_DEBOUNCE%3B%0A%20%20%20%20button-%3Edebounce_ticks%20%3D%200u%3B%0A%20%20%20%20button-%3Epress_ticks%20%3D%200u%3B%0A%20%20%20%20button-%3Epending_events%20%7C%3D%20BTN_EVENT_RELEASED%3B%0A%7D%0A%0Avoid%20keypad_buttons_init%28void%29%0A%7B%0A%20%20%20%20for%20%28size_t%20i%20%3D%200u%3B%20i%20%3C%20KEYPAD_BUTTON_COUNT%3B%20%2B%2Bi%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20buttons%5Bi%5D.state%20%3D%20BTN_UNPRESSED%3B%0A%20%20%20%20%20%20%20%20buttons%5Bi%5D.debounce_ticks%20%3D%200u%3B%0A%20%20%20%20%20%20%20%20buttons%5Bi%5D.press_ticks%20%3D%200u%3B%0A%20%20%20%20%20%20%20%20buttons%5Bi%5D.pending_events%20%3D%20BTN_EVENT_NONE%3B%0A%20%20%20%20%7D%0A%7D%0A%0A%2F%2A%0A%20%2A%20Call%20once%20per%20tick%20with%20the%20freshly%20scanned%20input%20array.%0A%20%2A%20This%20function%20does%20not%20modify%20btn_arr%5B%5D.%0A%20%2A%0A%20%2A%20Timing%20convention%3A%20a%20transition%20detected%20in%20this%20call%20is%20time%20zero.%0A%20%2A%20A%20lockout%20of%20N%20ticks%20expires%20on%20the%20Nth%20subsequent%20update%20call.%0A%20%2A%2F%0Avoid%20keypad_buttons_update%28const%20uint8_t%20btn_arr%5BKEYPAD_BUTTON_BYTES%5D%29%0A%7B%0A%20%20%20%20if%20%28btn_arr%20%3D%3D%20NULL%29%0A%20%20%20%20%20%20%20%20return%3B%0A%0A%20%20%20%20for%20%28size_t%20i%20%3D%200u%3B%20i%20%3C%20KEYPAD_BUTTON_COUNT%3B%20%2B%2Bi%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20ButtonContext%20%2Abutton%20%3D%20%26buttons%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20const%20uint8_t%20pressed%20%3D%0A%20%20%20%20%20%20%20%20%20%20%20%20%28uint8_t%29%28%28btn_arr%5Bi%20%2F%208u%5D%20%3E%3E%20%28i%20%25%208u%29%29%20%26%201u%29%3B%0A%0A%20%20%20%20%20%20%20%20%2F%2A%20Increment%20timers%20only%20for%20intervals%20that%20began%20on%20earlier%20ticks.%20%2A%2F%0A%20%20%20%20%20%20%20%20if%20%28button-%3Estate%20%3D%3D%20BTN_PRESS_DEBOUNCE%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20button-%3Estate%20%3D%3D%20BTN_RELEASE_DEBOUNCE%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28button-%3Edebounce_ticks%20%3C%20BTN_DEBOUNCE_TICKS%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2B%2Bbutton-%3Edebounce_ticks%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28button-%3Estate%20%3D%3D%20BTN_PRESS_DEBOUNCE%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20button-%3Estate%20%3D%3D%20BTN_PRESSED%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28button-%3Epress_ticks%20%3C%20BTN_LONGPRESS_TICKS%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2B%2Bbutton-%3Epress_ticks%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20switch%20%28button-%3Estate%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20BTN_UNPRESSED%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28pressed%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20button_accept_press%28button%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20BTN_PRESS_DEBOUNCE%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28button-%3Edebounce_ticks%20%3E%3D%20BTN_DEBOUNCE_TICKS%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2A%20Lockout%20expired%3A%20inspect%20this%20tick%27s%20input%20immediately.%20%2A%2F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21pressed%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20button_accept_release%28button%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20%28button-%3Epress_ticks%20%3E%3D%20BTN_LONGPRESS_TICKS%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20button-%3Estate%20%3D%20BTN_HELD%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20button-%3Epending_events%20%7C%3D%20BTN_EVENT_LONGPRESS%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20button-%3Estate%20%3D%20BTN_PRESSED%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20BTN_PRESSED%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21pressed%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20button_accept_release%28button%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20%28button-%3Epress_ticks%20%3E%3D%20BTN_LONGPRESS_TICKS%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20button-%3Estate%20%3D%20BTN_HELD%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20button-%3Epending_events%20%7C%3D%20BTN_EVENT_LONGPRESS%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20BTN_HELD%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21pressed%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20button_accept_release%28button%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20BTN_RELEASE_DEBOUNCE%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28button-%3Edebounce_ticks%20%3E%3D%20BTN_DEBOUNCE_TICKS%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2A%20Lockout%20expired%3A%20a%20high%20sample%20is%20a%20new%20press%20now.%20%2A%2F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28pressed%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20button_accept_press%28button%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20button-%3Estate%20%3D%20BTN_UNPRESSED%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20default%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2A%20Recover%20safely%20if%20the%20state%20is%20corrupted.%20%2A%2F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20button-%3Estate%20%3D%20BTN_UNPRESSED%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20button-%3Edebounce_ticks%20%3D%200u%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20button-%3Epress_ticks%20%3D%200u%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D%0A%0A%2F%2A%20Returns%20BTN_UNPRESSED%20for%20an%20out-of-range%20index.%20%2A%2F%0AButtonState%20keypad_buttons_get_state%28size_t%20button_index%29%0A%7B%0A%20%20%20%20if%20%28button_index%20%3E%3D%20KEYPAD_BUTTON_COUNT%29%0A%20%20%20%20%20%20%20%20return%20BTN_UNPRESSED%3B%0A%0A%20%20%20%20return%20buttons%5Bbutton_index%5D.state%3B%0A%7D%0A%0A%2F%2A%20Returns%20and%20clears%20all%20pending%20events%20for%20one%20button.%20%2A%2F%0Auint8_t%20keypad_buttons_take_events%28size_t%20button_index%29%0A%7B%0A%20%20%20%20uint8_t%20events%3B%0A%0A%20%20%20%20if%20%28button_index%20%3E%3D%20KEYPAD_BUTTON_COUNT%29%0A%20%20%20%20%20%20%20%20return%20BTN_EVENT_NONE%3B%0A%0A%20%20%20%20events%20%3D%20buttons%5Bbutton_index%5D.pending_events%3B%0A%20%20%20%20buttons%5Bbutton_index%5D.pending_events%20%3D%20BTN_EVENT_NONE%3B%0A%20%20%20%20return%20events%3B%0A%7D%0A%0A%2F%2A%20Logical%20accepted%20status%2C%20including%20either%20debounce%20lockout%20state.%20%2A%2F%0Auint8_t%20keypad_buttons_is_pressed%28size_t%20button_index%29%0A%7B%0A%20%20%20%20if%20%28button_index%20%3E%3D%20KEYPAD_BUTTON_COUNT%29%0A%20%20%20%20%20%20%20%20return%200u%3B%0A%0A%20%20%20%20const%20ButtonState%20state%20%3D%20buttons%5Bbutton_index%5D.state%3B%0A%20%20%20%20return%20%28uint8_t%29%28state%20%3D%3D%20BTN_PRESS_DEBOUNCE%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20state%20%3D%3D%20BTN_PRESSED%20%7C%7C%20state%20%3D%3D%20BTN_HELD%29%3B%0A%7D%0A%0A%2F%2A%20Example%20integration%20%28not%20compiled%29%3A%0A%20%2A%0A%20%2A%20uint8_t%20btn_arr%5BKEYPAD_BUTTON_BYTES%5D%3B%0A%20%2A%20keypad_buttons_init%28%29%3B%0A%20%2A%0A%20%2A%20%2F%2F%20Every%20KEYPAD_TASK_TICK_PERIOD%20ms%3A%0A%20%2A%20scan_hardware_into%28btn_arr%29%3B%0A%20%2A%20keypad_buttons_update%28btn_arr%29%3B%0A%20%2A%0A%20%2A%20for%20%28size_t%20i%20%3D%200%3B%20i%20%3C%20KEYPAD_BUTTON_COUNT%3B%20%2B%2Bi%29%20%7B%0A%20%2A%20%20%20%20%20uint8_t%20events%20%3D%20keypad_buttons_take_events%28i%29%3B%0A%20%2A%20%20%20%20%20if%20%28events%20%26%20BTN_EVENT_PRESSED%29%20%20%20%20%7B%20...%20%7D%0A%20%2A%20%20%20%20%20if%20%28events%20%26%20BTN_EVENT_LONGPRESS%29%20%20%7B%20...%20%7D%0A%20%2A%20%20%20%20%20if%20%28events%20%26%20BTN_EVENT_RELEASED%29%20%20%20%7B%20...%20%7D%0A%20%2A%20%7D%0A%20%2A%2F%0A]&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=30326&amp;AppID=84&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: 74HC595: Build a Keyboard/Keypad/Joypad and more!</title><link>https://community.element14.com/products/raspberry-pi/raspberrypi_projects/b/blog/posts/74hc595-build-a-keyboard-keypad-joypad-and-more</link><pubDate>Tue, 20 Oct 2026 20:28:30 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:b38144e4-e723-443b-8c88-b22e53ef33d6</guid><dc:creator>DAB</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Very cool.&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=30326&amp;AppID=84&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: 74HC595: Build a Keyboard/Keypad/Joypad and more!</title><link>https://community.element14.com/products/raspberry-pi/raspberrypi_projects/b/blog/posts/74hc595-build-a-keyboard-keypad-joypad-and-more</link><pubDate>Tue, 20 Oct 2026 10:27:28 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:b38144e4-e723-443b-8c88-b22e53ef33d6</guid><dc:creator>cstanton</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;The&amp;nbsp;&lt;span&gt;74HC595 is such a useful chip. At Leeds Hackspace we used these extensively&amp;nbsp;when working with LED cubes. It&amp;#39;s the chip that can latch out full bit&amp;nbsp;patterns isn&amp;#39;t it?&lt;/span&gt;&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=30326&amp;AppID=84&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: 74HC595: Build a Keyboard/Keypad/Joypad and more!</title><link>https://community.element14.com/products/raspberry-pi/raspberrypi_projects/b/blog/posts/74hc595-build-a-keyboard-keypad-joypad-and-more</link><pubDate>Tue, 20 Oct 2026 08:34:00 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:b38144e4-e723-443b-8c88-b22e53ef33d6</guid><dc:creator>veluv01</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Interesting approach!&amp;nbsp;&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=30326&amp;AppID=84&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: 74HC595: Build a Keyboard/Keypad/Joypad and more!</title><link>https://community.element14.com/products/raspberry-pi/raspberrypi_projects/b/blog/posts/74hc595-build-a-keyboard-keypad-joypad-and-more</link><pubDate>Tue, 20 Oct 2026 02:23:45 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:b38144e4-e723-443b-8c88-b22e53ef33d6</guid><dc:creator>shabaz</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Poor probing, but a quick test to see how long the scan takes. This is the SR_CLK signal, and &amp;#39;scope is set to 2 usec per division. As can be seen, the first 16 pulses (which perform the button-scan occupy just under 9 usec. After that, the remaining 3 usec or so are occupied with the LED driver pulses (8 pulses with the LED data, and then 16 more pulses to continue to push the LED data to that last shift register).&lt;/p&gt;
&lt;p&gt;&lt;img alt=" " height="492" src="/resized-image/__size/1820x984/__key/commentfiles/f7d226abd59f475c9d224a79e3f0ec07-b38144e4-e723-443b-8c88-b22e53ef33d6/without_2D00_usb_2D00_uart_2D00_annotated.png" width="910" /&gt;&lt;/p&gt;
&lt;p&gt;The above is repeatable, but, more realistically, when USB is enabled (which is normal with the Pico, since stdio input/output can be channelled through USB), then the USB code can interrupt any time, and then the SR_CLK trace looks like this (&amp;#39;scope is set to 5usec per division), and the time becomes variable, sometimes stretching to about 25-30 usec:&lt;/p&gt;
&lt;p&gt;&lt;img alt=" " height="468" src="/resized-image/__size/1966x936/__key/commentfiles/f7d226abd59f475c9d224a79e3f0ec07-b38144e4-e723-443b-8c88-b22e53ef33d6/with_2D00_usb_2D00_uart.png" width="983" /&gt;&lt;/p&gt;
&lt;p&gt;Of course, both these values are very small, but you can see where the areas would be to make improvements (for instance, a lower value resistor would allow less nop() delay during the button scan, hence reducing from 9usec to perhaps 4 or 5 usec.&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=30326&amp;AppID=84&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: 74HC595: Build a Keyboard/Keypad/Joypad and more!</title><link>https://community.element14.com/products/raspberry-pi/raspberrypi_projects/b/blog/posts/74hc595-build-a-keyboard-keypad-joypad-and-more</link><pubDate>Mon, 19 Oct 2026 21:16:50 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:b38144e4-e723-443b-8c88-b22e53ef33d6</guid><dc:creator>geralds</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Hi Shabaz &amp;nbsp;[mention:b0bc65b9ecdc4307bd967592f00e340a:e9ed411860ed4f2ba0265705b8793d05]&amp;nbsp;!&lt;/p&gt;
&lt;p&gt;Nice circuit. &amp;quot;The running 1&amp;quot;or (&amp;quot;0&amp;quot;)...&lt;/p&gt;
&lt;p&gt;I made such circuit with the keypad encoder MM74C922 (16keys), or xx923 (20keys).&lt;/p&gt;
&lt;p&gt;[View:/cfs-file/__key/commentfiles/f7d226abd59f475c9d224a79e3f0ec07-b38144e4-e723-443b-8c88-b22e53ef33d6/MM74C922_2C00_923.pdf:640:360]&lt;/p&gt;
&lt;p&gt;With this encoder you just need 1 IC. The outputs are 3-state, so you can connect it directly on a data bus.&lt;br /&gt;With a few logic gates you can expand the keypad matrix.&amp;nbsp;&lt;br /&gt;This is a very old device. Maybe you have one in your box.&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=30326&amp;AppID=84&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: Adding Wireless Capability to Custom RP2040/RP2350 Projects: Pi Radio Module 2 - Anyone tried it?</title><link>https://community.element14.com/products/raspberry-pi/raspberrypi_projects/b/blog/posts/adding-wireless-capability-to-custom-rp2040-rp2350-projects-pi-radio-module-2---anyone-tried-it</link><pubDate>Wed, 05 Aug 2026 21:26:10 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:d93937ff-6138-456b-99e8-0609a81acecd</guid><dc:creator>shabaz</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Here&amp;#39;s a board attempt with two wireless modules (both don&amp;#39;t need to be populated).&lt;/p&gt;
&lt;p&gt;&lt;img alt=" " height="305" src="/resized-image/__size/840x610/__key/commentfiles/f7d226abd59f475c9d224a79e3f0ec07-d93937ff-6138-456b-99e8-0609a81acecd/wireless_2D00_board1.jpg" width="420" /&gt;&lt;/p&gt;
&lt;p&gt;Circuit diagram:&lt;/p&gt;
&lt;p&gt;&lt;img alt=" " height="423" src="/resized-image/__size/1666x846/__key/commentfiles/f7d226abd59f475c9d224a79e3f0ec07-d93937ff-6138-456b-99e8-0609a81acecd/wireless_2D00_board_2D00_sch.png" width="833" /&gt;&lt;/p&gt;
&lt;p&gt;The unusual board shape is needed to&amp;nbsp;fit over&amp;nbsp;the main PCB:&lt;/p&gt;
&lt;p&gt;&lt;img alt=" " height="497" src="/resized-image/__size/1010x994/__key/commentfiles/f7d226abd59f475c9d224a79e3f0ec07-d93937ff-6138-456b-99e8-0609a81acecd/wireless_2D00_board2.jpg" width="505" /&gt;&lt;/p&gt;
&lt;p&gt;The Sub-1GHz module (eByte E07-900MM10S) is not intended for LoRa, but the footprint is pin-compatible with&amp;nbsp;a LoRa&amp;nbsp;module (E22-900MM22S)&amp;nbsp;if desired, but that uses a couple of extra pins, which I didn&amp;#39;t wire up (they would need to be patched to GPIO pins on this current board).&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=29926&amp;AppID=84&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: Custom Manufactured RP2040 Boards, Part 3 - Final Results</title><link>https://community.element14.com/products/raspberry-pi/raspberrypi_projects/b/blog/posts/custom-manufactured-rp2040-boards-part-3---final-results</link><pubDate>Thu, 23 Jul 2026 18:56:16 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:6fe70cf6-c38b-4151-ba84-9b34967d8cc8</guid><dc:creator>shabaz</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Finally the board is in the enclosure.. and I learned that the board outline could be extended slightly in all directions. There&amp;#39;s no easy way to screw in the board, because the holes are too shallow (they are just 2.5 mm deep), so I had to use glue (I used UV epoxy).&lt;/p&gt;
&lt;p&gt;&lt;img alt=" " height="551" src="/resized-image/__size/1470x1102/__key/commentfiles/f7d226abd59f475c9d224a79e3f0ec07-6fe70cf6-c38b-4151-ba84-9b34967d8cc8/case_2D00_opened.jpg" width="735" /&gt;&lt;/p&gt;
&lt;p&gt;End panels:&lt;/p&gt;
&lt;p&gt;&lt;img alt=" " height="553" src="/resized-image/__size/1474x1106/__key/commentfiles/f7d226abd59f475c9d224a79e3f0ec07-6fe70cf6-c38b-4151-ba84-9b34967d8cc8/case_2D00_usb_2D00_end.jpg" width="737" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=" " height="552" src="/resized-image/__size/1472x1104/__key/commentfiles/f7d226abd59f475c9d224a79e3f0ec07-6fe70cf6-c38b-4151-ba84-9b34967d8cc8/case_2D00_circ_2D00_end.jpg" width="736" /&gt;&lt;/p&gt;
&lt;p&gt;Another thing I&amp;#39;ve learned; it would be good to use a right-angle button for BOOTSEL, so that a pinhole could be added to the end panel design, to make it easier to upgrade the firmware. Currently I would have to unscrew the case, or drill a hole in plastic, which isn&amp;#39;t convenient.&lt;/p&gt;
&lt;p&gt;I need to modify the main PCB anyway, to add wireless to it. However for the current boards, I can use a daughter board, since the connections are on pin headers.&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=29942&amp;AppID=84&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: Adding Wireless Capability to Custom RP2040/RP2350 Projects: Pi Radio Module 2 - Anyone tried it?</title><link>https://community.element14.com/products/raspberry-pi/raspberrypi_projects/b/blog/posts/adding-wireless-capability-to-custom-rp2040-rp2350-projects-pi-radio-module-2---anyone-tried-it</link><pubDate>Wed, 15 Jul 2026 17:26:22 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:d93937ff-6138-456b-99e8-0609a81acecd</guid><dc:creator>shabaz</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Here&amp;#39;s an attempt&amp;nbsp;(the link to the KiCad files and Gerbers has been placed in the blog). The board size is 50 x 23 mm, which costs &amp;pound;6.67 for ten PCBs (I will populate these by hand, the parts are large and easy to solder), including tax/shipping. A combined board with this and CC1101 would be good, I might try that at some later point, since I can see use-cases for both together.&lt;/p&gt;
&lt;p&gt;&lt;img alt=" " height="210" src="/resized-image/__size/898x420/__key/commentfiles/f7d226abd59f475c9d224a79e3f0ec07-d93937ff-6138-456b-99e8-0609a81acecd/wlan_2D00_top_2D00_render.png" width="449" /&gt;&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=29926&amp;AppID=84&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: DMX Tester: Building a Lighting Controller and Test Tool</title><link>https://community.element14.com/products/raspberry-pi/raspberrypi_projects/b/blog/posts/dmx-tester-building-a-lighting-controller-and-test-tool</link><pubDate>Tue, 14 Jul 2026 20:56:22 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:0d30b8ca-4b59-454d-9dbf-7887b7a4a732</guid><dc:creator>DAB</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Very cool.&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=29960&amp;AppID=84&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: DMX Tester: Building a Lighting Controller and Test Tool</title><link>https://community.element14.com/products/raspberry-pi/raspberrypi_projects/b/blog/posts/dmx-tester-building-a-lighting-controller-and-test-tool</link><pubDate>Tue, 14 Jul 2026 00:07:24 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:0d30b8ca-4b59-454d-9dbf-7887b7a4a732</guid><dc:creator>shabaz</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;The code is now improved, and there is an explanation of all the main code functions, in the README.&lt;/p&gt;
&lt;p&gt;The user menu is quite nice, the AI implemented a command history (just press the up arrow key to see previous commands) and also allows for editing within the current line using the left/right cursor keys. I might reuse this in other&amp;nbsp;projects that require a menu too.&lt;/p&gt;
&lt;p&gt;Also, there&amp;#39;s now a Python program called control_demo.py that will just cycle through colors using channels 1-3, it should be compatible with simple RGB DMX lamps either directly, or with a slight tweak.&lt;/p&gt;
&lt;p&gt;&lt;img alt=" " height="250" src="/resized-image/__size/702x500/__key/commentfiles/f7d226abd59f475c9d224a79e3f0ec07-0d30b8ca-4b59-454d-9dbf-7887b7a4a732/control_2D00_demo.png" width="351" /&gt;&lt;/p&gt;
&lt;p&gt;The program works by prefixing the commands with &amp;quot;$&amp;quot; and the firmware recognised that, and suppresses verbose output, so it becomes like a simple machine interface.&lt;/p&gt;
&lt;p&gt;This was just supposed to be a quick experiment, but I think it&amp;#39;s almost a practical solution&amp;nbsp;now, at least for some DMX use-cases.&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=29960&amp;AppID=84&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: DMX Tester: Building a Lighting Controller and Test Tool</title><link>https://community.element14.com/products/raspberry-pi/raspberrypi_projects/b/blog/posts/dmx-tester-building-a-lighting-controller-and-test-tool</link><pubDate>Mon, 13 Jul 2026 17:29:43 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:0d30b8ca-4b59-454d-9dbf-7887b7a4a732</guid><dc:creator>veluv01</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;Interesting Design! Adding the RM2, makes the controller more versatile. All that&amp;#39;s left is adding an enclosure for the PCB![emoticon:c28b2e4cc20f4ba28d1befdba6bed29c]&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=29960&amp;AppID=84&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: DMX Tester: Building a Lighting Controller and Test Tool</title><link>https://community.element14.com/products/raspberry-pi/raspberrypi_projects/b/blog/posts/dmx-tester-building-a-lighting-controller-and-test-tool</link><pubDate>Mon, 13 Jul 2026 17:26:58 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:0d30b8ca-4b59-454d-9dbf-7887b7a4a732</guid><dc:creator>geralds</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Hi&amp;nbsp;&amp;nbsp;[mention:b0bc65b9ecdc4307bd967592f00e340a:e9ed411860ed4f2ba0265705b8793d05]&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Fantastic! Thank you so much for the very informative descriptions.&lt;br /&gt;I&amp;#39;ve downloaded the files now and will study them and adapt them for my applications. &lt;br /&gt;Great!&lt;/p&gt;
&lt;p&gt;My application what I have is &amp;quot;Smart Furniture&amp;quot;.&amp;nbsp;&lt;br /&gt;On Wednesday, I&amp;#39;m getting a Highboard dresser delivered with built-in lighting. &lt;br /&gt;I&amp;#39;ll then install an electronic door opener. This will be remote-/sensor-controlled.&lt;/p&gt;
&lt;p&gt;Best Regards&lt;br /&gt;Gerald&lt;br /&gt;---&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=29960&amp;AppID=84&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: Custom Manufactured RP2040 Boards, Part 3 - Final Results</title><link>https://community.element14.com/products/raspberry-pi/raspberrypi_projects/b/blog/posts/custom-manufactured-rp2040-boards-part-3---final-results</link><pubDate>Mon, 13 Jul 2026 17:12:15 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:6fe70cf6-c38b-4151-ba84-9b34967d8cc8</guid><dc:creator>shabaz</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Time for an example project using this custom board; it is written up&amp;nbsp;here:&lt;/p&gt;
&lt;p&gt;&lt;a href="/products/raspberry-pi/raspberrypi_projects/b/blog/posts/dmx-tester-building-a-lighting-controller-and-test-tool" data-e14adj="t"&gt;(+) DMX Tester: Building a Lighting Controller and Test Tool - element14 Community&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The board is used just like any standard Pi Pico board, i.e. the BOOTSEL button is used to transfer firmware. The board can run MicroPython, CircuitPython or any C/C++ code just as if it were a Pi Pico. For the example project, I used the C/C++ SDK (the steps can be followed from here:&amp;nbsp;&lt;a href="https://www.raspberrypi.com/documentation/microcontrollers/c_sdk.html" rel="noopener noreferrer nofollow" target="_blank" data-e14adj="t"&gt;The C/C++ SDK - Raspberry Pi Documentation&lt;/a&gt;&amp;nbsp;although my PC had it set up manually, which is a lengthier process, than just following the official Pi Pico documentation).&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=29942&amp;AppID=84&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item></channel></rss>