stm32控制4*4矩阵键盘程序,带松手检测,亲试,可行,如有改正之处,请批评指正,谢谢。。
#include "stm32f10x.h"
#include "delay.h"
/*本文件的函数,主要实现矩阵键盘的功能。矩阵键盘使用PA0到PA7引脚,其中,PA0到PA3固定为推挽输出,PA4到PA7固定为
下拉输入。即,无键按下时,对应PA4到PA7为0,有键按下时,PA4到PA7中,对应的引脚为高。
此程序有一点要注意:要用到的IO口,必须是PX0-PX7,,不能是其他连续的数字。。如果非要改。。如:已经没有连续的0-7的IO口,需要在几个地方修改,请注意!!
此程序带有松手检测。。。。*/
void InitKey(void) //初始化矩阵键盘要使用的GPIO口。
{
GPIO_InitTypeDef GPIOStru;
GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP; //定义PA0到PA3为推挽输出。 GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
GPIOStru.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_Init(GPIOA,&GPIOStru);
GPIOStru.GPIO_Mode = GPIO_Mode_IPD; //定义PA4到PA7为下拉输入。 GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
GPIOStru.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
//因为上面定义引脚为输出时,已经打开整个GPIOA的时钟了,所以此处不再需要函数RCC_APB2PeriphClockCmd()来打开时钟了。
GPIO_Init(GPIOA,&GPIOStru);
}
int key(void) //实现矩阵键盘。返回值为,各按键的键值,此键值由用户自己定义。 {
int KeyVal=0; //keyVal为最后返回的键值。
u16 WriteVal=0; //WriteVal为要写给PA口的数据。
GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0xf)); //先让PA0到PA3全部输出高。
if((GPIOA->IDR & 0x00f0)==0x0000) //如果,PA4到PA7全为0,则,没有键按下。此时,返回值为-1.
return -1;
else
{
delay_ms(5); //延时5ms去抖动。