OpenEdv-开源电子网

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

按键检测,求助原子哥和各位高手帮忙解答一下啊

[复制链接]

8

主题

130

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2013-4-24
在线时间
0 小时
发表于 2013-5-13 21:25:54 | 显示全部楼层 |阅读模式

 //Key.c文件
/* Includes ---------------------------------------------------------------*/
#include "stm32f10x.h"
#include "Key.h"
#include <stdio.h>
#include"LCD_12864.h"
/****************************************************************************
* 名    称:void Key_Init(void)
* 功    能:按键初始化
* 入口参数:无
* 出口参数:无
* 说    明:
* 调用方法:Key_Init();
****************************************************************************/
void Key_Init(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;

 /* 打开端口时钟--------------------------------------------------------*/
 RCC_APB2PeriphClockCmd(RCC_GPIO_B,ENABLE);


 /* 配置端口B   y输入口-------------------------------------------------*/
 GPIO_InitStructure.GPIO_Pin=Keyy;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
 
 /* 配置端口B   x输出口------------------------------------------------*/
 GPIO_InitStructure.GPIO_Pin=Keyx;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);  
}

/****************************************************************************
* 名    称:u16 Key_Read(void)
* 功    能:检测按键,读出具体按键
* 入口参数:无
* 出口参数:Num
* 说    明:
* 调用方法:Key_Read();
****************************************************************************/
u16 Key_Read(void)
{
 u16 Num=20,Temp;
 Temp=GPIO_ReadOutputData(GPIOB);   // 输出口全部置1
 GPIO_Write(GPIOB,Temp|0X000F); 
 
 //第一行       //按键检测
 GPIO_ResetBits(GPIOB, Keyx0);
 if(!GPIO_ReadInputDataBit(GPIOB, Keyy0))
 Num=0;
 else if(!GPIO_ReadInputDataBit(GPIOB, Keyy1))
 Num=1;
 else if(!GPIO_ReadInputDataBit(GPIOB, Keyy2))
 Num=2;
 else if(!GPIO_ReadInputDataBit(GPIOB, Keyy3))
 Num=3;
 GPIO_SetBits(GPIOB, Keyx0);
 //第二行
 GPIO_ResetBits(GPIOB, Keyx1);
 if(!GPIO_ReadInputDataBit(GPIOB, Keyy0))
 Num=4;
 else if(!GPIO_ReadInputDataBit(GPIOB, Keyy1))
 Num=5;
 else if(!GPIO_ReadInputDataBit(GPIOB, Keyy2))
 Num=6;
 else if(!GPIO_ReadInputDataBit(GPIOB, Keyy3))
 Num=7;
 GPIO_SetBits(GPIOB, Keyx1);
 //第三行
 GPIO_ResetBits(GPIOB, Keyx2);
 if(!GPIO_ReadInputDataBit(GPIOB, Keyy0))
 Num=8;
 else if(!GPIO_ReadInputDataBit(GPIOB, Keyy1))
 Num=9;
 else if(!GPIO_ReadInputDataBit(GPIOB, Keyy2))
 Num=10;
 else if(!GPIO_ReadInputDataBit(GPIOB, Keyy3))
 Num=11;
 GPIO_SetBits(GPIOB, Keyx2);
 //第四行
 GPIO_ResetBits(GPIOB, Keyx3);
 if(!GPIO_ReadInputDataBit(GPIOB, Keyy0))
 Num=12;
 else if(!GPIO_ReadInputDataBit(GPIOB, Keyy1))
 Num=13;
 else if(!GPIO_ReadInputDataBit(GPIOB, Keyy2))
 Num=14;
 else if(!GPIO_ReadInputDataBit(GPIOB, Keyy3))
 Num=15;
 GPIO_SetBits(GPIOB, Keyx3);

 return Num;
}
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
Key.h文件
/****************************************************************************
*      4*4矩阵按键对应的端口引脚宏定义
****************************************************************************/
#define Keyx0   GPIO_Pin_0
#define Keyx1   GPIO_Pin_1
#define Keyx2 GPIO_Pin_2
#define Keyx3 GPIO_Pin_3

#define Keyy0  GPIO_Pin_4
#define Keyy1 GPIO_Pin_5
#define Keyy2 GPIO_Pin_6
#define Keyy3 GPIO_Pin_7

/****************************************************************************
*      所有矩阵按键在此汇总
****************************************************************************/
#define Keyx  Keyx0|Keyx1|Keyx2|Keyx3    //输出口
#define Keyy  Keyy0|Keyy1|Keyy2|Keyy3    //输入口

/****************************************************************************
*使用到的端口的时钟定义
****************************************************************************/
#define RCC_GPIO_B RCC_APB2Periph_GPIOB

/****************************************************************************
*      Key.c用到的函数在此声明
****************************************************************************/
void Key_Init(void);      //按键使用到的端口初始化
//void Delayms(uint32_t ms);     //延时函数
u16 Key_Read(void);          //检测按键,读出具体按键


///////////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////////
main函数里面 我用一下语句已经关掉了jtag,但是还是检测不到第一列,这是什么原因啊

 RCC->APB2ENR |= 0x00000001;         //使能复用口时钟
 AFIO->MAPR = (0x00FFFFFF & AFIO->MAPR)|0x04000000; //这两句话是关闭jtag
/////////////////////////////////

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

使用道具 举报

8

主题

130

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2013-4-24
在线时间
0 小时
 楼主| 发表于 2013-5-13 21:58:27 | 显示全部楼层
请大家帮忙看看,这段代码是哪里有错啊?我进过测试,发觉PB4口好像不能输入,但是程序里面设置了的啊,应该能输入啊,这问题多半出在PB4口,我把PB4作为输出时,一点问题都没有,应该没有坏啊
你猜你猜你再猜
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2013-5-13 22:07:45 | 显示全部楼层
我来了~
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-14 00:01:45 | 显示全部楼层
回复【2楼】895855913:
---------------------------------
要关闭JTAG.可以调用我们的JTAG_Set函数.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

130

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2013-4-24
在线时间
0 小时
 楼主| 发表于 2013-5-14 08:57:18 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥,我上面的语句是查寄存器写的,这样写,我把PB3.PB4作为输出口就行,但是作为输入口,PB4就不行,这是什么原因啊?



//JTAG模式设置,用于设置JTAG的模式
//mode:jtag,swd模式设置;00,全使能;01,使能SWD;10,全关闭;
//CHECK OK
//100818   
void JTAG_Set(u8 mode)
{
u32 temp;
temp=mode;
temp<<=25;
RCC->APB2ENR|=1<<0;     //开启辅助时钟    
AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
AFIO->MAPR|=temp;       //设置jtag模式

这个函数我用了,还是不行,这是怎么回事啊?
你猜你猜你再猜
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-14 09:56:01 | 显示全部楼层
回复【5楼】895855913:
---------------------------------
PB3,PB4有外部的10K上拉电阻,这个是不是会对你的测试造成影响?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

21

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-2-22
在线时间
0 小时
发表于 2013-5-14 10:04:50 | 显示全部楼层
要输出做什么,8脚都输入不就可以了,弄个中断,就读B口低8位
不清楚你键盘硬件
要是用户不慎把两个按键同时按下了
有没可能导致STM的2个输出脚连接捏
回复 支持 反对

使用道具 举报

8

主题

130

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2013-4-24
在线时间
0 小时
 楼主| 发表于 2013-5-14 12:55:43 | 显示全部楼层
回复【7楼】wahahaheihei:
---------------------------------
我用的是4*4的矩阵按键,外部加了上拉电阻,但是其他口也没有影响,就是PB4口不对
你猜你猜你再猜
回复 支持 反对

使用道具 举报

8

主题

130

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2013-4-24
在线时间
0 小时
 楼主| 发表于 2013-5-14 12:59:31 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
我的是用的是4*4的矩阵按键,外部加了上拉电阻,这样会有影响吗?我该怎么改啊?如果我把输入脚都设成浮空输入,还是不能检测到第一列的按键,还是不对
你猜你猜你再猜
回复 支持 反对

使用道具 举报

8

主题

130

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2013-4-24
在线时间
0 小时
 楼主| 发表于 2013-5-14 13:01:01 | 显示全部楼层
回复【7楼】wahahaheihei:
---------------------------------
程序是有顺序的,如果两个按键同时按下了,那么也会按照程序的执行顺序来进行
你猜你猜你再猜
回复 支持 反对

使用道具 举报

0

主题

21

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-2-22
在线时间
0 小时
发表于 2013-5-14 14:02:12 | 显示全部楼层
昂,俺没认真看搞错了^ ^
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-20 04:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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