OpenEdv-开源电子网

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

按键输入问题

[复制链接]

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2012-5-11
在线时间
18 小时
发表于 2012-8-28 14:31:34 | 显示全部楼层 |阅读模式

原子哥,您好!
我在做按键输入程序实验的时候,我没有采用,你们的模块化编程的方法,然后直接编写程序。现在出现问题是,把程序下到开发板之后,没有反应。请看程序:
/***************************************************************
* 文件名  : main.c
* 描述    :  该程序使用库函数实现了STM32的GPIO基本控制
* 创建人  : annysky,2012年8月
* 版本号  : V1.0
***************************************************************/
#include "stm32f10x.h"
#include "delay.h"
#include "key.h"

#define KEY0  GPIO_Pin_13
//#define KEY1  PAin(15)
//#define KEY2  PAin(0)
/*************************************************************
* 名称 : Led_Init(void)
* 功能 : GPIO口的初始化
* 输入 : 无
* 输出 : 无
**************************************************************/
void Led_Init(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;                  //申明GPIO_InitTypeDef结构类型的变量 GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //配置GPIOA的时钟

 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;      //配置GPIOA的第8引脚
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;    //配置GPIOA的第8引脚的翻转速率
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;    //配置GPIOA的第8引脚的工作模式:推挽输出
 GPIO_Init(GPIOA,&GPIO_InitStructure);      //调用GPIO_Init()函数,初始化GPIOA
 GPIO_SetBits(GPIOA,GPIO_Pin_8);


 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
 GPIO_Init(GPIOD,&GPIO_InitStructure);
 GPIO_SetBits(GPIOD,GPIO_Pin_2);
}

void Key_Init()
{
 GPIO_InitTypeDef GPIO_InitStructure;                  //申明GPIO_InitTypeDef结构类型的变量 GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //配置GPIOA的时钟

 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_15;     //配置GPIOA的第13引脚和第15脚
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;    //配置GPIOA的第13、15引脚的翻转速率
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;    //配置GPIOA的第13、15引脚的工作模式:上拉输入
 GPIO_Init(GPIOA,&GPIO_InitStructure);      //调用GPIO_Init()函数,初始化GPIOA
}
/*************************************************************
* 名称 : int main(void)
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
**************************************************************/
int main(void)
{
 SystemInit();        //系统时钟初始化为72M   SYSCLK_FREQ_72MHz
 delay_init(72);        //延时函数初始化
 Led_Init();         //LED端口初始化
 Key_Init();
 while(1)
 {
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
 
 if(KEY0==0)
  {
   delay_ms(30) ;
   GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
   GPIO_ResetBits(GPIOD,GPIO_Pin_2);   //给GPIOD的第2脚赋0 
  // break; 
  }
 }
}


这个不知道什么原因。只想按照自己的想法去改写程序。请原子哥指点一二。非常感谢

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-28 16:55:25 | 显示全部楼层
回复【楼主位】终极幻想:
---------------------------------
为什么不用我们提供的代码?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2012-8-16
在线时间
3 小时
发表于 2012-8-28 17:24:32 | 显示全部楼层
哥  你的KEY0的值怎么来的 用初始值么,
回复 支持 反对

使用道具 举报

31

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2012-5-18
在线时间
6 小时
发表于 2012-8-28 18:46:17 | 显示全部楼层
为什么不用?
谁来买我的火柴.....
回复 支持 反对

使用道具 举报

头像被屏蔽

308

主题

400

帖子

0

精华

禁止访问

积分
1185
金钱
1185
注册时间
2011-7-29
在线时间
10 小时
发表于 2012-8-28 22:35:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2012-5-11
在线时间
18 小时
 楼主| 发表于 2012-8-29 14:36:12 | 显示全部楼层
回复【2楼】正点原子:
回复【楼主位】终极幻想: --------------------------------- 为什么不用我们提供的代码?
---------------------------------
因为我仔细看了你的按键输入函数,为什么要同时判断这三个按键呢?

现在这个问题我解决啦。我使用的下面的方法:
按键输入函数:
u8 Key_Scan(GPIO_TypeDef* GPIOx,u16 GPIO_Pin)
{

GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); //SWJ完全失能
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==0) //读某引脚的输出状态是否为0
{
delay_ms(30); //防止按键抖动

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);   //JTAG-DP失能,SW-DP使能

if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==0)   
{
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==0); //等待某引脚释放
return 0;
}
else   
    return 1;
}
else 
    return 1;    
}

主函数中按键来控制LED灯的程序:

if( Key_Scan( GPIOA,GPIO_Pin_13)==0)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_8,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_8))));
//对GPIOA, GPIO_Pin_8写数据,先是读取改为的状态,然后根据结构体函数BitAction来对改为设置
    delay_ms(10);
}

if( Key_Scan( GPIOA,GPIO_Pin_15)==0)
{
GPIO_WriteBit(GPIOD, GPIO_Pin_2,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_2))));
    delay_ms(10);
    }


我觉得这个才是我自己按照自己的想法来的。原子哥的程序也很好。
回复 支持 反对

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2012-5-11
在线时间
18 小时
 楼主| 发表于 2012-8-29 14:38:06 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
另外我不想随便粘贴别人的程序,只是看看别人的思路是否与自己的一样,如果不一样,那么我们的差距在哪里。所以就出现啦我发帖的错误。还是谢谢原子哥的指导
回复 支持 反对

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2012-5-11
在线时间
18 小时
 楼主| 发表于 2012-8-29 14:38:47 | 显示全部楼层
回复【3楼】枫过云叶:
---------------------------------
那个KEY0是错误的,现在已经不用这个方法啦
回复 支持 反对

使用道具 举报

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
发表于 2012-8-30 07:46:56 | 显示全部楼层
回复【楼主位】终极幻想:
---------------------------------
楼主弱弱的问一下 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //配置GPIOA的时钟
这个函数哪里可以找到,还是你自己写的?

人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-30 09:57:19 | 显示全部楼层
这是库函数自带的。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2012-3-23
在线时间
0 小时
发表于 2012-8-30 11:29:03 | 显示全部楼层
你学库函数的话,去百度下一个STM32固件库使用手册吧!里面有全部的外设操作函数。
我也有,我上传给你吧!

STM32固件库使用手册(中文版).pdf

1.89 MB, 下载次数: 206

从心所欲
回复 支持 反对

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2012-5-11
在线时间
18 小时
 楼主| 发表于 2012-8-30 16:39:53 | 显示全部楼层
回复【9楼】sun_shine:
---------------------------------
这个函数式从固件库手册里面,配置GPIO口时钟里面的。是系统自己就有的。我们不需要自己写,只需要配置一下GPIO口就可以啦!
回复 支持 反对

使用道具 举报

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
发表于 2012-8-31 13:05:18 | 显示全部楼层
回复【12楼】终极幻想:
---------------------------------
哦,原来还有这种东西,我都是自己查寄存器的 - -!
人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
回复 支持 反对

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2012-5-11
在线时间
18 小时
 楼主| 发表于 2012-8-31 15:10:56 | 显示全部楼层
回复【13楼】sun_shine:
---------------------------------
呵呵,我也是刚刚学习,基本没有用寄存器,我是要的是库函数。程序也基本使我自己写的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 16:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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