#include <stm32f10x_lib.h> //    B0~PB3行控制线
#include "delay.h" //    B4~PB7列控制线
#include "KEY4.h" // 包含矩阵键盘头文件
u8 const Key_Tab[4][4]= //键盘编码表 4x4
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
/*4x4矩阵键盘实现,基本思想:使用线反转法,一:行设置为输出,列设置为输入,此时给行输入0,
如果列中有低电平,则低电平处为按键按下,找到行坐标X。二:列设置为输出,行设置为输入,此时给列输入0,
如果列中有低电平,则低电平处为按键按下,找到列坐标Y。通过(X,Y)坐标,就找到相应的键值。*/
u8 Get_KeyValue(void) //使用线反转法,没有得到键值返回0,否则返回相应行列的键值
{
u8 i=5,j=5;
u16 temp1,temp2;
RCC->APB2ENR|=1<<3; //使能PORTB时钟
// RCC->APB2ENR|=1<<0; //开启辅助时钟
JTAG_Set(JTAG_SWD_DISABLE) ;
GPIOB->CRL&=0XFFFF0000;
GPIOB->CRL|=0X00003333; //PB0~PB3 推挽输出
GPIOB->CRL&=0X0000FFFF; //PB4~PB7 输入
GPIOB->CRL|=0X88880000; //PB4~PB7默认上拉
GPIOB->ODR=0xf0 ; //PB0~PB3置0
if((GPIOB->IDR & 0X00f0)==0x00f0) //没有按键
return 0;
else
{
delay_ms(10); //按键消抖
temp1=(GPIOB->IDR & 0x00f0);
switch(temp1)
{
case 0x00e0:j=0;break; //0xe0 1110_0000
case 0x00d0:j=1;break; //0xd0 1101_0000
case 0x00b0:j=2;break; //0xb0 1011_0000
case 0x0070:j=3;break; //0x70 0111_0000
default:break;
}
}
GPIOB->CRL&=0X0000FFFF;
GPIOB->CRL|=0X33330000; //PB4~PB7 推挽输出
GPIOB->CRL&=0XFFFF0000; //PB0~PB3 输入
GPIOB->CRL|=0X00008888; //PB0~PB4 默认下拉
GPIOB->ODR&=0x0f; //PB4~PB7置0
if((GPIOB->IDR & 0x000f)==0x000f)
return 0;
else
{ //这里不再延时再扫描,因为已经确定了不是抖动才会进入本步操作
temp2=(GPIOB->IDR & 0x000f);
switch(temp2)
{
case 0x000e:i=0;break;
case 0x000d:i=1;break;
case 0x000b:i=2;break;
case 0x0007:i=3;break;
default:break;
}
}
if((i==5)||(j==5))
return 0;
else
return (Key_Tab[j]);
}
|