key.c
#include "key.h"
#include "delay.h"
void key_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//關(guān)閉jtag,使能SWD,可以用SWD模式調(diào)試
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//行:推挽輸出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_2|GPIO_Pin_0|GPIO_Pin_13;//行連接的引腳
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//列:上拉輸入,檢測(cè)高低電頻來(lái)判斷按鍵是否按下,有按鍵按下為0,沒(méi)有按鍵按下為1
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_8|GPIO_Pin_7|GPIO_Pin_6;//列連接的引腳
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
//通過(guò)一行行掃描,檢測(cè)到0即為按下,返回按鈕,方法比較簡(jiǎn)單,感覺(jué)比寄存器好理解
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按鍵按松開(kāi)標(biāo)志
if(mode)key_up=1; //支持連按 mode:0,不支持連續(xù)按;1,支持連續(xù)按;
//檢測(cè)第一行
key_row1_low;key_row2_high;key_row3_high;key_row4_high;
if(key_up&&(S1==0||S2==0||S3==0||S4==0))
{
delay_ms(10);//去抖動(dòng)
key_up=0;
if(S1==0)return S1_PRES;
else if(S2==0)return S2_PRES;
else if(S3==0)return S3_PRES;
else if(S4==0)return S4_PRES;
}else if(S1==1&&S2==1&&S3==1&&S4==1)key_up=1;
//檢測(cè)第二行
key_row1_high;key_row2_low;key_row3_high;key_row4_high;
if(key_up&&(S5==0||S6==0||S7==0||S8==0))
{
delay_ms(10);//去抖動(dòng)
key_up=0;
if(S5==0)return S5_PRES;
else if(S6==0)return S6_PRES;
else if(S7==0)return S7_PRES;
else if(S8==0)return S8_PRES;
}else if(S5==1&&S6==1&&S7==1&&S8==1)key_up=1;
//檢測(cè)第三行
key_row1_high;key_row2_high;key_row3_low;key_row4_high;
if(key_up&&(S9==0||S10==0||S11==0||S12==0))
{
delay_ms(10);//去抖動(dòng)
key_up=0;
if(S9==0)return S9_PRES;
else if(S10==0)return S10_PRES;
else if(S11==0)return S11_PRES;
else if(S12==0)return S12_PRES;
}else if(S9==1&&S10==1&&S11==1&&S12==1)key_up=1;
//檢測(cè)第四行
key_row1_high;key_row2_high;key_row3_high;key_row4_low;
if(key_up&&(S13==0||S14==0||S15==0||S16==0))
{
delay_ms(10);//去抖動(dòng)
key_up=0;
if(S13==0)return S13_PRES;
else if(S14==0)return S14_PRES;
else if(S15==0)return S15_PRES;
else if(S16==0)return S16_PRES;
}else if(S13==1&&S14==1&&S15==1&&S16==1)key_up=1;
return 0;// 無(wú)按鍵按下
}
? 文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-655772.html
key.h文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-655772.html
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
#include"stm32f10x.h"
#define S1 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9)//讀取按鍵S1,PC9
#define S2 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)//讀取按鍵S2,PC8
#define S3 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7)//讀取按鍵S3,PC7
#define S4 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6)//讀取按鍵S4,PC6
#define S5 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9)//讀取按鍵S5,PC9
#define S6 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)//讀取按鍵S6,PC8
#define S7 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7)//讀取按鍵S7,PC7
#define S8 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6)//讀取按鍵S8,PC6
#define S9 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9)//讀取按鍵S9,PC9
#define S10 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)//讀取按鍵S10,PC8
#define S11 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7)//讀取按鍵S11,PC7
#define S12 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6)//讀取按鍵S12,PC6
#define S13 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9)//讀取按鍵S13,PC9
#define S14 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)//讀取按鍵S14,PC8
#define S15 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7)//讀取按鍵S15,PC7
#define S16 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6)//讀取按鍵S16,PC6
#define S1_PRES 1
#define S2_PRES 2
#define S3_PRES 3
#define S4_PRES 4
#define S5_PRES 5
#define S6_PRES 6
#define S7_PRES 7
#define S8_PRES 8
#define S9_PRES 9
#define S10_PRES 10
#define S11_PRES 11
#define S12_PRES 12
#define S13_PRES 13
#define S14_PRES 14
#define S15_PRES 15
#define S16_PRES 16
#define key_row1_low GPIO_WriteBit(GPIOC,GPIO_Pin_3,Bit_RESET) //第一行
#define key_row1_high GPIO_WriteBit(GPIOC,GPIO_Pin_3,Bit_SET)
#define key_row2_low GPIO_WriteBit(GPIOC,GPIO_Pin_2,Bit_RESET) //第二行
#define key_row2_high GPIO_WriteBit(GPIOC,GPIO_Pin_2,Bit_SET)
#define key_row3_low GPIO_WriteBit(GPIOC,GPIO_Pin_0,Bit_RESET) //第三行
#define key_row3_high GPIO_WriteBit(GPIOC,GPIO_Pin_0,Bit_SET)
#define key_row4_low GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET) //第四行
#define key_row4_high GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET)
void key_Init(void);
u8 KEY_Scan(u8 mode);
#endif
到了這里,關(guān)于【STM32】4x4矩陣鍵盤(pán)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!