蓝桥杯嵌入式(按键)

按键

定时器-单按键
1.设置引脚
①PB0~PB2 PA0 设置为intput
②设置上拉
2.选择时钟
①选择TIM3->外部时钟
②设置时钟参数
③打开中断
3.新建两个文件,并在bsp中导入存在的文件
4.interrupt.h
#ifndef _INTERRUPT_H_
#define _INTERRUPT_H_


#include "main.h"
#include "stdbool.h"


struct keys
{
    uchar judge_sta;  
    bool key_sta;    
    bool single_flag;  
};  


void  HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
#endif  
  judge_sta;  //按键判断 0,1,2
    key_sta;    //按键状态 0-按下 1-松开
   single_flag;  //1-真正的按键单击
5.interrupt.c
#include "interrupt.h"


struct keys key[4]={0,0,0};


void  HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance==TIM3)
    {
        key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
        key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
        key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
        key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);


        for(int i=0;i<4;i++)
        {
            switch(key[i].judge_sta)
            {
                case 0:
                {
                    if(key[i].key_sta==0)
                        key[i].judge_sta=1;
                }
                break;
                case 1:
                {
                    if(key[i].key_sta==0)
                    {
                        key[i].judge_sta=2;
                        key[i].single_flag=1;
                    }
                    else key[i].judge_sta=0;
                }
                break;
                case 2:
                {
                    if(key[i].key_sta==1)
                    {
                        key[i].judge_sta=0;
                    }
                }
                break;
            }
        }
    }
}

6.main.c
①包含头文件,引入外部变量
②打开时钟中断
HAL_TIM_Base_Start_IT(&htim3);
③在while语句中写按键功能
       
 if(key[0].single_flag==1)
        {
        sprintf(text,"  key0down   ");
        LCD_DisplayStringLine(Line8,(uint8_t *)text);    
            
            key[0].single_flag=0;
        }
        
        if(key[1].single_flag==1)
        {
        sprintf(text,"  key1down   ");
        LCD_DisplayStringLine(Line8,(uint8_t *)text);    
        LED_Disp(0x01);
        HAL_Delay(500);
            key[1].single_flag=0;
        }
        
按键标志量要初始化置0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值