STM32 4*4矩阵键盘的疑惑 程序中通过扫描方式实现,但不能实现功能。调用库函数时,有个函数不明白设置的

设置的对不?(我设置PB0—PB3上拉输出,PB4—PB7下拉输出),问题在于调用库函数:GPIO_Write(GPIOB,(GPIOB->ODR&0xfff0|0xf)... 设置的对不?(我设置PB0—PB3上拉输出,PB4—PB7下拉输出),问题在于调用库函数:GPIO_Write(GPIOB,(GPIOB->ODR & 0xfff0 | 0xf))//先让PB0到PB3全部输出高。这里面的GPIOB->ODR & 0xfff0 | 0xf是怎样解释的??0xfff0和0xf??下面贴程序,,望大神指点,,,,小弟初学,,,

#include "stm32f10x.h"
#include "delay.h"
#include "key.h"
/*本文件的函数,主要实现矩阵键盘的功能。矩阵键盘使用PB0到PB7引脚,其中,PB0到PB3固定为
推挽输出,PB4到PB7固定为下拉输入。即,无键按下时,对应PB4到PB7为0,有键按下时,PB4到PB7中,对应的引脚为高。*/
void KEY_Init(void) //初始化矩阵键盘要使用的GPIO口。
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //定义PB0到PB3为上拉输入、、。
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //定义PB4到PB7为下拉输入。
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
//因为上面定义引脚为输出时,已经打开整个GPIOA的时钟了,
//所以此处不再需要函数RCC_APB2PeriphClockCmd()来打开时钟了。
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
int KEY_Scan(void) //实现矩阵键盘。返回值为,各按键的键值,此键值由用户自己定义。
{
u8 KeyVal; //keyVal为最后返回的键值。
GPIO_Write(GPIOB,(GPIOB->ODR & 0xfff0 | 0xf)); //先让PB0到PB3全部输出高。

if((GPIOB->IDR & 0x00f0)==0x000f) //如果PB4到PB7全为0,则没有键按下。此时,返回值为-1.
return -1;
else
{
delay_ms(5); //延时5ms去抖动。
if((GPIOB->IDR & 0x00f0)==0x000f)//如果延时5ms后,PB4到PB7又全为0,则,刚才引脚的电位变化是抖动产生的.
return -1;
}
GPIO_Write(GPIOB,(GPIOB->ODR & 0xfff0 | 0xe)); //让PB3到PB0输出二进制的1110.
switch(GPIOB->IDR & 0x00f0)//对PB4到PB7的值进行判断,以输出不同的键值。
{
case 0x00e0: KeyVal=15; break;
case 0x00d0: KeyVal=11; break;
case 0x00b0: KeyVal=7; break;
case 0x0070: KeyVal=3; break;
}
..............................................................................省去了中间的两个部分
................................................................................
}
GPIO_Write(GPIOB,(GPIOB->ODR & 0xfff0 | 0x7)); //让PB3到PB0输出二进制的0111.
switch(GPIOB->IDR & 0x00f0) //对PB4到PB7的值进行判断,以输出不同的键值。
{
case 0x00e0: KeyVal=12; break;
case 0x00d0: KeyVal=8; break;
case 0x00b0: KeyVal=4; break;
case 0x0070: KeyVal=0; break;
}

return KeyVal;
}
展开
 我来答
yajuntiantian
2013-08-28 · TA获得超过483个赞
知道小有建树答主
回答量:666
采纳率:0%
帮助的人:154万
展开全部
GPIO_Write(GPIOB,(GPIOB->ODR & 0xfff0 | 0xf))

这个地方是说!你先把GPIOB口的输出寄存器低四位清零,让后在把他与0xf相与在把低四位置高。

GPIOB是32位寄存器所以,0xfff0正好是32位,那个0xf是0x0f的意思!
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式