OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5185|回复: 3

按键控制LED亮灭的问题。

[复制链接]

2

主题

3

帖子

0

精华

新手入门

积分
31
金钱
31
注册时间
2013-7-11
在线时间
0 小时
发表于 2013-7-15 16:31:38 | 显示全部楼层 |阅读模式
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"


#define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define KEY2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)
#define KEY3 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)
#define KEY_UP 4
#define KEY_LEFT 3              //KEY2
#define KEY_DOWN 2
#define KEY_RIGHT 1     //KEY0
 


void KEY_Initialization()
{
    GPIO_InitTypeDef GPIO_InitStructure;  //从GPIO_InitTypeDef 开始找,还要加上GPIO_Init
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE, ENABLE );
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2||GPIO_Pin_3||GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_Init(GPIOE,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
}

void LED_Initialization()
{
    GPIO_InitTypeDef GPIO_InitStructure;  //从GPIO_InitTypeDef 开始找,还要加上GPIO_Init
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_Init(GPIOE,&GPIO_InitStructure);
}

void Delay(vu32 n)
{
    for(;n!=0;n--);
}

//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY2按下
//4,KEY3按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY3!!
u8 KEY_Scan(u8 mode)
{     
    static u8 key_up=1;//按键按松开标志          static 就是告诉你 在这个函数里面 只初始化一次。
                       //初始化一次之后,下一次进入函数不会再初始化了。这是static作用之一
    if(mode)key_up=1;  //支持连按         
    if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))  //如果(Key_up是0 且 (KEY0是0或KEY1是0或者KEY2是0或者KEY3是1,)
    {
        Delay(500);//去抖动
        key_up=0;
        if(KEY0==0)return KEY_RIGHT;
        else if(KEY1==0)return KEY_DOWN;
        else if(KEY2==0)return KEY_LEFT;
        else if(KEY3==1)return KEY_UP;
    }else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;  //否则如果(KEY0是1且KEY1是1且KEY2是1且KEY3是0)给Key_up赋值为1;       
     return 0;// 无按键按下
}


int main(void)
{       
    u8 t;
    KEY_Initialization();
    LED_Initialization();
    GPIO_SetBits(GPIOB,GPIO_Pin_5);
    while(1)
    {
        t=KEY_Scan(0);
        if(t)
        {
            switch(t)
            {
                case KEY_LEFT:
                     GPIO_SetBits(GPIOB,GPIO_Pin_5);
                     GPIO_ResetBits(GPIOE,GPIO_Pin_5);
                     break;
                case KEY_RIGHT:
                     GPIO_ResetBits(GPIOB,GPIO_Pin_5);
                     GPIO_SetBits(GPIOE,GPIO_Pin_5);
                     break;
                case KEY_UP:
                     break;
                case KEY_DOWN:
                     break;                     
            }
        }
        else Delay(500);   
    }   
}


前面是我的代码,也是按照教程改的。没有include原子哥附带的led.h,delay.h。个人觉得只是把delay改了一下变简单了。然后再switch里面用“GPIO_SetBits(GPIOB,GPIO_Pin_5);GPIO_ResetBits(GPIOE,GPIO_Pin_5);”希望控制LED灯的亮灭。现在程序烧进去,一直是LED0(DS0)红灯亮,按左和按右键都没有反应这是为什么呢?求助
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-7-8
在线时间
0 小时
发表于 2013-7-15 17:57:59 | 显示全部楼层
把开发板断电再上电试试看呢。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-15 20:46:57 | 显示全部楼层
回复【楼主位】楼下的房东:
---------------------------------
有没有仿真器,可以仿真检查下按键扫描函数。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

3

帖子

0

精华

新手入门

积分
31
金钱
31
注册时间
2013-7-11
在线时间
0 小时
 楼主| 发表于 2013-7-16 10:05:23 | 显示全部楼层
回复【楼主位】楼下的房东:
---------------------------------
成功了。。 switch(t)
            {
                case KEY_LEFT:
                     GPIO_SetBits(GPIOB,GPIO_Pin_5);
                     GPIO_ResetBits(GPIOE,GPIO_Pin_5);
                     break;
                case KEY_RIGHT:
                     GPIO_ResetBits(GPIOB,GPIO_Pin_5);
                     GPIO_SetBits(GPIOE,GPIO_Pin_5);
                     break;
                case KEY_UP:
                     break;
                case KEY_DOWN:
                     break;                     
            }
        }

把不用的那两个键去掉就行了。还是编程编的少啊。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-17 11:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表