STM32实验二:按键输入实验总结

跑马灯实验中IO口是输出口,下面我们研究STM32的IO口作为输入口:

STM32的IO口输入使用时是通过调用做输入使用的时候,是通过调函数GPIO_ReadInputDataBit()来读取 来读取 IO口的状态。

Mini32上面有三个按钮:KEY0/KEY1、WK_UP来控制2个LED DS0和DS1

按键实验中需要额外引入key.c和h,然后就可以开始分析代码了

//按键初始化函数 
//PA15和PC5 设置成输入
void KEY_Init(void)
{
    

0.首先设置结构体
    GPIO_InitTypeDef GPIO_InitStructure;

 1.时钟设置  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟

    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试
   

2.设置针脚,输入模式,速度不用设置了
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15;//PA15
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
     GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA15
    
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;//PC5
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
     GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC5
 
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;//PA0
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉      
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0

Ok,然后是按键处理的函数:

//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//返回值:
//0,没有任何按键按下
//KEY0_PRES,KEY0按下
//KEY1_PRES,KEY1按下
//WKUP_PRES,WK_UP按下 
//注意此函数有响应优先级,KEY0>KEY1>WK_UP!!
u8 KEY_Scan(u8 mode)
{     
    static u8 key_up=1;//按键按松开标志
    if(mode)key_up=1;  //支持连按          
    if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
    {
        delay_ms(10);//去抖动 
        key_up=0;
        if(KEY0==0)return KEY0_PRES;
        else if(KEY1==0)return KEY1_PRES;
        else if(WK_UP==1)return WKUP_PRES; 
    }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;          
    return 0;// 无按键按下
}
 

然后同样在头文件中进行处理,最重要的是前三个宏定义定义读取数据:

#define KEY0  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)//读取按键0
#define KEY1  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)//读取按键1
#define WK_UP   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键2 
 

#define KEY0_PRES    1        //KEY0  
#define KEY1_PRES    2        //KEY1 
#define WKUP_PRES    3        //WK_UP  

void KEY_Init(void);//IO初始化
u8 KEY_Scan(u8 mode);      //按键扫描函数                        
#endif

最后在main函数中进行处理:

按下按键会根据读取的值设置KEY0_PRES或者另外两个,那么通过switch语句就可以设置对两个LED的控制了。

 int main(void)
 {    
    u8 t=0;      
    delay_init();             //延时函数初始化      
    LED_Init();                   //初始化与LED连接的硬件接口
    KEY_Init();              //初始化与按键连接的硬件接口
    LED0=0;                    //点亮LED
    while(1)
    {
        t=KEY_Scan(0);        //得到键值
        switch(t)
        {                 
            case KEY0_PRES:
                LED0=!LED0;
                break;
            case KEY1_PRES:
                LED1=!LED1;
                break;
            case WKUP_PRES:                
                LED0=!LED0;
                LED1=!LED1;
                break;
            default:
                delay_ms(10);    
        } 
    }         
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值