您的位置 首页 模拟

AVR main.c/根据状态机的按键

***********************************************************************文件名称:mainc基于状态机的按键*程序作者:Kevin

/**********************************************************************
* 文件名称: main.c/根据状况机的按键
* 程序作者: 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//状况0

#defineKEY_STATE_1 1//状况1

#defineKEY_STATE_2 2//状况2

uint8_tKeyScane(void)//按键扫描函数

{
staticuint8_tkeystate=0,keyreturn=0;//界说静态变量

uint8_tkeypress;

keypress=KEY_Value;//读取按键的状况赋给keypress

switch(keystate)
{
caseKEY_STATE_0:if(!keypress)//假如是状况1而且按键按下去了。

{
keystate=KEY_STATE_1;//状况切换到1

keyreturn=0;
}
break;
caseKEY_STATE_1:if(!keypress)//假如10ms后按键按下状况再次承认

{
keystate=KEY_STATE_2;//按键状况切换到2

keyreturn=1;//回来值为1

}
elsekeystate=KEY_STATE_0;
break;
caseKEY_STATE_2:if(keypress)//判别按键是否松开

{
keystate=KEY_STATE_0;//切换到状况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();//调用按键扫描函数

if(keydata)//假如按键扫描函数回来为1,履行下面的句子

{
LED_OPEN;//LED点亮

}
elseLED_CLOSE;//LED平息

}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/258871.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部