完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
按键检测使用到 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; } } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1781 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1085 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1680 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
732浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
557浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 08:20 , Processed in 0.699429 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号