OpenEdv-开源电子网

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

按键输入实验的按键优先级和上下拉电阻的配置

[复制链接]

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
发表于 2020-7-28 10:37:35 | 显示全部楼层 |阅读模式
最近重新看了下按键输入实验,觉得有两个地方比较有趣。
1、优先级问题,下面这个函数的优先级是KEY0>KEY1>KEY2>KEY3,也就是说假如四个按键同时按下,那么只会执行KEY0按键的指令
  1. //注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY3!!
  2. u8 KEY_Scan(u8 mode)
  3. {         
  4.         static u8 key_up=1;//按键按松开标志
  5.         if(mode)key_up=1;  //支持连按                  
  6.         if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
  7.         {
  8.                 delay_ms(10);//去抖动
  9.                 key_up=0;
  10.                 if(KEY0==0)return KEY0_PRES;
  11.                 else if(KEY1==0)return KEY1_PRES;
  12.                 else if(KEY2==0)return KEY2_PRES;
  13.                 else if(WK_UP==1)return WKUP_PRES;
  14.         }else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;             
  15.         return 0;// 无按键按下
  16. }
复制代码
我把if里面的顺序改一下,优先级就变了KEY0>KEY2>KEYUP>KEY1,说明这个里面的优先级是随着我的if判断的顺序改变而改变的。
  1. if(KEY0==0)return KEY0_PRES;
  2.                 if(KEY2==0)return KEY2_PRES;
  3.                 if(WK_UP==1)return WKUP_PRES;
  4.                 if(KEY1==0)return KEY1_PRES;
复制代码
2、上拉下拉配置问题,因为这四个IO口都是直接通过一个开关直接接到3.3V或者GND,没有外接上下拉电阻,所以在配置的时候要有上下拉输入的配置,所以PE2 PE3 PE4要设置为上拉;PA0要设置为下拉 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入   
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉
那么我可以把PE2 PE3 PE4 配置为下拉,把PA0配置为上拉吗,换不得,那么会出现什么情况呢,就会出现我的开关按键会失效,无论是否按下,我的PA0都是高电平,我的PE2 PE3 PE4都是低电平。
  1. //按键初始化函数
  2. void KEY_Init(void) //IO初始化
  3. {
  4.         GPIO_InitTypeDef GPIO_InitStructure;
  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟

  6.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//KEY0-KEY2
  7.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  8.         GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4

  9.         //初始化 WK_UP-->GPIOA.0          下拉输入
  10.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉          
  12.         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0
  13. }
复制代码



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

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-28 11:01:05 | 显示全部楼层
本帖最后由 王大爷爱吃鱼 于 2020-7-28 11:02 编辑

按键输入实验
  1. /**************main.c*************************/
  2. #include "led.h"
  3. #include "delay.h"
  4. #include "sys.h"
  5. int main(void)
  6. {         
  7.          GPIOXXX_Init();                             //GPIO初始化
  8.         while(1)
  9.         {
  10.                 if (KEY0==0)  {LED0=0;LED1=0;}
  11.                 if (KEY1==0)  {LED0=0;LED1=1;}
  12.                 if (KEY2==0)  {LED0=1;LED1=0;}
  13.                 if (WK_UP==1) {LED0=1;LED1=1;}
  14.         }         
  15. }

  16. /**************led.c*************************/
  17. #include "led.h"
  18. void GPIOXXX_Init(void)
  19. {
  20.         GPIO_InitTypeDef  GPIO_InitStructure;
  21.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);         //使能PA,PB,PE端口时钟
  22. //LED灯IO初始化
  23.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                 //LED0-->PB.5 端口配置
  24.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  25.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  26.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOB.5

  27.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                             //LED1-->PE.5 端口配置, 推挽输出
  28.         GPIO_Init(GPIOE, &GPIO_InitStructure);                                           //推挽输出 ,IO口速度为50MHz
  29. //按键IO初始化                                                
  30.         //GPIO_Mode_IPU  上拉
  31.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//KEY0-KEY2
  32.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PE2 3 4设置成上拉输入
  33.         GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4

  34.         //GPIO_Mode_IPD  下拉
  35.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;//KEYUP
  36.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置下拉输入         
  37.         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0
  38. }
  39. /**************led.h*************************/
  40. #ifndef __GPIOXXX_H
  41. #define __GPIOXXX_H         
  42. #include "sys.h"

  43. #define LED0 PBout(5)// PB5
  44. #define LED1 PEout(5)// PE5        
  45. #define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0
  46. #define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键1
  47. #define KEY2  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)//读取按键2
  48. #define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP)
  49. void GPIOXXX_Init(void);//初始化                                                     
  50. #endif
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 10:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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