建立 AVR LED開關功能

本篇介紹如何使用ATMEGA16的接腳觸發方式來建立一個擁有LED開關功能的按鈕,建構的概念為原本尚未接地之前,接腳會輸出電壓為1伏特,當我們將PIN腳接地後會因為接地的關係而將電壓變為0伏特,當接腳接地時是0伏特電壓代表OFF,不接地時1伏特電壓代表ON,因此可以藉由此方式產生一個LED開關功能的按鈕。
   相關程式碼範例如下:

/*** define ***/
#ifndef F_CPU
#define F_CPU 16000000UL // IC fequence
#endif
/*** include ***/
#include <avr/io.h>
/*port init function*/
void PortInit(void)
{
     DDRA  = 0xFF;
     /* set port A output */
     PORTA = 0xFF;
     /* set port ping 1111 1111  設定全亮 */
     DDRB  = 0xFF;
     /* set port B output */
     PORTB = 0xFF;
    /* set port ping 1111 1111  設定全亮 */
}
/* pin input control */
char PIn(char P_num,char x_bit)
{
     switch (P_num)
     {
         case 0:
             DDRA&=~_BV(x_bit);
             if (PINA&(1<<x_bit)==(1<<x_bit))
              {return 1;}
             else
              {return 0;}
             break;
         case 1:
             DDRB&=~_BV(x_bit);
             if (PINB&(1<<x_bit)==(1<<x_bit))
              {return 1;}
             else
              {return 0;}
             break;
         case 2:
             DDRC&=~_BV(x_bit);
             if (PINC&(1<<x_bit)==(1<<x_bit))
              {return 1;}
             else
              {return 0;}
             break;
         case 3:
             DDRD&=~_BV(x_bit);
             if (PIND&(1<<x_bit)==(1<<x_bit))
              {return 1;}
             else
              {return 0;}
             break;
     }
}
int main(void)
{
     /**** set init value ****/
     PortInit();
     while(1)
     {
          char pin = PIn(1,0);
          if(pin == 0) /*判斷是否接地被觸發*/
          {
               /*假設接地被觸發就改全暗*/
               PORTA = 0X00;
           }
           else
          {
               PORTA = 0XFF;
          }
     }
}