OpenEdv-开源电子网

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

关于按键控制的问题

[复制链接]

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-3-24
在线时间
0 小时
发表于 2012-3-24 21:42:51 | 显示全部楼层 |阅读模式

#include "stm32f10x.h"

void RCC_Init(void) //GPIO时钟初始化
{
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD,ENABLE); 
}

void Led_Init(void)  //LED相关的GPIO初始化
{
 GPIO_InitTypeDef GPIO_InitStruct;
 GPIO_DeInit(GPIOA);
 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
 GPIO_Init(GPIOA,&GPIO_InitStruct);   //PA_8引脚

 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
 GPIO_Init(GPIOD,&GPIO_InitStruct);   //PD_2引脚初始化
}

void Key_Init(void)   //按键初始化
{
 GPIO_InitTypeDef GPIO_InitStruct;

 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 ;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; //13上拉
 GPIO_Init(GPIOA,&GPIO_InitStruct);

 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; //15上拉
 GPIO_Init(GPIOA,&GPIO_InitStruct);

 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;  //下拉
 GPIO_Init(GPIOA,&GPIO_InitStruct);
}

void Delay_ms(uint32_t nms)
{
 uint32_t i;
 for(;nms>0;--nms)
  for(i=12000;i>0;--i) ;
}

uint8_t KeyScan(void)
{
 GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);  //关SW
 if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_13) == 0X00 \
 || GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15) == 0X00 \
 || GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)  == 0X01)
 {
  Delay_ms(1);
  if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)  == 0X01) //wk_up按键判断
  {
   GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);    //开SW
   return 1;
  }
  else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15) == 0X00)  //KEY1按键判断
  {
   GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);
   return 2;
  }
  else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_13) == 0X00)   //KEY0按键判断
  {
   GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);
   return 3;
  }  
 }
 else
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);
 return 0;   //无按键按下 
}
  
int main(void)
{
 uint8_t temp;
  /* Setup STM32 system (clock, PLL and Flash configuration) */
  SystemInit();
  RCC_Init(); //外设时钟初始化
  Led_Init(); //LED初始化
  Key_Init(); // 按键初始化
  while (1)
  { 
     temp = KeyScan();  //判断是否有按键
 if(temp)
 {
  switch(temp)
  {
   case 1:   //WK_UP被按下
    GPIO_ResetBits(GPIOA,GPIO_Pin_8);  //红灯亮
    GPIO_ResetBits(GPIOD,GPIO_Pin_2);  //绿灯亮
    break;
   case 2:   //KEY1按下
    GPIO_SetBits(GPIOA,GPIO_Pin_8);  //红灯灭
    break;
   case 3:  //KEY0按下
    GPIO_SetBits(GPIOD,GPIO_Pin_2);  //绿灯灭
    break;
  }
 }
  }
}

#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval : None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
   
  }
}
#endif

 

上面是我的代码

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

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-3-24
在线时间
0 小时
 楼主| 发表于 2012-3-24 21:48:39 | 显示全部楼层
问题是当我没有按下按键时,它老是自动判断为KEY0按下,所以绿灯总是灭的。为什么呢?
回复 支持 反对

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-3-24
在线时间
0 小时
 楼主| 发表于 2012-3-24 21:50:00 | 显示全部楼层
自己顶个
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-24 22:34:38 | 显示全部楼层
回复【3楼】藏锋:
---------------------------------
是不是插着JTAG?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-3-24
在线时间
0 小时
 楼主| 发表于 2012-3-25 07:37:43 | 显示全部楼层
。。是啊,原来是这个原因。
谢谢原子哥
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 07:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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