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;
} 展开
#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;
} 展开
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询