#include "keyboard.h"
int KeyBoard_Mange(void) //实现矩阵键盘。返回值为各按键的键值此键值由用户自己定义。
{
int KeyVal=0; //keyVal为最后返回的键值。
// u16 WriteVal=0; //WriteVal为要写给PB口的数据。
GPIOB->ODR |= 0x000f; //先让PB0到PB3全部输出高。
if((GPIOB->IDR & 0x00f0)==0x0000) //如果PB4到PB7全为0则没有键按下。此时返回值为-1.
return -1;
else
{
HAL_Delay(5); //延时5ms去抖动。
if((GPIOB->IDR & 0x00f0)==0x0000) //如果延时5ms后PB4到PB7又全为0则刚才引脚的电位变化是抖动产生的.
return -1;
else
{
GPIOB->ODR &= 0xfff0;
GPIOB->ODR |= 0x0008; //让PB3到PB0输出二进制的1000.
HAL_Delay(1); //稳定输出
switch(GPIOB->IDR & 0x00f0) //对PB4到PB7的值进行判断以输出不同的键值。
{
case 0x0080: KeyVal=1; break;
case 0x0040: KeyVal=2; break;
case 0x0020: KeyVal=3; break;
case 0x0010: KeyVal=4; break;
}
while((GPIOB->IDR & 0x00f0)!=0x0000);
GPIOB->ODR &= 0xfff0;
GPIOB->ODR |= 0x0004; //让PB3到PB0输出二进制的0100.
HAL_Delay(1); //稳定输出
switch(GPIOB->IDR & 0x00f0) //对PB4到PB7的值进行判断以输出不同的键值。
{
case 0x0080: KeyVal=5; break;
case 0x0040: KeyVal=6; break;
case 0x0020: KeyVal=7; break;
case 0x0010: KeyVal=8; break;
}
while((GPIOB->IDR & 0x00f0)!=0x0000);
GPIOB->ODR &= 0xfff0;
GPIOB->ODR |= 0x0002; //让PB3到PB0输出二进制的0010.
HAL_Delay(1); //稳定输出
switch(GPIOB->IDR & 0x00f0) //对PB4到PB7的值进行判断以输出不同的键值。
{
case 0x0080: KeyVal=9; break;
case 0x0040: KeyVal=10; break;
case 0x0020: KeyVal=11; break;
case 0x0010: KeyVal=12; break;
}
while((GPIOB->IDR & 0x00f0)!=0x0000);
GPIOB->ODR &= 0xfff0;
GPIOB->ODR |= 0x0001; //让PB3到PB0输出二进制的0001.
HAL_Delay(1); //稳定输出
switch(GPIOB->IDR & 0x00f0) //对PB4到PB7的值进行判断以输出不同的键值。
{
case 0x0080: KeyVal=13; break;
case 0x0040: KeyVal=14; break;
case 0x0020: KeyVal=15;break;
case 0x0010: KeyVal=16; break;
}
while((GPIOB->IDR & 0x00f0)!=0x0000);
}
}
return KeyVal;
}