資源簡介
關聯文章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? {
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? {
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? {
//依次置位行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? {
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
評論
共有 條評論