AVR main.c/基于狀態(tài)機的按鍵
* 文件名稱: main.c/基于狀態(tài)機的按鍵
* 程序作者: Kevin Chin
* 程序版本: V1.0
* 編制日期: 2010/07/14
* 功能描述: 按一個K20(PD7),LED燈亮(PB1),松開熄滅
* 編譯器:WinAVR-20090313
* 芯片:ATmega16,外部11.0592MHZ晶振
* 技術支持:http://bbs.cepark.com
**********************************************************************/
#include<avr/io.h>
#include
#defineKEY_Value PIND&0x80//定義按鍵所在的引腳PD7
#defineLED_OPEN PORTB&=~(_BV(PB1))//PB1口的LED燈點亮
#defineLED_CLOSE PORTB|=_BV(PB1)//PB1口的LED燈熄滅
#defineKEY_STATE_0 0//狀態(tài)0
#defineKEY_STATE_1 1//狀態(tài)1
#defineKEY_STATE_2 2//狀態(tài)2
uint8_tKeyScane(void)//按鍵掃描函數(shù)
{
staticuint8_tkeystate=0,keyreturn=0;//定義靜態(tài)變量
uint8_tkeypress;
keypress=KEY_Value;//讀取按鍵的狀態(tài)賦給keypress
switch(keystate)
{
caseKEY_STATE_0:if(!keypress)//如果是狀態(tài)1并且按鍵按下去了。
{
keystate=KEY_STATE_1;//狀態(tài)切換到1
keyreturn=0;
}
break;
caseKEY_STATE_1:if(!keypress)//如果10ms后按鍵按下狀態(tài)再次確認
{
keystate=KEY_STATE_2;//按鍵狀態(tài)切換到2
keyreturn=1;//返回值為1
}
elsekeystate=KEY_STATE_0;
break;
caseKEY_STATE_2:if(keypress)//判斷按鍵是否松開
{
keystate=KEY_STATE_0;//切換到狀態(tài)0
keyreturn=0;
}
break;
default:break;
}
returnkeyreturn;//返回鍵值
}
intmain(void)
{
uint8_tkeydata;
PORTB=0xff;
DDRB=0xff;
PORTD=0x80;
DDRD=0x00;
while(1)
{
_delay_ms(10);//延時10ms
keydata=KeyScane();//調(diào)用按鍵掃描函數(shù)
if(keydata)//如果按鍵掃描函數(shù)返回為1,執(zhí)行下面的語句
{
LED_OPEN;//LED點亮
}
elseLED_CLOSE;//LED熄滅
}
}
評論