Leo Linuxhnrainll.blog.chinaunix.net
hnrainll
全部博文(354)
2010年(300)
2009年(54)
大鬼不动
叶绍琛
路沐堇
HoariNes
快乐的猪
6551130
zjt_pond
K__奕__
cynthia
格伯纳
Bsolar
葫芦娃的
分类: 嵌入式
2010-07-14 14:33:15
/********************************************************************** * 文件名称: main.c/基于状态机的按键 * 程序作者: Kevin Chin * 程序版本: V1.0 * 编制日期: 2010/07/14 * 功能描述: 按一个K20(PD7),LED灯亮(PB1),松开熄灭 * 编译器:WinAVR-20090313 * 芯片:ATmega16,外部11.0592MHZ晶振 * 技术支持: **********************************************************************/ #include <avr/io.h> #include <util/delay.h> #define KEY_Value PIND & 0x80 //定义按键所在的引脚PD7 #define LED_OPEN PORTB &= ~(_BV(PB1)) //PB1口的LED灯点亮 #define LED_CLOSE PORTB |= _BV(PB1) //PB1口的LED灯熄灭 #define KEY_STATE_0 0 //状态0 #define KEY_STATE_1 1 //状态1 #define KEY_STATE_2 2 //状态2 uint8_t KeyScane(void) //按键扫描函数 { static uint8_t keystate = 0, keyreturn = 0; //定义静态变量 uint8_t keypress; keypress = KEY_Value;//读取按键的状态赋给keypress switch(keystate) { case KEY_STATE_0: if(!keypress) //如果是状态1并且按键按下去了。 { keystate = KEY_STATE_1; //状态切换到1 keyreturn = 0; } break; case KEY_STATE_1: if(!keypress) //如果10ms后按键按下状态再次确认 { keystate = KEY_STATE_2; //按键状态切换到2 keyreturn = 1; //返回值为1 } else keystate = KEY_STATE_0; break; case KEY_STATE_2: if(keypress) //判断按键是否松开 { keystate = KEY_STATE_0; //切换到状态0 keyreturn = 0; } break; default: break; } return keyreturn; //返回键值 } int main(void) { uint8_t keydata; PORTB = 0xff; DDRB = 0xff; PORTD = 0x80; DDRD = 0x00; while(1) { _delay_ms(10); //延时10ms keydata = KeyScane(); //调用按键扫描函数 if(keydata) //如果按键扫描函数返回为1,执行下面的语句 { LED_OPEN; //LED点亮 } else LED_CLOSE; //LED熄灭 } }
上一篇:经典C源程序100例
下一篇:调试振南的51开发板
登录 注册