历史上的今天
返回首页

历史上的今天

今天是:2025年03月28日(星期五)

正在发生

2019年03月28日 | 基于STM32-按键输入与八种IO口模式

2019-03-28 来源:eefocus

按键检测使用到 GPIO 外设的基本输入功能, 按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一下子断开,使用按键时会产生图 中的带波纹信号,需要用软件消抖处理滤波,不方便输入检测。



这里再讲下八种IO口模式:


1.模拟输入

 我认为模拟输入最重要的一点就是。他不经过输入数据寄存器,所以我们无法通过读取输入数据寄存器来获取模拟输入的值,我认为这一点也是非常好理解的,由于输入数据寄存器中存放的不是0就是1。而模拟输入信号不符合这一要求,所以自然不能放进输入数据寄存器。该输入模式,使我们能够获得外部的模拟信号。


2.浮空输入

 该输入状态。我的理解是。它的输入全然由外部决定,我认为在数据通信中应该能够使用该模式。应为在数据通信中。我们直观的理解就是线路两端连接着发送端和接收断。他们都须要准确获取对方的信号电平,不须要外界的干预。

所以我认为这样的情况适合浮空输入。比方我们熟悉的I2C通信。


3上拉输入

 上拉输入就是在输入电路上使用了上拉电阻。这样的模式的优点在于我们什么都不输入时,由于内部上拉电阻的原因,我们的处理器会认为我们输入了高电平。这就避免了不确定的输入。这在要求输入电平仅仅要高低两种电平的情况下是非常实用的。


4下拉输入

和上拉输入相似,只是下拉输入时,在外部没有输入时,我们的处理器会认为我们输入了低电平。


5开漏输出

开漏输出,输出端相当于三极管的集电极。所以适合与做电流驱动的应用。要得到高电平。须要上拉电阻才干够。


6推挽输出

推挽输出使用了推挽电路,结合推挽电路的特性。它是由两个MOSFET组成,一个导通的同一时候,另外一个截至,两个MOSFET分别连接高低电平,所以哪一个导通就会输出相应的电平。推挽电路速度快,输出能力强,直接输出高电平或者低电平。

 能够输出高,低电平,连接数字器件; 推挽结构通常是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候还有一个截止。


7复用开漏和复用推挽

我们知道这仅仅是对GPIO的复用而已。

使普通的GPIO具有了别的功能。



程序如下:


#ifndef _KEY_H

#define _KEY_H

#include "stm32f10x.h"

#include "sys.h"

u8 Key_Scan(u8 mode);

 

//#define KEY1   (!!(GPIOE->IDR & 0x0010))

//#define KEY2   (!!(GPIOE->IDR & 0x0008))

//#define KEY3   (!!(GPIOE->IDR & 0x0004))

//#define KEY_UP (!!(GPIOA->IDR & 0x0001))

 

#define KEY1 PEin(4)

#define KEY2 PEin(3)

#define KEY3 PEin(2)

#define KEY_UP PAin(0)

 

void Key_Init(void);

#endif

 

 

#include "key.h"

#include "delay.h"

/*

函数功能:按键初始化

硬件连接:

KEY_UP -> PA.0

KEY1   -> PE.4

KEY2   -> PE.3

KEY3   -> PE.2

*/

 

void Key_Init(void)

{

//时钟使能

RCC->APB2ENR |=1<<6; //GPIOE

RCC->APB2ENR |=1<<2; //GPIOA


//端口配置

GPIOE->CRL &=0xFFF000FF; //PE2-4

GPIOE->CRL |=0x00088800;


GPIOE->ODR |=7<<2;


GPIOA->CRL &=0xFFFFFFF0; //PA.0

GPIOA->CRL |=0x00000008;

//GPIOE->ODR|=7<<2; //PE2~4 上拉

}

/*

函数功能:按键扫描

说 明:u8 mode 0不支持长按,1支持长按

*/

u8 Key_Scan(u8 mode)

{

static u8 key_flag=1;//按键标志

if(mode)  key_flag=1;

if(key_flag&&(KEY1==0 || KEY2==0 || KEY3==0 || KEY_UP==1))

{

delay_MS(5); //消抖过程

key_flag=0;

if(KEY1==0) return 1;

else if(KEY2==0) return 2;

else if(KEY3==0) return 3;

else if(KEY_UP==1) return 4;

}

else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY_UP==0)

key_flag=1;

return 0;

}

 


#include "led.h"

#include "delay.h"

#include "key.h"

int main(void)

{

u8 key_value;

Led_Init();

Delay_Init(72);

Beep_Init();

Key_Init();

while(1)

{

key_value=Key_Scan(0);//这里不支持长按

switch(key_value)

{

//四个按键分别控制LED‘的亮灭

case 1:LED1=!LED1;break;

case 2:LED2=!LED2;break;

case 3:LED3=!LED3;break;

case 4:LED4=!LED4;break;

}

}

}

推荐阅读

史海拾趣

EREM公司的发展小趣事

近年来,随着科技的快速发展和电子行业的变革,EREM公司也面临着巨大的挑战。为了应对这些变革,EREM积极调整战略方向,加大研发投入,推出了一系列符合市场需求的新产品。同时,EREM还注重人才培养和团队建设,打造了一支高效、专业的团队,为公司的发展提供了有力保障。

Equinox公司的发展小趣事

1991年,在纽约的上西区,一个名叫Equinox的健身俱乐部悄然开业。它的创始人凭借对健身行业的热情和对高端市场的敏锐洞察,将Equinox定位为一家提供豪华健身体验的俱乐部。通过提供优质的设施、个性化的服务和丰富的课程,Equinox很快在上西区树立了良好的口碑。

Holtek(合泰)公司的发展小趣事

1991年,在纽约的上西区,一个名叫Equinox的健身俱乐部悄然开业。它的创始人凭借对健身行业的热情和对高端市场的敏锐洞察,将Equinox定位为一家提供豪华健身体验的俱乐部。通过提供优质的设施、个性化的服务和丰富的课程,Equinox很快在上西区树立了良好的口碑。

飞虹(FeiHong)公司的发展小趣事

在稳步发展的同时,苏州锋驰也积极拓展对外合作与投资。公司共对外投资了3家企业,并通过这些投资进一步拓宽了业务范围和市场渠道。这些合作不仅为苏州锋驰带来了更多的技术资源和市场机会,也增强了公司的综合竞争力。同时,公司还积极与上下游企业建立紧密的合作关系,形成了良好的产业生态。

捷嘉电子(Chequers Electronic)公司的发展小趣事

随着公司规模的扩大,捷嘉电子开始着手整合产业链资源,以提升整体竞争力。公司通过与上游供应商建立长期稳定的合作关系,确保了原材料的质量和稳定供应;同时,通过加强与下游客户的沟通与协作,实现了产品的定制化服务和快速响应市场需求。这些举措不仅提高了捷嘉电子的运营效率,也进一步巩固了其在市场上的地位。

Diode Laser Concepts公司的发展小趣事

在电子行业日益关注环保的背景下,Diode Laser Concepts公司积极响应,将环保理念融入产品设计和生产过程中。公司采用环保材料,优化生产流程,减少废弃物排放,致力于为客户提供绿色、环保的二极管激光产品。这一举措不仅提升了公司形象,也为公司赢得了更多客户的青睐。

问答坊 | AI 解惑

马达及控制器的挑战

1.更高性能要求        用开环交流感应马达(ACIM)或者步进马达的家电制造商们对性能提供了更高的要求。他们发现以前的马达控制方法无法处理现在面临的负载型态(loadprofile)。例如,负载较高的洗衣机正在从顶部加载向前端加 ...…

查看全部问答>

(一)偶遇一好东东,不忘与大家分享: 分析笔记本电池及节能技术

      让动力澎湃不息 ——详细分析笔记本电脑电池及节能技术       与台式机不同,笔记本电脑狭小的内部空间、不理想的散热条件以及用户强调的良好便携性要求使得笔记本电脑的所有部件不仅在设计制造时 ...…

查看全部问答>

用51汇编写一个4个按键在不同界面下执行不同的操作

用51汇编写一个4个按键在不同界面下执行不同的操作,大家都是怎么做的?我开始是在每个界面写好之后带一个扫描引脚JB语句,但是这样很浪费程序空间,一共四个按键,在不同的界面下执行不同的操作,有些界面下执行翻页,有些界面下执行光标的上下移 ...…

查看全部问答>

求购2440方案!

大概要求: CPU : 三星2440 CPU接口 :2个串口 、1个网口 、几个IO、1个USBLCD: 7\' LCD + 触摸屏 OS: wince 4.2 或者 5.0 有此方案者请与我联系 QQ:502240410 …

查看全部问答>

关于wince下MySqlParameter的一个问题

private void button1_Click(object sender, EventArgs e)         {             MySqlParameter[] paramter =            &nbs ...…

查看全部问答>

太棒了!c8051f单片机也可以和nxp,sst等单片机一样串口编程!原理却很不一样!

c8051f单片机可以用IAP(在应用编程)方式进行代码多次编程,通常采用RS232串口方式,可靠稳定! 只需要一块目标板,可以不要仿真器和编程器,能节省不少成本!值得推广采用! http://c8051fmcu.blog.sohu.com…

查看全部问答>

怎么获取internet时间

怎么弄本地时间与internet时间同步?…

查看全部问答>

招兼职matlab自动控制讲师

本单位招兼职matlab自动控制讲师,要求有一定项目经历,表达能力强,待遇高,日结,有意者请与我联系。地点北京,上海,成都,广州,大连等地, QQ:1489302364,邮件:hailang869@163.com ,罗先生…

查看全部问答>

俺的C习题(5)——这个很简单,圈哥看你能挑出什么?

如题/*practise 8.2*//*这个程序很简单,就是把输入的整数转换成字符型输出*/#include<stdio.h>char *itoa(int n,char str[]) //鬼知道我当时怎么会起了这么一个名字...{ int negative = 0; int i = 0; char buffer = 0; /*处理负数*/ if(n ...…

查看全部问答>

贴片元件的焊接标准是什么

请教各位大侠,贴片元件的焊接标准是什么?…

查看全部问答>