Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1560782
  • 博文数量: 354
  • 博客积分: 8137
  • 博客等级: 中将
  • 技术积分: 5137
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-26 15:40
文章分类

全部博文(354)

文章存档

2010年(300)

2009年(54)

分类: 嵌入式

2010-07-14 14:33:15



文件:12.zip
大小:7KB
下载:下载

/**********************************************************************
* 文件名称: 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熄灭

    }
}


阅读(1065) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~