<p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.8; font-family: 돋움; text-align: justify; background-color: #eeeeee;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">택스위치에 대해서는 </span><a href="http://studymake.tistory.com/159" target="_blank" class="con_link" style="text-decoration-line: none; overflow-wrap: break-word;"><span style="font-size: 15px; font-family: Arial; color: #1155cc; text-decoration-line: underline; vertical-align: baseline; white-space: pre-wrap;">이전 포스트</span></a><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">에서 기본적인 내용을 다루었다. 여기에서는 인터럽트를 이용해서 스위치를 누를 때마다 LED가 토글(toggle)되는 프로그램을 작성하도록 하겠다. 즉, 스위치 신호의 폴링 에지 (falling edge)에서 LED의 출력 신호가 반전되도록 하는 프로그램을 작성하도록 하겠다.</span></p>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.8; font-family: 돋움; text-align: justify; background-color: #eeeeee;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"> 터치센서와 다르게 기계적인 접점을 갖는 스위치는 점점이 붙거나 떨어지는 순간에 바운싱(bouncing) 현상이 있다. 이것은 접점이 붙거나 떨어지는 그 짧은 순간에 접점이 고속으로 여러 번 on/off 되는 현상을 말하며 기계적인 스위치라면 반드시 발생하는 현상이다. 이것은 &nbsp;짧은 순간(약 100ms 이내임)에 여러 번 접점이 붙었다가 떨어지는 것을 반복하므로 의도하지 않게 인터럽트가 여러 번 발생할 수 있으므로 이러한 바운싱 현상을 제거해야 올바르게 동작하는데 이것을 </span><span style="font-size: 15px; font-family: Arial; color: #0000ff; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">디바운싱(debouncing)</span><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">이라고 한다.</span></p>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.8; font-family: 돋움; text-align: justify; background-color: #eeeeee;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;다음 그림에서 하단의 그림이 바운싱을 도시한 것이고 이것을 제거한 깨끗한 신호가 상단에 도시되어 있다.</span></p>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<div dir="ltr" style="line-height: 1.5; font-family: 돋움; text-align: justify; background-color: #eeeeee; margin-left: 0pt;">
   <table class="__se_tbl_ext" style="border-width: initial; border-style: none; border-color: initial;"><colgroup><col width="275" /><col width="292" /></colgroup>
      <tbody>
         <tr style="height: 0px;">
            <td style="word-break: break-all; height: 0px; border-width: 0px; border-style: solid; border-color: #000000; vertical-align: top; padding: 7px;">
               <p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.2; text-align: justify;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"><img src="https://lh3.googleusercontent.com/9Ooz_sAXCPzFtcyW3ceUmLCJgXcwyMMXUSmzf1Od3_uiFRgACijAc0jSnG4fHZeuk22ktfS76sa6uf5VJS-rCTdWiX8dc5Te6rEtJDpOrQ4-WdjmWPd0sM9mQ2mHOMRvPQ2MlRE" class="__se_object" s_type="attachment" s_subtype="image" width="259px;" height="135px;" jsonvalue="%7B%7D" style="border: none; transform: rotate(0rad);" /></span></p>
               <p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.2; text-align: justify;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">[그림 1] (a) 디바운싱 (b) 바운싱 현상</span></p>
               </td>
            <td style="word-break: break-all; height: 0px; border-width: 0px; border-style: solid; border-color: #000000; vertical-align: top; padding: 7px;"><br />
               <p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.2; text-align: justify;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">&lt;- 디바운스된 신호</span></p>
               <br /><br /><br />
               <p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.2; text-align: justify;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">&lt;- 기계적 접점의 바운싱 현상</span></p>
               </td>
            </tr>
         </tbody>
      </table>
   </div>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.8; font-family: 돋움; text-align: justify; background-color: #eeeeee;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;디바운싱하는데 여러 가지 방법들이 알려져 있는데 크게 두 가지로 분류할 수 있으며 하드웨어적인 방법과 소프트웨어적인 것이다. 하드웨어적인 방법은 RC 저역 필터를 슈미트트리거나 디지털 인버터에 직결한 후 이 신호를 포트 핀에 연결하는 방법인데 아래의 회로도가 대표적인 것이다.</span></p>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<div dir="ltr" style="line-height: 1.5; font-family: 돋움; text-align: justify; background-color: #eeeeee; margin-left: 0pt;">
   <table class="__se_tbl_ext" style="border-width: initial; border-style: none; border-color: initial;"><colgroup><col width="216" /><col width="351" /></colgroup>
      <tbody>
         <tr style="height: 0px;">
            <td style="word-break: break-all; height: 0px; border-width: 0px; border-style: solid; border-color: #000000; vertical-align: top; padding: 7px;">
               <p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.2; text-align: justify;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"><img src="https://lh4.googleusercontent.com/AhHMieCiJgNy-NzybUCRyKCGkxVdsJ5SCYmvf94f1Dqk_mgjp41e-0065Aetk06I6iG80LB-aG7t9f-eX6OpW6WSGaa6D79AwWkBDWlpHLe97uz5HH1BGg2uW3MxDkIfCr5olJo" class="__se_object" s_type="attachment" s_subtype="image" width="203px;" height="145px;" jsonvalue="%7B%7D" style="border: none; transform: rotate(0rad);" /></span></p>
               <p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.2; text-align: justify;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">[그림 2] 디바운싱 회로</span></p>
               </td>
            <td style="word-break: break-all; height: 0px; border-width: 0px; border-style: solid; border-color: #000000; vertical-align: top; padding: 7px;">
               <p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.2; text-align: justify;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">대표적인 디바운싱 회로도</span></p>
               <br />
               <p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.2; text-align: justify;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"> RC 필터와 슈미트트리거가 직결되어 있다. 이 회로도를 사용하면 아두이노의 내부 풀업 저항은 사용하지 못한다.</span></p>
               </td>
            </tr>
         </tbody>
      </table>
   </div>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.8; font-family: 돋움; text-align: justify; background-color: #eeeeee;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;하지만 아두이노와 같은 프로세서가 사용된다면 부가적인 디바운싱 회로 없이 소프트웨어적으로 이것을 구현하여 불필요한 인터럽트를 억제할 수 있다. 여기에서는 그 방법에 대해서 설명하도록 하겠다. &nbsp;기본적인 아이디어는 ISR 함수 안에서 바운싱이 없어질 때 까지 기다렸다가 스위치 신호를 다시 읽어서 정상 호출된 것인가 아닌가를 판별하는 것이다.</span></p>
<h1 dir="ltr" style="margin: 10pt 0px 0pt; padding: 0px; font-size: 32px; font-family: 돋움; text-align: justify; background-color: #eeeeee; line-height: 1.8;"><span style="font-size: 21px; font-family: &quot;Trebuchet MS&quot;; color: #0000ff; vertical-align: baseline; white-space: pre-wrap;">falling edge 의 경우 디바운싱</span></h1>
<p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.8; font-family: 돋움; text-align: justify; background-color: #eeeeee;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;만약 INT0핀에 택스위치를 연결하고 &nbsp;폴링 에지에 인터럽트가 걸리도록 설정되었다고 가정하자.</span></p>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<div dir="ltr" style="line-height: 1.5; font-family: 돋움; text-align: justify; background-color: #eeeeee; margin-left: 0pt;">
   <table class="__se_tbl_ext" style="border-width: initial; border-style: none; border-color: initial; width: 567px;"><colgroup><col width="*" /></colgroup>
      <tbody>
         <tr style="height: 0px;">
            <td style="word-break: break-all; height: 0px; border-style: solid; border-color: #000000; vertical-align: top; padding: 7px;">
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;">attachInterrupt(INT0, toggleLed, FALLING);</span></h5>
               </td>
            </tr>
         </tbody>
      </table>
   </div>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.8; font-family: 돋움; text-align: justify; background-color: #eeeeee;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;ISR 함수 처음에 바운싱이 안정될 때 까지 일정시간(80ms 정도가 적당하다.) 지연시킨 후 다음과 같이 스위치 신호를 읽은 다음 그것으로 올바른 인터럽트 호출인가를 판단한다.</span></p>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<div dir="ltr" style="line-height: 1.5; font-family: 돋움; text-align: justify; background-color: #eeeeee; margin-left: 0pt;">
   <table class="__se_tbl_ext" style="border-width: initial; border-style: none; border-color: initial; width: 567px;"><colgroup><col width="*" /></colgroup>
      <tbody>
         <tr style="height: 0px;">
            <td style="word-break: break-all; height: 0px; border-style: solid; border-color: #000000; vertical-align: top; padding: 7px;">
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;">void isr() {</span></h5>
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;_delay_ms(80);</span></h5>
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;if (digitalRead(SW)==HIGH) return;</span></h5>
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&lt;실제 인터럽트 처리 루틴&gt;</span></h5>
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;,,,</span></h5>
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;">}</span></h5>
               </td>
            </tr>
         </tbody>
      </table>
   </div>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.8; font-family: 돋움; text-align: justify; background-color: #eeeeee;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;이 코드를 보면 80ms 지연시킨 이후에 스위치 값을 읽어 HIGH라면 잘못 호출된 것으로 판단하고 아무 일도 않고 리턴한다. 즉, 이 경우는 rising edge의 바운싱 구간에서 호출된 것으로 판단하는 것이다. 반대로 80ms 지연시킨 이후에 스위치 값이 LOW라면 falling edge에서 정상 호출된 것으로 간주하고 이후에 있는 인터럽트 처리 루틴을 실행시키는 것이다.</span></p>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.8; font-family: 돋움; text-align: justify; background-color: #eeeeee;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;이 방법은 &nbsp;손으로 버튼을 조작하는 경우 정밀한 제어가 필요치 않으므로 필자의 경험상 너무 빠르게 버튼을 동작시키지 않는 한 대부분 정상 작동한다.</span></p>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.8; font-family: 돋움; text-align: justify; background-color: #eeeeee;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;이 설명에서 처음 소개하는 함수가 있는데 바로 _delay_ms() 함수이다. 이름을 보면 지연시키는 함수라는 것을 알 수 있을 텐데 왜 아두이노의 표준 함수인 delay() 함수 대신 이 함수를 사용했는지 의문이 들 것이다. ISR함수 안에서 아두이노의 시간관련 함수인 다음 함수들은 정상 동작하지 않는다.(주의!)</span></p>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<div dir="ltr" style="line-height: 1.5; font-family: 돋움; text-align: justify; background-color: #eeeeee; margin-left: 0pt;">
   <table class="__se_tbl_ext" style="border-width: initial; border-style: none; border-color: initial; width: 567px;"><colgroup><col width="*" /></colgroup>
      <tbody>
         <tr style="height: 0px;">
            <td style="word-break: break-all; height: 0px; border-style: solid; border-color: #000000; vertical-align: top; padding: 7px;">
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;">delay(), delayMicrosecond(), millis(), micros()</span></h5>
               </td>
            </tr>
         </tbody>
      </table>
   </div>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.8; font-family: 돋움; text-align: justify; background-color: #eeeeee;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">이 함수들은 내부적으로 타이머 인터럽트를 사용하므로 ISR안에서는 작동할 수 없다. 이유는 ISR이 호출되는 순간 인터럽트가 자동으로 막히고 ISR의 끝나야 인터럽트가 다시 가능하게 되기 때문이다. avr에 대한 지식이 있다면 이해가 쉽게 가겠지만 일단은 위 함수들은 ISR 안에서 정상 동작하지 않는다고만 알아도 된다. 이것은 필자가 구글링을 해 보고 직접 실험으로 확인한 사실이다.</span></p>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.8; font-family: 돋움; text-align: justify; background-color: #eeeeee;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;반면에 _delay_ms()함수는 단순히 소트프웨어적으로 지연을 시켜주는 함수라서 ISR안에서도 정상 작동한다. 단, 이 함수를 사용하기 위해서는 다음과 같이 헤더 파일을 인클루드 시켜야 한다. (avr-gcc에서 사용되는 유틸리티 라이브러리이다.)</span></p>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<div dir="ltr" style="line-height: 1.5; font-family: 돋움; text-align: justify; background-color: #eeeeee; margin-left: 0pt;">
   <table class="__se_tbl_ext" style="border-width: initial; border-style: none; border-color: initial; width: 567px;"><colgroup><col width="*" /></colgroup>
      <tbody>
         <tr style="height: 0px;">
            <td style="word-break: break-all; height: 0px; border-style: solid; border-color: #000000; vertical-align: top; padding: 7px;">
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;">#include&lt;util/delay.h&gt;</span></h5>
               </td>
            </tr>
         </tbody>
      </table>
   </div>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.8; font-family: 돋움; text-align: justify; background-color: #eeeeee;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">전체 프로그램은 다음과 같다.</span></p>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<div dir="ltr" style="line-height: 1.5; font-family: 돋움; text-align: justify; background-color: #eeeeee; margin-left: 0pt;">
   <table class="__se_tbl_ext" style="border-width: initial; border-style: none; border-color: initial; width: 567px;"><colgroup><col width="*" /></colgroup>
      <tbody>
         <tr style="height: 0px;">
            <td style="word-break: break-all; height: 0px; border-style: solid; border-color: #000000; vertical-align: top; padding: 7px;">
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;">#include&lt;util/delay.h&gt;</span></h5>
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;">#define SW 2</span></h5>
               <br />
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;">void setup() {</span></h5>
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pinMode(LED_BUILTIN, OUTPUT);</span></h5>
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pinMode(SW, INPUT_PULLUP);</span></h5>
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attachInterrupt(INT0, toggleLed, FALLING);</span></h5>
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;">}</span></h5>
               <br />
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;">void loop() {</span></h5>
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;">}</span></h5>
               <br />
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;">void toggleLed() {</span></h5>
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;_delay_ms(80);</span></h5>
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;if (digitalRead(SW)==HIGH) return;</span></h5>
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));</span></h5>
               <h5 dir="ltr" style="margin: 0pt 0px; padding: 0px; font-size: 13px; line-height: 1.38; text-align: justify;"><span style="font-size: 15px; font-family: Consolas; vertical-align: baseline; white-space: pre-wrap;">}</span></h5>
               </td>
            </tr>
         </tbody>
      </table>
   </div>
<p><br style="font-family: 돋움; text-align: justify; background-color: #eeeeee;" /></p>
<p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding: 0px; line-height: 1.8; font-family: 돋움; text-align: justify; background-color: #eeeeee;"><span style="font-size: 15px; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;스위치의 디바운싱은 고전적이만 해결하기 꽤 까다로운 문제이다. 하지만 여기서 소개한 방법을 사용하면 대부분의 경우 잘 동작한다.</span></p>
<p>
   <p>&nbsp;</p>
   </p>
<div class="autosourcing-stub-extra" style="line-height: 1.5; zoom: 1; opacity: 1;">
   <p style="margin: 11px 0px 7px; padding: 0px; line-height: 1.5; font-size: 12px; font-family: Dotum; font-style: normal; font-weight: normal;"><strong style="padding: 0px 7px 0px 0px;">[출처]</strong><a href="https://blog.naver.com/openengmath/220367189245" target="_blank" style="text-decoration: none;">아두이노를 이용한 소프트웨어 디바운싱(debouncing) part 1/2</a><span style="padding: 0px 7px 0px 5px;">|</span><strong style="padding: 0px 7px 0px 0px;">작성자</strong><a href="https://blog.naver.com/openengmath" target="_blank" style="text-decoration: none;">openengmath</a></p>
   </div>