历史上的今天
返回首页

历史上的今天

今天是:2025年02月18日(星期二)

正在发生

2020年02月18日 | stm32寄存器版矩阵键盘库函数(附详细注释)

2020-02-18 来源:elecfans

在STM32F105和STM32F107互连型系列微控制器之前,意法半导体已经推出STM32基本型系列、增强型系列、USB基本型系列、互补型系列;新系列产品沿用增强型系列的72MHz处理频率。内存包括64KB到256KB闪存和 20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA100三种封装,不同的封装保持引脚排列一致性,结合STM32平台的设计理念,开发人员通过选择产品可重新优化功能、存储器、性能和引脚数量,以最小的硬件变化来满足个性化的应用需求。本文为大家介绍stm32寄存器版矩阵键盘库函数。

stm32寄存器版矩阵键盘库函数(附详细注释)

stm32寄存器版矩阵键盘库函数

////////////////////.h文件

#ifndef __KEY_H

#define __KEY_H

#include “sys.h”

#define KEYa PAin(13) //PA13

#define KEYb PAin(15) //PA15

#define KEYc PAin(0) //PA0 WK_UP

#define KEY0 PAin(4) //PA4矩阵键盘的第1列

#define KEY1 PAin(5) //PA5 2

#define KEY2 PAin(6) //PA6 3

#define KEY3 PAin(7) // 4

#define KEY4 PAin(0) //第1行

#define KEY5 PAin(1) // 2

#define KEY6 PAin(2) // 3

#define KEY7 PAin(3) // 4

extern void juzhe_Init(void);//IO初始化

extern u8 KEY_Get(void); //按键扫描函数

void KEY_Init(void);//IO初始化

u8 KEY_Scan(void); //按键扫描函数

#endif

////////////////////////.c文件

#include < P>

#include “key.h”

#include “delay.h”

//按键初始化函数

//特别注意:在该函数之后,JTAG将无法使用(SWD也无法使用)

//如果想JTAG仿真,可以屏蔽该函数。

//PA0.13.15 设置成输入

void KEY_Init(void)

{

RCC->APB2ENR|=1<<2; //使能PORTA时钟

GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入

GPIOA->CRL|=0X00000008;

GPIOA->CRH&=0X0F0FFFFF;//PA13,15设置成输入

GPIOA->CRH|=0X80800000;

GPIOA->ODR|=1<<13; //PA13上拉,PA0默认下拉

GPIOA->ODR|=1<<15; //PA15上拉

}

//按键处理函数

//返回按键值

//0,没有任何按键按下

//1,KEY0按下

//2,KEY1按下

//3,KEY2按下 WK_UP

//注意此函数有响应优先级,KEY0>KEY1>KEY2!!

u8 KEY_Scan(void)

{

staTIc u8 key_up=1;//按键按松开标志

JTAG_Set(JTAG_SWD_DISABLE);

if(key_up&&(KEYa==0||KEYb==0||KEYc==1))

{

delay_ms(10);//去抖动

key_up=0;

if(KEYa==0)

{

JTAG_Set(SWD_ENABLE);

return 1;

}

else if(KEYb==0)

{

JTAG_Set(SWD_ENABLE);

return 2;

}

else if(KEYc==1)

{

JTAG_Set(SWD_ENABLE);

return 3;

}

}else if(KEYa==1&&KEYb==1&&KEYc==0)key_up=1;

JTAG_Set(SWD_ENABLE);

return 0;// 无按键按下

}

void juzhe_Init1(void)

{

RCC->APB2ENR|=1<<2; //使能PORTA时钟

GPIOA->CRL&=0X00000000;//PA0-3设置成输入 PA4-7设置成推挽输出

GPIOA->CRL|=0X33338888;

GPIOA->BSRR|=1<<0; //PA0-3设置输入上拉 P¥4-7设置成推挽输出低电位

GPIOA->BSRR|=1<<1;

GPIOA->BSRR|=1<<2;

GPIOA->BSRR|=1<<3;

GPIOA->BRR|=1<<4;

GPIOA->BRR|=1<<5;

GPIOA->BRR|=1<<6;

GPIOA->BRR|=1<<7;

}

void juzhe_Init2(void)

{

RCC->APB2ENR|=1<<2; //使能PORTA时钟

GPIOA->CRL&=0X00000000; // 与上面一个函数设置的IO口相反

GPIOA->CRL|=0X88883333;

GPIOA->BRR|=1<<0;

GPIOA->BRR|=1<<1;

GPIOA->BRR|=1<<2;

GPIOA->BRR|=1<<3;

GPIOA->BSRR|=1<<4;

GPIOA->BSRR|=1<<5;

GPIOA->BSRR|=1<<6;

GPIOA->BSRR|=1<<7;

}

u8 KEY_Get(void)

{

staTIc u8 key_up=1; u8 m=0;

juzhe_Init1();

delay_ms(1);

if(key_up&&(KEY4==0||KEY5==0||KEY6==0||KEY7==0)) //检测哪一行有按键按下

{

delay_ms(10);

key_

up=0;

if(!KEY4) //判断在对应行下的哪一列

{

m=0;

juzhe_Init2();

delay_ms(1);

if(!KEY0) //检测哪一列有按键按下,求出对应的键,返回设定的键值

return m+1 ;

if(!KEY1)

return m+2;

if(!KEY2)

return m+3;

if(!KEY3)

return m+4;

}

if(!KEY5)

{

m=4;

juzhe_Init2();

delay_ms(1);

if(!KEY0)

return m+1 ;

if(!KEY1)

return m+2;

if(!KEY2)

return m+3;

if(!KEY3)

return m+4;

}

if(!KEY6)

{

m=8;

juzhe_Init2();

delay_ms(1);

if(!KEY0)

return m+1 ;

if(!KEY1)

return m+2;

if(!KEY2)

return m+3;

if(!KEY3)

return m+4;

}

if(!KEY7)

{

m=12;

juzhe_Init2();

delay_ms(1);

if(!KEY0)

return m+1 ;

if(!KEY1)

return m+2;

if(!KEY2)

return m+3;

if(!KEY3)

return m+4;

}

}

else if(KEY4==1&&KEY5==1&&KEY6==1&&KEY7==1) //如果没有检测到按键的话返回0

key_up=1;

return 0;

}

推荐阅读

史海拾趣

福斯特半导体(Foster)公司的发展小趣事

对于能判断障碍物的机器人电路,网友可能还有以下几个问题及其相应回答:

问题一:机器人通常使用哪些传感器来判断障碍物?

回答
机器人通常使用多种传感器来判断障碍物,主要包括但不限于以下几种:

  1. 超声波传感器:这是最常见的一种传感器,通过发射超声波并接收其反射回来的信号,根据信号的时间差和波速计算障碍物的距离。超声波传感器在检测大范围、非接触式的障碍物时非常有效。

  2. 红外传感器:红外传感器通过发射红外光并接收其反射光来判断障碍物的存在和距离。红外传感器在近距离和快速检测中表现优异,且成本相对较低。

  3. 激光传感器:激光传感器利用激光束进行测距,具有高精度、长距离测量的特点。但相比超声波和红外传感器,激光传感器的成本更高,适用于对精度要求极高的应用场景。

  4. 视觉传感器:一些高级的机器人还配备了视觉传感器,如摄像头,通过图像处理技术来识别并判断障碍物。这种方法可以实现更复杂的场景理解和避障策略。

问题二:如何设计能判断障碍物的机器人电路?

回答
设计能判断障碍物的机器人电路需要考虑以下几个关键步骤:

  1. 选择合适的传感器:根据机器人的应用场景、成本预算和精度要求选择合适的传感器。

  2. 设计信号处理电路:将传感器采集到的原始信号(如电压、电流等)进行放大、滤波等处理,以便于后续的数字处理或微控制器读取。

  3. 微控制器编程:根据传感器的输出信号编写微控制器的程序,实现障碍物的判断、避障策略的制定和执行。

  4. 执行机构控制:通过微控制器控制机器人的执行机构(如电机、舵机等),实现机器人的移动和避障动作。

  5. 整体调试与优化:对整个电路进行调试和优化,确保机器人能够准确、稳定地判断障碍物并执行避障动作。

问题三:如何提高机器人判断障碍物的准确性和稳定性?

回答
提高机器人判断障碍物的准确性和稳定性可以从以下几个方面入手:

  1. 选用高质量的传感器:高质量的传感器具有更高的精度和稳定性,能够减少误判和漏判的情况。

  2. 优化信号处理电路:通过合理的电路设计和元器件选择,减少信号噪声和干扰,提高信号的信噪比和可靠性。

  3. 算法优化:对微控制器的算法进行优化,采用更先进的算法或策略来提高障碍物的判断精度和避障效果。

  4. 多传感器融合:利用多种传感器进行融合处理,可以弥补单一传感器的不足,提高整个系统的鲁棒性和可靠性。

  5. 实验验证与迭代优化:通过大量的实验验证和迭代优化,不断调整和优化机器人的参数和算法,以提高其判断障碍物的准确性和稳定性。

EMC [ELAN Microelectronics Corp]公司的发展小趣事

随着公司的发展,义隆电子不断加大研发投入,致力于技术创新和产品多元化。公司拥有一支高素质的研发团队,拥有多项自主知识产权和核心技术。通过不断的技术创新和产品升级,义隆电子成功推出了微控制器、个人计算机外设芯片、数字显示器芯片等一系列具有市场竞争力的产品。同时,公司还积极拓展智能型人机接口技术之应用芯片等新兴领域,为未来的发展奠定了坚实的基础。

Elprotronic Inc.公司的发展小趣事

在电子行业中,客户服务质量直接关系到企业的声誉和市场竞争力。Elprotronic Inc.深知这一点,因此一直致力于优化客户服务体系。他们建立了专业的客户服务团队和客户服务热线电话等多种渠道来及时解答客户的咨询和问题。同时,公司还定期开展客户满意度调查活动收集客户反馈和建议以便及时改进和优化产品和服务。这些努力使得Elprotronic Inc.在客户服务方面赢得了良好的口碑和信誉也为公司的长期发展奠定了坚实的基础。

请注意,以上故事均为虚构内容,旨在展示Elprotronic Inc.公司可能的发展路径和故事。实际情况可能有所不同,具体细节请以公司官方发布的信息为准。

Electroswitch公司的发展小趣事

Electroswitch Electronics Products(以下简称“Electroswitch”)成立于1986年,是Electro Switch Corp的一个子公司,后者早在1946年就已创立。在创立之初,Electroswitch就致力于设计和制造高品质的开关产品,以满足电子应用领域的各种需求。通过不断的技术创新和产品优化,Electroswitch逐渐在电子行业中树立了良好的声誉。

博众电气(BZCN)公司的发展小趣事

博众电气深知人才是企业发展的核心力量。因此,公司高度重视人才培养和团队建设。通过引进优秀人才、建立完善的培训体系、营造良好的企业文化等措施,博众电气成功打造了一支高素质、专业化的团队。这支团队不仅为公司的发展提供了有力的人才保障,还为公司不断创新和进步注入了源源不断的动力。

这五个故事只是博众电气发展起来的冰山一角。在电子行业的激烈竞争中,博众电气凭借技术突破、质量管理体系建设、环保理念、国际化战略以及人才培养与团队建设等举措,不断壮大自身实力,逐步成为行业内的佼佼者。未来,博众电气将继续秉持创新、质量、环保、国际化和人才的理念,不断追求卓越,为实现更加辉煌的成就而努力拼搏。

Analog Modules Inc公司的发展小趣事

博众电气深知人才是企业发展的核心力量。因此,公司高度重视人才培养和团队建设。通过引进优秀人才、建立完善的培训体系、营造良好的企业文化等措施,博众电气成功打造了一支高素质、专业化的团队。这支团队不仅为公司的发展提供了有力的人才保障,还为公司不断创新和进步注入了源源不断的动力。

这五个故事只是博众电气发展起来的冰山一角。在电子行业的激烈竞争中,博众电气凭借技术突破、质量管理体系建设、环保理念、国际化战略以及人才培养与团队建设等举措,不断壮大自身实力,逐步成为行业内的佼佼者。未来,博众电气将继续秉持创新、质量、环保、国际化和人才的理念,不断追求卓越,为实现更加辉煌的成就而努力拼搏。

问答坊 | AI 解惑

自动洗狗机

法国一名企业家发明了一种自动洗狗机,主人只需选定洗涤方式和宠物狗的大小尺寸,按下“开始键”后机器就会自动完成浸湿、冲洗和烘干等一系列过程。狗狗就会在半个小时内“神奇大变身”——从又脏又臭变成干净蓬松。…

查看全部问答>

模拟软键盘输入

使用keybd_event函数模拟软键盘输入一个字符,和直接使用软键盘输入是有区别的, keybd_event产生的是键盘事件,而直接使用软键盘输入,使用的是SendVirtualKey和SendCharEvents,两者不一样。 有些应用程序不接受keybd_event,而只接受直接使用 ...…

查看全部问答>

关于nandflash里的MBR的问题

最近在分析freescal 的I.Mx27的eboot的code,有个问题请请教大侠: 我在分析 函数  ReadKernelRegionFromNand()的时候在这句上想不通了 // Read kernel region info from parameters         if(BP_ReadData(hPa ...…

查看全部问答>

经典C语言书籍【英文版】

本帖最后由 paulhyde 于 2014-9-15 09:01 编辑 经典C语言书籍【英文版】  …

查看全部问答>

msp430g2553 AD多通道单次转换程序

unsigned int result[4]; void init_ADC10() {      P1SEL|=BIT0+BIT3+BIT4+BIT5;      ADC10AE0|=BIT0+BIT3+BIT4+BIT5; // 使P1.0允许AD模拟输入信号   ADC10CTL0=ADC10ON+MSC+SREF_0;// ...…

查看全部问答>

msp430 uart 接收问题

小弟在做modbusrtu通信,使用149单片机定时发送数据帧,但是接收到到数据帧怎么都一样呢? resvbuf[0]——resvbuf[8]接收到的是一样的16进制数据,不知道什么原因,还望高手给予指点!!!谢谢 #pragma vector = TIMERA0_VECTOR __interrupt voi ...…

查看全部问答>

【LPC54100】UART DEBUG

board_api.h中给出了通过USART0输出DEBUG信息的函数DEBUGOUT(),实质是重定向到串口的printf: board.c中给出了USART0的初始化配置,可以看出波特率设为115200 因此在串口工具中选择相同的波特率,数据位为8。使用新唐的牛桥连接LPC54102的 ...…

查看全部问答>

近区场与远区场的区分

本帖最后由 平漂流 于 2016-7-18 15:30 编辑 有关电磁场的近区场与远区场的划分,目前看到了3个版本,一个是小于一个电磁波波长λ的是近区场,大于一个波长的是远区场;一个是小于3个波长的是近区场,大于三个波长的是远区场;最后一个是如下图所 ...…

查看全部问答>

STM32学习第八贴,有了位带,为啥还要有其他方式操作IO口,欢迎高手来喷,来指导

本帖最后由 long521 于 2017-7-13 10:21 编辑 最近空的时候,试着用STM32来操作一些简单的例程,发现IO的高低完全可以用位带这种方式就可以了,但是为什么还要用寄存器方式,还有库函数这种方式,库函数也很方便,只要一个函数执行一下就是高,另 ...…

查看全部问答>

求大神赐一张步进电机原理图

求大神赐一张步进电机原理图…

查看全部问答>