stm控制乘矩阵键盘程序带松手检测

stm控制乘矩阵键盘程序带松手检测
stm控制乘矩阵键盘程序带松手检测

s t m控制乘矩阵键盘程

序带松手检测

Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】

#include"stm32f10x.h"

#include"delay.h"

/*本文件的函数,主要实现矩阵键盘的功能。矩阵键盘使用PA0到PA7引脚,其中,PA0到PA3固定为推挽输出,PA4到PA7固定为

下拉输入。即,无键按下时,对应PA4到PA7为0,有键按下时,PA4到PA7中,对应的引脚为高。

此程序有一点要注意:要用到的IO口,必须是PX0-PX7,,不能是其他连续的数字。。如果非要改。。如:已经没有连续的0-7的IO口,需要在几个地方修改,请注意!!

此程序带有松手检测。。。。*/

voidInitKey(void)//初始化矩阵键盘要使用的GPIO口。

{

GPIO_InitTypeDefGPIOStru;

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);

}

intkey(void)//实现矩阵键盘。返回值为,各按键的键值,此键值由用户自己定义。

{

intKeyVal=0; //keyVal为最后返回的键值。

u16WriteVal=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去抖动。

if((GPIOA->IDR&0x00f0)==0x0000)//如果,延时5ms后,PA4到PA7又全为0,则,刚才引脚的电位变化是抖动产生的.

return-1;

}

GPIO_Write(GPIOA,(GPIOA->ODR&0xfff0|0x1)); //让PA3到PA0输出二进制的0001.

switch(GPIOA->IDR&0x00f0) //对PA4到PA7的值进行判断,以输出不同的键值。

{

case0x0010:KeyVal=15; break;

case0x0020:KeyVal=11; break;

case0x0040:KeyVal=7; break;

case0x0080:KeyVal=3; break;

}

GPIO_Write(GPIOA,(GPIOA->ODR&0xfff0|0x2)); //让PA3到PA0输出二进制的0010.

switch(GPIOA->IDR&0x00f0) //对PA4到PA7的值进行判断,以输出不同的键值。

{

case0x0010:KeyVal=14; break;

case0x0020:KeyVal=10; break;

case0x0040:KeyVal=6; break;

case0x0080:KeyVal=2; break;

}

GPIO_Write(GPIOA,(GPIOA->ODR&0xfff0|0x4)); //让PA3到PA0输出二进制的0100.

switch(GPIOA->IDR&0x00f0) //对PA4到PA7的值进行判断,以输出不同的键值。

{

case0x0010:KeyVal=13; break;

case0x0020:KeyVal=9; break;

case0x0040:KeyVal=5; break;

case0x0080:KeyVal=1; break;

}

GPIO_Write(GPIOA,(GPIOA->ODR&0xfff0|0x8)); //让PA3到PA0输出二进制的1000.

switch(GPIOA->IDR&0x00f0) //对PA4到PA7的值进行判断,以输出不同的键值。

{

case0x0010:KeyVal=12; break;

case0x0020:KeyVal=8; break;

case0x0040:KeyVal=4; break;

case0x0080:KeyVal=0; break;

}

returnKeyVal;

}

相关主题
相关文档
最新文档