新手入门
- 积分
- 28
- 金钱
- 28
- 注册时间
- 2012-11-9
- 在线时间
- 0 小时
|
STM32,PA4~PA7为矩阵键盘输出口,PA8~PA11为矩阵键盘输入口。PA0~PA3为其他输出。现在是按键按下,GPIO_IDR中的数据为0x00F0,所以按键不能识别,按下时用万用表测键盘输入端口为高电平,请高人指点下。代码如下。
GPIO端口配置
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*配置矩阵键盘输出口*/
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; //选择IO端口
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //时钟速度为50M
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //端口模式为推拉输出方式
GPIO_Init(GPIOA, &GPIO_InitStructure); //用以上几个参数初始化PA口
/* 配置矩阵键盘输入口 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //端口模式为下拉输入方式
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
键盘查找代码
int keyscan(void)
{
int KeyVal=0;
GPIO_Write(GPIOA,(GPIOA->ODR&0xFF0F|0x00F0));
Delay(1); //延时等待端口电平稳定
if((GPIOA->IDR&0x0F00)==0x0000) //如果PA8到PA11全为0,则没有键按下。返回值为-1.
return -1;
else
{
Delay(10); //延时10ms去抖动。
if((GPIOA->IDR&0x0f00)==0x0000) //如果,延时10ms后,PA8到PA11又全为0,则刚才引脚的电位变化是抖动产生的.
return -1;
}
GPIO_Write(GPIOA,(GPIOA->ODR & 0xff0f | 0x0010)); //让PA4输出高电平,查找对应键码。
Delay(1);
switch(GPIOA->IDR & 0x0f00)
{.......}
.....
}
请帮我看下是否哪里设置有问题。多谢。
我后来直接把PA4和PA8短接,IDR中还是没有PA8的输入信号。
|
|