stm32 4*4矩阵键盘 中断扫描

这篇具有很好参考价值的文章主要介绍了stm32 4*4矩阵键盘 中断扫描。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

找了很多4*4矩阵键盘的资料和代码,很多都用的是扫描的方式,还有一些看不太明白。我理想中的方式是中断,所以自己写了一个。

这是某宝上的实物和电路图

stm32 4*4矩阵键盘 中断扫描stm32 4*4矩阵键盘 中断扫描

 用的GPIO口是B0、1、3、4、5、6、7、8

 B0、1、3、4上拉输入,B5、6、7、8推挽输出

从右到左为第1234列,从上到下为第5678行

stm32 4*4矩阵键盘 中断扫描

 5678行的GPIO口初始完后先输出低电平

当某个按键按下时,比如说第6行第2列,那么因为B1上拉输入,所以B1会产生一个下降沿

由这个下降沿进入中断

中断处理函数用来确定挂在B1也就是第2 列上这四个按键哪个被按下

重新初始化B 0134为推挽输出,B 5678为上拉输入

读5678的电平就行,哪个低电平哪个按下

退出中断时重新初始化B 0134为上拉输入,B 5678为推挽输出,保证下一次正常进入中断

调了很多次获取的键值都不对,后来我一个一个用表测的,某宝上的电路图是错的,我问客服要了PCB和原理图一堆东西也错的,这里我没法帖正确的图,东西已经装起来了

这里要注明一点

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

是因为PB34的主功能不是普通的IO口,这个让我调了很久。。。

具体原因可以看http://www.classnotes.cn/3757.html

搜“stm32 PB3”应该就行

stm32 4*4矩阵键盘 中断扫描

代码如下

key_board.h

#ifndef __KEY_BOARD_H
#define __KEY_BOARD_H
#include "sys.h"


#define in_1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)
#define in_2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)
#define in_3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)
#define in_4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)


void key_1_init(void);
void key_board_exti_init(void);

#endif

key_board.c

#include "key_board.h"
#include "delay.h"
#include "sys.h"
#include "stdint.h"
#include "usart.h"

u8 key_value = 0;					  
u8 repeat_flag = 0;

void key_1_init(void){
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);    //和PB3,PB4有关
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;  
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruct);             //初始化PB 0134 为上拉输入
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
	GPIO_Init(GPIOB,&GPIO_InitStruct);

	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
	GPIO_Init(GPIOB,&GPIO_InitStruct);

	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
	GPIO_Init(GPIOB,&GPIO_InitStruct);	
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
	GPIO_Init(GPIOB,&GPIO_InitStruct);             //初始化PB 5678 为推挽输出
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	
	GPIO_ResetBits(GPIOB,GPIO_Pin_5);
	GPIO_ResetBits(GPIOB,GPIO_Pin_6);
	GPIO_ResetBits(GPIOB,GPIO_Pin_7);
	GPIO_ResetBits(GPIOB,GPIO_Pin_8);
	
}

void key_board_exti_init(void){	

	EXTI_InitTypeDef EXTI_InitStruct;
	NVIC_InitTypeDef NVIC_InitStruct;	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
	
	EXTI_ClearITPendingBit(EXTI_Line0);
	EXTI_ClearITPendingBit(EXTI_Line1);
	EXTI_ClearITPendingBit(EXTI_Line3);
	EXTI_ClearITPendingBit(EXTI_Line4);
	
	//中断初始化
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);
	EXTI_InitStruct.EXTI_Line = EXTI_Line0;
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_Init(&EXTI_InitStruct);
	
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);
	EXTI_InitStruct.EXTI_Line = EXTI_Line1;
	EXTI_Init(&EXTI_InitStruct);

	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource3);
	EXTI_InitStruct.EXTI_Line = EXTI_Line3;
	EXTI_Init(&EXTI_InitStruct);

	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource4);
	EXTI_InitStruct.EXTI_Line = EXTI_Line4;
	EXTI_Init(&EXTI_InitStruct);

	//优先级
	NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStruct);
	
	NVIC_InitStruct.NVIC_IRQChannel = EXTI1_IRQn;
	NVIC_Init(&NVIC_InitStruct);
	
	NVIC_InitStruct.NVIC_IRQChannel = EXTI3_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStruct);
	
	NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn;
	NVIC_Init(&NVIC_InitStruct);

}

void key_2_init(void){
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

    //初始化PB 0134 为推挽输出
    此处省略

    //初始化PB 5678 为上拉输入
    此处省略
	
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
	GPIO_ResetBits(GPIOB,GPIO_Pin_0);
	GPIO_ResetBits(GPIOB,GPIO_Pin_1);
	GPIO_ResetBits(GPIOB,GPIO_Pin_3);
	GPIO_ResetBits(GPIOB,GPIO_Pin_4);
}


void EXTI0_IRQHandler(void){
	
	delay_ms(10);    //消抖
	if(in_1==0){
		key_2_init();
		
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==0)
			key_value = 13;      //按键13
		else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==0)
			key_value = 9;      //按键9
		else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==0)
			key_value = 5;      //按键5
		else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==0)
			key_value = 1;      //按键1
		
		key_1_init();
		key_value = 0;//这个当时是为了和别的代码配合设置了清零,具体情况具体判断
	}
	EXTI_ClearITPendingBit(EXTI_Line0); //清除中断标志位
}

//之后和写 EXTI0_IRQHandler 一样
void EXTI1_IRQHandler(void){
    ......
}
void EXTI3_IRQHandler(void){
    ......
}
void EXTI4_IRQHandler(void){
    ......
}

到这就拿到了key_value文章来源地址https://www.toymoban.com/news/detail-462595.html

到了这里,关于stm32 4*4矩阵键盘 中断扫描的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32-矩阵键盘】

    1.矩阵键盘简介 2.原理描述 3.代码编写 4.自我总结 1.矩阵键盘简介 此处我们采用4*4的矩阵键盘,需要 8个端口 与单片机连接 4个控制行,4个控制列 2.原理描述 很多人不清楚八个引脚怎么连接,这里我采取PD0-PD7 PD0-PD3 控制 1-4行 , PD4-PD7 控制 1-4列 如何确定我们按下的是哪个按

    2024年02月16日
    浏览(37)
  • STM32学习笔记——3*3矩阵键盘

    1. 键盘的焊接 键盘正面 键盘背面 键盘原理图: 3*3的矩阵键盘共计三行三列,所以共计需要六个阵脚,每一行/每一列连接相应的一个阵脚。 制作注意事项: 要注意开关的四个针脚,了解清楚哪两个针脚之间是连通的。     四角按键开关原理可以参考博客: 四脚按键开关

    2024年02月11日
    浏览(36)
  • 【STM32】4x4矩阵键盘

    key.c   key.h

    2024年02月12日
    浏览(42)
  • 基于stm32Cubemx的矩阵键盘配置

    我这里使用的是某宝一块四包邮的4*4矩阵键盘,感觉对大部分简单工程的实现绰绰有余 一般设置为最大速率,之后点击OK可以实现一键配置,时钟源这里选择的是高速外部时钟源(HSE) 随便找几个引脚 根据自己单片机的引脚数量和操作的方便性配置矩阵键盘的引脚 一般为四

    2024年02月08日
    浏览(41)
  • 【STM32】 4X4矩阵键盘电路

    目录 一:矩阵键盘介绍 二:矩阵电路原理图设计 三:矩阵键盘模块特点 四:4X4矩阵键盘模块实物图 五:4X4矩阵键盘模块电路原理图设计 六:4X4矩阵键盘模块电路PCB图设计 轻触按键是按键产品下属的一款分类产品,它其实相当于是一种电子开关,只要轻轻的按下按键就可以

    2024年02月13日
    浏览(44)
  • 单片机c51中断 — 中断扫描法行列式键盘

    项目文件 文件 关于项目的内容知识点可以见专栏单片机原理及应用 的第五章,中断   在第4章中已介绍过行列式键盘的工作原理,并编写了相应的键盘扫描程序。但应注意的是,在单片机应用系统中,键盘扫描只是 CPU 工作的内容之一。CPU 在忙于各项工作任务时,需要兼顾

    2024年02月10日
    浏览(49)
  • STM32单片机4*4矩阵键盘相关代码

           矩阵键盘是我们学习32单片机中十分常见的模块。对于我们掌握32单片机的基本要求有很大的帮助。其核心原理是利用键盘按键按下时产生的电位变化来判断是否按下以及利用行列电平变化来得到按键在矩阵键盘位置的思路。本文简述其使用的相关代码。         

    2024年02月07日
    浏览(39)
  • STM32矩形(矩阵)按键(键盘)输入控制LED灯 ——4*4矩阵按键源码解析

    本文基于标准函数库的工程实现stm32F103C8T6使用4*4的矩阵按键控制LED灯的亮灭及闪烁等功能。 程序源码:链接:https://pan.baidu.com/s/1_MPhvMduKCTP0MPG-Gtw3A?pwd=2syk  提取码:2syk 文章目录 一、矩形键盘介绍 1、硬件电路基本原理 2、两种识别方法介绍 3、硬件接线即使用 二、程序源码

    2024年02月04日
    浏览(45)
  • 矩阵键盘之门锁小项目(stm32f103zet6)

    今天,给大家分享的是自己弄着玩的一个矩阵键盘控制控制舵机模拟一个智能门锁的功能。 用到的硬件: 开发板我用的是原子哥的精英板(杀鸡用宰牛刀了)。 矩阵键盘(宝上十几块买的): 外加一个舵机和一个0.96的oled显示屏。 矩阵键盘: 有VCC,GND,SCL,SDO四条线,这个矩阵键

    2024年02月10日
    浏览(46)
  • STM32F103系列 Proteus仿真 4*4矩阵键盘 串口+LCD1602显示

            最近一直在肝STM32系列芯片,这里我想要检验一下自己的初步学习成果,简单的运用一下IO口的配置,代码使用正点的库函数模板写的,仿真软件是Proteus 8.13,代码编写编译软件是Keil MDK5,仿真芯片是STM32F103R6小容量芯片。 目录 一、硬件设计  二、软件设计 1、L

    2024年02月03日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包