OpenEdv-开源电子网

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

STM32F1按键控制蜂鸣器·,led

[复制链接]

28

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2019-10-16
在线时间
18 小时
发表于 2019-10-28 21:05:01 | 显示全部楼层 |阅读模式
本帖最后由 e芯凌 于 2019-11-10 22:25 编辑

整体操作思路:
读取IO口输入电平调用库函数为:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_tGPIO_Pin);

读取IO口输入电平操作寄存器为:
GPIOx_IDR:端口输入寄存器

使用位带操作读取IO口输入电平:
       PEin(4)          -读取GPIOE.4口电平
     PEin(n)          -读取GPIOE.n口电平

使能按键对应IO口时钟。调用函数:
    RCC_APB2PeriphClockCmd();
初始化IO模式:上拉/下拉输入。调用函数:
     GPIO_Init();
扫描IO口电平(库函数/寄存器/位操作)。

C语言知识static
Static申明的局部变量,存储在静态存储区。
它在函数调用结束之后,不会被释放。它的值会一直保留下来。
所以可以说static申明的局部变量,具有记忆功能。


4.1.PNG
key.h
  1. #ifndef __KEY_H
  2. #define __key_h
  3. #include "sys.h"

  4. #define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
  5. #define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
  6. #define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP)

  7. #define KEY0_PRES         1        //KEY0按下
  8. #define KEY1_PRES          2        //KEY1按下
  9. #define WKUP_PRES   3        //KEY_UP按下(即WK_UP/KEY_UP)


  10. void KEY_Init(void);//IO初始化
  11. u8 KEY_Scan(u8);          //按键扫描函数               


  12. #endif

复制代码



key.c
  1. #include "stm32f10x.h"
  2. #include "key.h"
  3. #include "sys.h"
  4. #include "delay.h"

  5. void KEY_Init(void) //IO初始化
  6. {
  7.          GPIO_InitTypeDef GPIO_InitStructure;

  8.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟

  9.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_3;//KEY0-KEY1
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  11.          GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE4,3

  12.         //初始化 WK_UP-->GPIOA.0          下拉输入
  13.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
  14.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉         
  15.         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0

  16. }

  17. //mode:0,不支持连续按;1,支持连续按

  18. u8 KEY_Scan(u8 mode)
  19. {         
  20.         static u8 key_up=1;//按键按松开标志
  21.         if(mode)key_up=1;  //支持连按                  
  22.         if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
  23.         {
  24.                 delay_ms(10);//去抖动
  25.                 key_up=0;
  26.                 if(KEY0==0)return KEY0_PRES;
  27.                 else if(KEY1==0)return KEY1_PRES;
  28.                 else if(WK_UP==1)return WKUP_PRES;
  29.         }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;            
  30.          return 0;// 无按键按下
  31. }
复制代码


main.c
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "beep.h"


  6. int main(void)
  7. {
  8.          vu8 key=0;        
  9.         delay_init();                     //延时函数初始化         
  10.         LED_Init();                                  //初始化与LED连接的硬件接口
  11.         BEEP_Init();                 //初始化蜂鸣器端口
  12.         KEY_Init();                 //初始化与按键连接的硬件接口
  13.         LED0=0;                                        //先点亮红灯
  14.         while(1)
  15.         {
  16.                  key=KEY_Scan(0);        //得到键值
  17.                    if(key)
  18.                 {                                                   
  19.                         switch(key)
  20.                         {                                 
  21.                                 case WKUP_PRES:        //控制蜂鸣器
  22.                                         BEEP=!BEEP;
  23.                                         break;
  24.                                 case KEY1_PRES:        //控制LED1翻转         
  25.                                         LED1=!LED1;
  26.                                         break;
  27.                                 case KEY0_PRES:        //同时控制LED0,LED1翻转
  28.                                         LED0=!LED0;
  29.                                         LED1=!LED1;
  30.                                         break;
  31.                         }
  32.                 }else delay_ms(10);
  33.         }         
  34. }
复制代码


led.c   led.h   beep.c    beep.h代码可以从我别的帖子里找


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-1 02:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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