我的矩阵键盘老是按了没反应 我用仿真看了下读下哪个按键的函数返回值老是0xff, 明明按了第一个键 keyval=1 但返回还是0xff。。。。。。求解 还有是否每个按键都需要消抖的程序 第一个按键没有(注释了)
主程序里定义了一个int8_t shu; shu=keyboard(); 为什么数每次都是0xff。。。。。。。。
程序如下:
#include "keyboard.h"
/*
* 函数名:Key_GPIO_Config
* 描述 :配置按键用到的I/O口
* 输入 :无
* 输出 :无
*/
void Key_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //定义PF0到PF3为推挽输出。
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);
GPIO_Init(GPIOF,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //定义PF4到PF11为下拉输入。
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
GPIO_Init(GPIOF,&GPIO_InitStructure);
}
int8_t keyboard(void) //实现矩阵键盘。返回值为各按键的键值,此键值由用户自己定义。
{
int8_t KeyVal=0; //keyVal为最后返回的键值。
// uint8_t WriteVal=0; //WriteVal为要写给PF口的数据。
GPIO_Write(GPIOF,(GPIOF->ODR & 0xfff0 | 0xf)); //先让PF0到PF3全部输出高。
if((GPIOF->IDR & 0x00f0)==0x0000) //如果,PF4到PF7全为0,则,没有键按下。此时,返回值为-1.
return -1;
else if((GPIOF->IDR & 0x00f0)==0x0000)
{
Delay_ms(5); //延时5ms去抖动。
if((GPIOF->IDR & 0x00f0)==0x0000) //如果,延时5ms后,PF4到PF7又全为0,则,刚才引脚的电位变化是抖动产生的.
return -1;
}
else
{
GPIO_Write(GPIOF,(GPIOF->ODR & 0xfff0 | 0x1)); //让PF3到PF0输出二进制的0001.
switch(GPIOF->IDR & 0x00f0) //对PF4到PF7的值进行判断,以输出不同的键值。
{
case 0x0010:
{
// Delay_ms(5);
// if(GPIOF->IDR & 0x00f0==0x0010)
KeyVal=1;
}break;
case 0x0020:
{
Delay_ms(5);
if(GPIOF->IDR & 0x00f0==0x0020)
KeyVal=2;
}break;
case 0x0040:
{
Delay_ms(5);
if(GPIOF->IDR & 0x00f0==0x0040)
KeyVal=3;
}break;
case 0x0080:
{
Delay_ms(5);
if(GPIOF->IDR & 0x00f0==0x0080)
KeyVal=4;
}break;
}
GPIO_Write(GPIOF,(GPIOF->ODR & 0xfff0 | 0x2)); //让PA3到PA0输出二进制的0010.
switch(GPIOF->IDR & 0x00f0) //对PF4到PF7的值进行判断,以输出不同的键值。
{
case 0x0010:
{
Delay_ms(5);
if(GPIOF->IDR & 0x00f0==0x0010)
KeyVal=5;
}break;
case 0x0020:
{
Delay_ms(5);
if(GPIOF->IDR & 0x00f0==0x0020)
KeyVal=6;
}break;
case 0x0040:
{
Delay_ms(5);
if(GPIOF->IDR & 0x00f0==0x0040)
KeyVal=7;
}break;
case 0x0080:
{
Delay_ms(5);
if(GPIOF->IDR & 0x00f0==0x0080)
KeyVal=8;
}break;
}
GPIO_Write(GPIOF,(GPIOF->ODR & 0xfff0 | 0x4)); //让PA3到PA0输出二进制的0100.
switch(GPIOF->IDR & 0x00f0) //对PF4到PF7的值进行判断,以输出不同的键值。
{
case 0x0010:
{
Delay_ms(5);
if(GPIOF->IDR & 0x00f0==0x0010)
KeyVal=9;
}break;
case 0x0020:
{
Delay_ms(5);
if(GPIOF->IDR & 0x00f0==0x0020)
KeyVal=10;
}break;
case 0x0040:
{
Delay_ms(5);
if(GPIOF->IDR & 0x00f0==0x0040)
KeyVal=11;
}break;
case 0x0080:
{
Delay_ms(5);
if(GPIOF->IDR & 0x00f0==0x0080)
KeyVal=12;
}break;
}
GPIO_Write(GPIOF,(GPIOF->ODR & 0xfff0 | 0x8)); //让PA3到PA0输出二进制的1000.
switch(GPIOF->IDR & 0x00f0) //对PF4到PF7的值进行判断,以输出不同的键值。
{
case 0x0010:
{
Delay_ms(5);
if(GPIOF->IDR & 0x00f0==0x0010)
KeyVal= 13;
}break;
case 0x0020:
{
Delay_ms(5);
if(GPIOF->IDR & 0x00f0==0x0020)
KeyVal=14;
}break;
case 0x0040:
{
Delay_ms(5);
if(GPIOF->IDR & 0x00f0==0x0040)
KeyVal=15;
}break;
case 0x0080:
{
Delay_ms(5);
if(GPIOF->IDR & 0x00f0==0x0080)
KeyVal=16;
}break;
}
}
if((GPIOF->IDR & 0x0f00)==0x0000) //如果,PF4到PF7全为0,则,没有键按下。此时,返回值为-1.
return -1;
else if((GPIOF->IDR & 0x0f00)==0x0000)
{
Delay_ms(5); //延时5ms去抖动。
if((GPIOF->IDR & 0x0f00)==0x0000) //如果,延时5ms后,PF4到PF7又全为0,则,刚才引脚的电位变化是抖动产生的.
return -1;
}
else
{
switch(GPIOF->IDR & 0x0f00) //对PF4到PF7的值进行判断,以输出不同的键值。
{
case 0x0100:
{
Delay_ms(5);
if(GPIOF->IDR & 0x0f00==0x0100)
KeyVal=17;
break;
}
case 0x0200:
{
Delay_ms(5);
if(GPIOF->IDR & 0x0f00==0x0200)
KeyVal=18;
break;
}
case 0x0400:
{
Delay_ms(5);
if(GPIOF->IDR & 0x0f00==0x0400)
KeyVal=19;
break;
}
case 0x0800:
{
Delay_ms(5);
if(GPIOF->IDR & 0x0f00==0x0800)
KeyVal=20;
break;
}
}
}
return KeyVal; |