本篇介紹如何使用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;
}
}
}