【STM32】4x4矩阵键盘

该代码实现了一个基于STM32的按键扫描功能,包括GPIO初始化、按键行列扫描以及去抖动处理。通过定义不同的行和列,可以检测16个按键的状态,支持连续按键检测。同时,关闭JTAG接口,启用SWD调试模式。
摘要由CSDN通过智能技术生成

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);//关闭jtag,使能SWD,可以用SWD模式调试
	
	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;//列:上拉输入,检测高低电频来判断按键是否按下,有按键按下为0,没有按键按下为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);

}

//通过一行行扫描,检测到0即为按下,返回按钮,方法比较简单,感觉比寄存器好理解
u8 KEY_Scan(u8 mode)
{	 
	static u8 key_up=1;//按键按松开标志
	if(mode)key_up=1;  //支持连按	mode:0,不支持连续按;1,支持连续按;
	
	//检测第一行
	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);//去抖动 
		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; 

	//检测第二行
    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);//去抖动 
		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; 
	
	//检测第三行
	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);//去抖动 
		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; 

	//检测第四行
  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);//去抖动 
		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;// 无按键按下
}

 

key.h

#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

  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值