STM32F1XX HAL库下的矩阵键盘

 

void jz_key_init()
{
	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_GPIOB_CLK_ENABLE();
}
u8 jz_key_scan2()//二次封装消抖
{
	if(jz_key_scan())
	{
		delay_ms(10);
		if(jz_key_scan())
		{
			return jz_key_scan();
		}
	}
	return 0;
}
u8 jz_key_scan()
{
	u8 hang=0,lie=0;
	GPIO_InitTypeDef GPIO_Initure;
	GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;//ÐÐ
	GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;
	GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;
	GPIO_Initure.Pull=GPIO_NOPULL;
	HAL_GPIO_Init(GPIOA,&GPIO_Initure);  
	
	GPIO_Initure.Pin=GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;//ÁÐ
	GPIO_Initure.Mode=GPIO_MODE_INPUT;
	GPIO_Initure.Pull=GPIO_PULLDOWN;
	HAL_GPIO_Init(GPIOB,&GPIO_Initure);
	
	GPIOA->ODR=(GPIOA->ODR|0x000F);//按位或 不影响其他PA口
	delay_us(10);//延时 不加延时部分键值会无法检测
	if((GPIOB->IDR & 0xF000)==0x8000)	
		lie=4;
	else if((GPIOB->IDR & 0xF000)==0x4000)
		lie=3;
	else if((GPIOB->IDR& 0xF000)==0x2000)
		lie=2;
	else if((GPIOB->IDR & 0xF000)==0x1000)
		lie=1;
	else
		return 0;
	
	GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;//ÐÐ
	GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;
	GPIO_Initure.Mode=GPIO_MODE_INPUT;
	GPIO_Initure.Pull=GPIO_PULLDOWN;
	HAL_GPIO_Init(GPIOA,&GPIO_Initure); 
	
	GPIO_Initure.Pin=GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;//ÁÐ
	GPIO_Initure.Pull=GPIO_NOPULL;
	GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;
	HAL_GPIO_Init(GPIOB,&GPIO_Initure);
	GPIOB->ODR=(GPIOB->ODR|0xF000);
	delay_us(10);
	if((GPIOA->IDR & 0x000F)==0x0008)
		hang=4;
	else if((GPIOA->IDR & 0x000F)==0x0004)
		hang=3;
	else if((GPIOA->IDR & 0x000F)==0x0002)
		hang=2;
	else if((GPIOA->IDR & 0x000F)==0x0001)
		hang=1;
	else
		return 0;
	
	return lie+(hang-1)*4;
}

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,下面给出具体的步骤: 1. 首先需要在代码中引入stm32f103ret6hal库的头文件: ```c #include "stm32f1xx_hal.h" ``` 2. 然后需要定义PC0到PC7这8个引脚的IO口: ```c #define ROW1 GPIO_PIN_0 #define ROW2 GPIO_PIN_1 #define ROW3 GPIO_PIN_2 #define ROW4 GPIO_PIN_3 #define COL1 GPIO_PIN_4 #define COL2 GPIO_PIN_5 #define COL3 GPIO_PIN_6 #define COL4 GPIO_PIN_7 #define ROW_PORT GPIOC #define COL_PORT GPIOC ``` 3. 接下来需要初始化这些IO口,将行引脚设置为上拉输入模式,列引脚设置为推挽输出模式: ```c GPIO_InitTypeDef GPIO_InitStruct = {0}; /*Configure GPIO pins : ROW1 ROW2 ROW3 ROW4 */ GPIO_InitStruct.Pin = ROW1|ROW2|ROW3|ROW4; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(ROW_PORT, &GPIO_InitStruct); /*Configure GPIO pins : COL1 COL2 COL3 COL4 */ GPIO_InitStruct.Pin = COL1|COL2|COL3|COL4; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(COL_PORT, &GPIO_InitStruct); ``` 4. 然后在主函数中编写矩阵键盘的扫描程序,当检测到有按键按下时,就将对应的按键编号显示出来: ```c int main(void) { /* 硬件初始化 */ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); /* 矩阵键盘扫描程序 */ while (1) { if (HAL_GPIO_ReadPin(ROW_PORT, ROW1) == GPIO_PIN_RESET) // 检测第一行 { HAL_GPIO_WritePin(COL_PORT, COL1, GPIO_PIN_RESET); HAL_Delay(10); if (HAL_GPIO_ReadPin(ROW_PORT, ROW1) == GPIO_PIN_RESET) { printf("按下了1号键\n"); // 显示按键编号 while (HAL_GPIO_ReadPin(ROW_PORT, ROW1) == GPIO_PIN_RESET); } HAL_GPIO_WritePin(COL_PORT, COL1, GPIO_PIN_SET); } // 依照上述方法扫描其他行列 } } ``` 注意:由于矩阵键盘的扫描需要比较频繁地读取IO口的状态,因此需要在主函数中加入适当的延时,否则可能会出现误检的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zx62365

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值