资源简介
可以 任意管脚 数据结构实现 只需添加管脚无需其他修改 即可返回按键值

代码片段和文件信息
#include “key.h“
#include “delay.h“
typedef struct
{
GPIO_TypeDef* GPIOX;
uint16_t GPIO_Pin;
}KGPT[2][4]; //4*4
KGPT KPIN={ //只需要在下面填写横竖行的IO口和管脚 IO口和管脚都可以随意定义 无需在一个IO口 管脚也无需按顺序
{{GPIOGGPIO_Pin_4} {GPIOGGPIO_Pin_2} {GPIODGPIO_Pin_14}{GPIODGPIO_Pin_12}}//row 横行
{{GPIODGPIO_Pin_10}{GPIODGPIO_Pin_8} {GPIOBGPIO_Pin_14}{GPIOBGPIO_Pin_12}} //col 竖行
};
#define row 0
#define col 1
#define RCC_APB2_GPIOX RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG//IO时钟
#define MAX_Time 36000000 // 松手检测最大延时
//按键初始化函数
void KEY_Init(void)
{
u8 i;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2_GPIOXENABLE);//使能PORTC时钟
for(i=0;i<4;i++)
{
GPIO_InitStructure.GPIO_Pin = KPIN[row][i].GPIO_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置成推挽输出
GPIO_Init(KPIN[row][i].GPIOX &GPIO_InitStructure);//初始化row
GPIO_ResetBits(KPIN[row][i].GPIOXKPIN[row][i].GPIO_Pin);
}
for(i=0;i<4;i++)
{
GPIO_InitStructure.GPIO_Pin = KPIN[col][i].GPIO_Pin;//PC5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(KPIN[col][i].GPIOX &GPIO_InitStructure);//初始化col
}
}
u8 ReScan(GPIO_TypeDef* GPIOXuint16_t colPinu8 colIndex)
{
u8 i;
delay_ms(10);//消抖延时
for(i = 0;i<4;i++){
GPIO_SetBits(KPIN[row][i].GPIOXKPIN[row][i].GPIO_Pin);//每个行置1
if((GPIO_ReadInputDataBit(GPIOX colPin) == 1)) //如果列也变了 行的值就知道了 为 i
{
GPIO_ResetBits(KPIN[row][i].GPIOXKPIN[row][i].GPIO_Pin); //行恢复 置0
return colIndex+i*4+1;//返回的数据 为1-16 对应4x4键盘的16个键
}
GPIO_ResetBits(KPIN[row][i].GPIOXKPIN[row][i].GPIO_Pin); //行恢复 置0
}
return 0;
}
u8 KEY_Scan(void)
{
u8 ikeyvalue;
//u32 j=0;
for(i = 0;i<4;i++)
{
if(GPIO_ReadInputDataBit(KPIN[col][i].GPIOXKPIN[col][i].GPIO_Pin) == 0)//检测列 列值为 i
{
keyvalue = ReScan(KPIN[col][i].GPIOXKPIN[col][i].GPIO_Pini);//检测行 取键值
while(GPIO_ReadInputDataBit(KPIN[col][i].GPIOXKPIN[col][i].GPIO_Pin) == 0);
// while((GPIO_ReadInputDataBit(KPIN[col][i].GPIOXKPIN[col][i].GPIO_Pin) == 0)&&(j return keyvalue;//返回键值
}
}
return 0;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 2346 2017-07-09 21:44 4乘4矩阵键盘扫描程序\key.c
文件 206 2017-07-09 21:43 4乘4矩阵键盘扫描程序\key.h
目录 0 2017-07-09 21:44 4乘4矩阵键盘扫描程序\
- 上一篇:ssm整合项目视频+源码
- 下一篇:BC35.rar
相关资源
- stm32f407上的两个can发送和接收例程
- STM32 led 时钟
- STM32 2.4G通信例程
- 直流无刷电机方波驱动 stm32 例程代码
- STM32中文资料
- STM32蓝牙和串口程序
- STM32f103超声波模块例程
- stm32f103c8t6 4 oled.rar
- stm32f030 IAP Demo(原创)
- 数据结构年终考题范围和答案 耿国华
- 数据结构 朱战力 习题解答 数据结构
- STM32基于rt_thread操作系统的SDHC卡文件
- 数据结构课程设计 6 1 彩票系统
- 教学计划编制系统
- NRF24L01实现51与STM32双向通讯
- STM32F103 串口程序(完整版)
- 大数(链表、数组)实现
- stm32 ds18b20 温度传感器 测试通过
- stm32官方例程
- STM32F103定时器中断程序
- [免费]基于stm32f103ze 的OLED驱动代码
- STM32F103RBT6驱动UC1698控制芯片的160160黑
- 自己写的航空订票系统c 版--数据结构
- 数据结构实验魔王语言
- STM32F103 DS18B20 V3.5.0固件库驱动程序工
- STM32定时器使用入门。看了这个程序会
- SIM908 SDIO FSMC STM32 FIFO
- 航空订票系统_数据结构课程设计
- STM32F103 CC2500完整驱动(模拟SPI)
- AD7606采集程序
评论
共有 条评论