资源简介
关联文章https://blog.csdn.net/langdao04/article/details/89705210
代码片段和文件信息
//#include “exti.h“
#include “delay.h“
#include “led.h“
#include “keypad.h“
//行列键值采用二维数组方式,根据需要修改对应键值;
u32 keyVal[KEY_COL_NUM][KEY_ROW_NUM] =
{
//col0
1 //row0
2 //row1
3 //row2
//col1
4 //row0
5 //row1
6 //row2
//col2
7 //row0
8 //row1
9 //row2
};
//行列对应硬件IO,采用结构体赋值方式,方便移植;
KeypadGpioStruct keypadio =
{
{{GPIOC GPIO_PIN_1} {GPIOH GPIO_PIN_2} {GPIOH GPIO_PIN_3}} //rowNum[KEY_ROW_NUM]
{{GPIOC GPIO_PIN_4} {GPIOC GPIO_PIN_5} {GPIOC GPIO_PIN_6}} //colNum[KEY_COL_NUM]
};
//按键初始化函数
//PA15和PC5 设置成输入
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOB时钟
__HAL_RCC_GPIOH_CLK_ENABLE(); //开启GPIOB时钟
GPIO_Initure.Pin=GPIO_PIN_1; //PC1
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOC&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3; //PH2,PH3
HAL_GPIO_Init(GPIOH&GPIO_Initure);
HAL_GPIO_WritePin(GPIOC GPIO_PIN_1 GPIO_PIN_SET); //PH7置1
HAL_GPIO_WritePin(GPIOH GPIO_PIN_2|GPIO_PIN_3 GPIO_PIN_SET); //PH7置1
GPIO_Initure.Pin=GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6; //PC4.PC5,PC6
GPIO_Initure.Mode=GPIO_MODE_INPUT; //输入
GPIO_Initure.Pull=GPIO_PULLDOWN; //下拉 硬件电路有上拉
HAL_GPIO_Init(GPIOC&GPIO_Initure);
}
//按键处理函数
int key_scan(void)
{
static u8 key_up=1;
u8 keyUpFlag = 0;
u32 key_num=0;
u8 valValid = 0;
u8 icol irow;
GPIO_PinState val_col[KEY_COL_NUM] = {0}; //用于存储列对应IO值(0 or 1)
//配置行输出为高
for(irow = 0; irow < KEY_ROW_NUM; irow++)
{
HAL_GPIO_WritePin(keypadio.rowNum[irow].GPIOx keypadio.rowNum[irow].GPIO_Pin GPIO_PIN_SET); //PH7置1
}
// HAL_GPIO_WritePin(GPIOC GPIO_PIN_1 GPIO_PIN_SET); //PH7置1
// HAL_GPIO_WritePin(GPIOH GPIO_PIN_2|GPIO_PIN_3 GPIO_PIN_SET); //PH7置1
delay_us(10);
//依次读取列对应IO值
for(icol = 0; icol < KEY_COL_NUM; icol++)
{
val_col[icol] = HAL_GPIO_ReadPin(keypadio.colNum[icol].GPIOx keypadio.colNum[icol].GPIO_Pin);
if(key_up && val_col[icol]) //如果确定为当前列,则查找哪一行 COL0
{
delay_ms(10); //keyVal
for(irow = 0; irow < KEY_ROW_NUM; irow++)
{
//依次置位行IO为低,如果行读取为低,则表示为当前行
HAL_GPIO_WritePin(keypadio.rowNum[irow].GPIOx keypadio.rowNum[irow].GPIO_Pin GPIO_PIN_RESET); //置0
delay_us(10);
if(!HAL_GPIO_ReadPin(keypadio.colNum[icol].GPIOx keypadio.colNum[icol].GPIO_Pin)) //如果当前读到为0,则表示是此值;
{
key_up = 0;
key_num = keyVal[icol][irow]; //根据行列值,获取对应键值
valValid = 1; //鸡肋
break;
}
}
if(valValid)
break;
}
}
//如果全部为低,则表示按键抬起;防止抬起前重复发送键值
for(icol = 0; icol < KEY_COL_NUM; icol++)
{
keyUpFlag |= val_col[icol];
}
if(!keyUpFlag) //没有键值,则表示抬起
key_up = 1;
return key_num;
}
/*************************************************说明**********************
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3671 2019-04-30 10:33 keypad.c
文件 1014 2019-04-29 17:29 keypad.h
----------- --------- ---------- ----- ----
4685 2
- 上一篇:最全地球物理勘探题库
- 下一篇:度媒体数据库实验2
相关资源
- STM32 led 时钟
- STM32 2.4G通信例程
- 直流无刷电机方波驱动 stm32 例程代码
- STM32中文资料
- STM32蓝牙和串口程序
- STM32f103超声波模块例程
- stm32f103c8t6 4 oled.rar
- stm32f030 IAP Demo(原创)
- STM32基于rt_thread操作系统的SDHC卡文件
- NRF24L01实现51与STM32双向通讯
- STM32F103 串口程序(完整版)
- stm32 ds18b20 温度传感器 测试通过
- stm32官方例程
- STM32F103定时器中断程序
- [免费]基于stm32f103ze 的OLED驱动代码
- STM32F103RBT6驱动UC1698控制芯片的160160黑
- STM32F103 DS18B20 V3.5.0固件库驱动程序工
- STM32定时器使用入门。看了这个程序会
- SIM908 SDIO FSMC STM32 FIFO
- STM32F103 CC2500完整驱动(模拟SPI)
- AD7606采集程序
- stm32 用SPI 方式读写 SDHC
- stm32通过DMA方式采集ADC数据
- 意法半导体STM全系列微控制器STM32ST
- 基于STM32芯片的SX1278 驱动 LORA.rar
- imx6q ch452驱动矩阵键盘扫描
- STM32的PCB封装库,以及原理图库,48
- SX1280.rar
- STM32 DS3231驱动.zip
- STM32F103C8T6+NRF24l01无线通信
评论
共有 条评论