新手上路
- 积分
- 31
- 金钱
- 31
- 注册时间
- 2017-8-11
- 在线时间
- 6 小时
|

楼主 |
发表于 2017-9-9 08:00:31
|
显示全部楼层
源码如下:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "key.h"
#include "stm32f4xx_gpio.h"
//ALIENTEK 探索者STM32F407开发板 实验3
//按键输入实验-库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com
//广州市星翼电子科技有限公司
//作者:正点原子 @alientek
//8*8矩阵按键输入识别,GPIOF高8位为行,GPIOF低8位为列
void Input_KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|
GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|
GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //KEY对应引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉模式
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOF
}
int Count1(unsigned char n)
{
int sum=0;
while(n)
{
n&=(n-1);
sum++;
}
return sum;
}
int main(void)
{
u16
Last_key=0,Current_key=0,key_bit=0,key_H8=0xff00,key_L8=0x00ff,Action_key=0;
int i,j;
uart_init(115200);
Input_KEY_Init(); //GPIOF的16位IO初始化,下拉输入
delay_init(100); //初始化延时函数
while(1)
{
delay_ms(200);
Current_key=GPIO_ReadInputData(GPIOF); //得到当前总键值
if(Current_key!=Last_key)
{
printf("\n位键值bit= ");
for(i=0x8000;i>=0x0001;i=i>>1) //显示GPIOF的16位IO的各位数值
{
key_bit=GPIO_ReadInputDataBit(GPIOF,i);
printf("%d ",key_bit);
}
printf("\n\n当前总键值Current_key=%x \n",Current_key);
key_H8=0xff00&Last_key; //取得上次总键值的高8位;
key_L8=0x00ff&Last_key; //取得上次总键值的低8位;
printf("\n Last_key高8位=%x \n",key_H8);
printf("\n Last_key低8位=%x \n",key_L8);
Action_key=Current_key^Last_key;
printf("\n Current_key^Last_key=%x \n",Action_key);
if( 0==(0xff00&Action_key)) //判断是否同行
{
Action_key=Action_key|key_H8; //取回原行值
}
if( 0==(0x00ff&Action_key)) //判断是否同列
{
Action_key=Action_key|key_L8; //取回原列值
}
i=Count1(Last_key);
j=Count1(Current_key);
if(j>i) //有键按下;
{printf("\n 按下按键=%x \n",Action_key); }
if(j<i) //有键松开;
{printf("\n 松开按键=%x \n",Action_key); }
Last_key=Current_key;
}
}
}
|
|