STM32 4*4矩阵键盘程序
#include ""
#include ""
#include ""
#include ""
#include ""eed= GPIO_Speed_50MHz;
= GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
GPIO_Init(GPIOB,&GPIO_InitStructure);
= GPIO_Mode_IPD; //定义PB12到PB15为下拉输入。
= GPIO_Speed_50MHz;
= GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
//因为上面定义引脚为输出时,已经打开整个GPIOA的时钟了,
//所以此处不再需要函数RCC_APB2PeriphClockCmd()来打开时钟了。
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
int KEY_Scan(void) //实现矩阵键盘。返回值为,各按键的键值,此键值由用户自己定义。
{
u8 KeyVal; //keyVal为最后返回的键值。
GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0f00)); //先让PB8到PB11全部输出高。
if((GPIOB->IDR & 0xf000)==0x0000) //如果PB12到PB15全为0,则没有键按下。此时,返回值为-1.
return -1;
else
{
delay_ms(5); //延时5ms去抖动。
if((GPIOB->IDR & 0xf000)==0x0000)//如果延时5ms后,PB12到PB15又全为0,则,刚才引脚的电位变化是抖动产生的.
return -1;
}
GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0100)); //让PB11到PB8输出二进制的0001.
switch(GPIOB->IDR & 0xf000)//对PB12到PB15的值进行判断,以输出不同的键值。
{
case 0x1000: KeyVal=15; break;
case 0x2000: KeyVal=11; break;
case 0x4000: KeyVal=7; break;
case 0x8000: KeyVal=3; break;
}
GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0200)); //让PB11到PB8输出二进制的0.
switch(GPIOB->IDR &
STM32-矩阵键盘 来自淘豆网m.daumloan.com转载请标明出处.