stm32f10系列矩阵键盘标准库

时间: 2023-09-11 14:06:28 浏览: 35
STM32F10系列的矩阵键盘标准库包括了GPIO和中断的使用。以下是一个简单的例子,用于检测矩阵键盘上的按键是否按下: ```c #include "stm32f10x.h" #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 void GPIO_Configuration(void); void NVIC_Configuration(void); int main(void) { GPIO_Configuration(); NVIC_Configuration(); while (1) { GPIO_SetBits(GPIOB, ROW1); GPIO_ResetBits(GPIOB, ROW2); GPIO_ResetBits(GPIOB, ROW3); GPIO_ResetBits(GPIOB, ROW4); if(GPIO_ReadInputDataBit(GPIOB, COL1) == 0) { //按键1按下 } if(GPIO_ReadInputDataBit(GPIOB, COL2) == 0) { //按键2按下 } if(GPIO_ReadInputDataBit(GPIOB, COL3) == 0) { //按键3按下 } if(GPIO_ReadInputDataBit(GPIOB, COL4) == 0) { //按键4按下 } GPIO_ResetBits(GPIOB, ROW1); GPIO_SetBits(GPIOB, ROW2); GPIO_ResetBits(GPIOB, ROW3); GPIO_ResetBits(GPIOB, ROW4); if(GPIO_ReadInputDataBit(GPIOB, COL1) == 0) { //按键5按下 } if(GPIO_ReadInputDataBit(GPIOB, COL2) == 0) { //按键6按下 } if(GPIO_ReadInputDataBit(GPIOB, COL3) == 0) { //按键7按下 } if(GPIO_ReadInputDataBit(GPIOB, COL4) == 0) { //按键8按下 } GPIO_ResetBits(GPIOB, ROW1); GPIO_ResetBits(GPIOB, ROW2); GPIO_SetBits(GPIOB, ROW3); GPIO_ResetBits(GPIOB, ROW4); if(GPIO_ReadInputDataBit(GPIOB, COL1) == 0) { //按键9按下 } if(GPIO_ReadInputDataBit(GPIOB, COL2) == 0) { //按键10按下 } if(GPIO_ReadInputDataBit(GPIOB, COL3) == 0) { //按键11按下 } if(GPIO_ReadInputDataBit(GPIOB, COL4) == 0) { //按键12按下 } GPIO_ResetBits(GPIOB, ROW1); GPIO_ResetBits(GPIOB, ROW2); GPIO_ResetBits(GPIOB, ROW3); GPIO_SetBits(GPIOB, ROW4); if(GPIO_ReadInputDataBit(GPIOB, COL1) == 0) { //按键13按下 } if(GPIO_ReadInputDataBit(GPIOB, COL2) == 0) { //按键14按下 } if(GPIO_ReadInputDataBit(GPIOB, COL3) == 0) { //按键15按下 } if(GPIO_ReadInputDataBit(GPIOB, COL4) == 0) { //按键16按下 } } } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = ROW1 | ROW2 | ROW3 | ROW4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = COL1 | COL2 | COL3 | COL4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line5 | EXTI_Line6 | EXTI_Line7 | EXTI_Line8; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } void EXTI9_5_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line5) != RESET) { EXTI_ClearITPendingBit(EXTI_Line5); } if(EXTI_GetITStatus(EXTI_Line6) != RESET) { EXTI_ClearITPendingBit(EXTI_Line6); } if(EXTI_GetITStatus(EXTI_Line7) != RESET) { EXTI_ClearITPendingBit(EXTI_Line7); } if(EXTI_GetITStatus(EXTI_Line8) != RESET) { EXTI_ClearITPendingBit(EXTI_Line8); } } ``` 在以上代码中,ROW1~ROW4是行引脚,COL1~COL4是列引脚。对于每一行引脚,将其设置为高电平,然后轮询检测每一列引脚是否被按下。如果检测到按键按下,则执行相应的操作。最后将所有的行引脚都设置为低电平,以便下一轮的扫描。 此外,为了更好地处理中断,需要在NVIC_Configuration函数中进行中断配置。在这个例子中,将EXTI线5~8与中断进行关联,并在EXTI9_5_IRQHandler函数中处理中断。

相关推荐

最新推荐

recommend-type

STM32F10x 固件函数库的时钟更改

STM32F105/107/205/207默认外部时钟是25M的,如果外部开发板用的是8M或者其他时钟晶振,可以通过里面所说的方法,对固件函数进行更改后就可以使用固件函数了。
recommend-type

STM32F10xxx_Library_库函数(中文版).pdf

了32 位基于 ARM 微控制器 STM32F101xx 与 STM32F103xx 的固件函数库。该函数库是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例。...
recommend-type

STM32F10X系例 NVIC及寄存器记录.docx

重新加深STM32F103系列NVIC中断向量控制器,结合“正点原子”相关教材和《STM32中文参考手册》,写了这篇关于NVIC的总结文档,防止自己忘记后有迹可查。
recommend-type

STM32矩阵键盘实现方法收集.doc

STM32矩阵键盘实现方法收集, STM32用矩阵键盘,不带外部中断,可以多个按键同时按下 C代码: STM32用矩阵键盘,不带外部中断,可以多个按键同时按下
recommend-type

STM32固件库SYSTEM 文件夹介绍

SYSTEM 文件夹里面的代码,此文件夹里面的代码由 ALIENTEK 提供,包含了几乎每个实验都可能用到的延时函数,位带操作,串口打印代码等。SYSTEM 文件夹下包含了 delay、 sys、 usart 等三个文件夹。...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解释minorization-maximization (MM) algorithm,并给出matlab代码编写的例子

Minorization-maximization (MM) algorithm是一种常用的优化算法,用于求解非凸问题或含有约束的优化问题。该算法的基本思想是通过构造一个凸下界函数来逼近原问题,然后通过求解凸下界函数的最优解来逼近原问题的最优解。具体步骤如下: 1. 初始化参数 $\theta_0$,设 $k=0$; 2. 构造一个凸下界函数 $Q(\theta|\theta_k)$,使其满足 $Q(\theta_k|\theta_k)=f(\theta_k)$; 3. 求解 $Q(\theta|\theta_k)$ 的最优值 $\theta_{k+1}=\arg\min_\theta Q(
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。