电路图
首先,要想通过按钮点亮LED灯,那就必须了解开发板上led灯和按钮所对应的引脚,最直接的方法就是看电路图(这边所使用的是物联网技能大赛对应的ZigBee开发板,若用其它板子得对引脚和代码进行更替):
如图可以看出led灯的引脚分别对应到:
D3 | P1_0 |
D4 | P1_1 |
D5 | P1_3 |
D6 | P1_4 |
按钮的引脚对应到:
SW2 | P0_1 |
SW1 | P1_2 |
寄存器设置
上一篇了解了2个重要的寄存器在这次案例中也会涉及得到,现在再来看看两个对于输入模式下重要的寄存器
P0INP 端口输入配置寄存器
位 | 位名称 | 复位值 | 操作 | 描述 |
7:0 | MDP0[7:0] | 0x00 | R/W | 设置 P0_7 到 P0_0 端口的输入模式。 0:上拉/下拉(需要结合 P2INP 联合配置)。 1:三态。 |
P1INP 端口输入配置寄存器
位 | 位名称 | 复位值 | 操作 | 描述 |
7:2 | MDP1[7:2] | 0x00 | R/W | 设置 P1_7 到 P1_2 端口的输入模式。 0:上拉/下拉(需要结合 P2INP 联合配置)。 1:三态。 |
1:0 | - | 00 | R0 | 不使用 |
P2INP 端口输入配置寄存器
位 | 位名称 | 复位值 | 操作 | 描述 |
7 | PDUP2 | 0 | R/W | 为 P2 端口所有引脚选择上拉或下拉。 0:上拉。 1:下拉。 |
6 | PDUP1 | 0 | R/W | 为 P1端口所有引脚选择上拉或下拉。 0:上拉。 1:下拉。 |
5 | PDUP0 | 0 | R/W | 为 P0 端口所有引脚选择上拉或下拉。 0:上拉。 1:下拉。 |
4:0 | MDP2_[4:0] | 0x00 | R/W | 设置 P2_4 到 P2_0 端口的输入模式。 0:上拉/下拉。 1:三态。 |
我们若想检测引脚的高低电平,需将其PxSEL端口功能寄存器设置成通用 I/O 功能,和将PxDIR 端口方向寄存器设置成输入,以及将对应的引脚设置成上下拉模式,最后根据电路图将其设置为上拉或者下拉。
当电路为IO接GND时候,则为设置为上拉输入,提供默认电平为高电平。下降沿触发。
当电路为IO接VCC时候,则为设置为下拉输入,提供默认电平为低电平。上升沿触发。
P0SEL &= ~0x02;//将 P0_1 设置成通用I/O
P0DIR &= ~0x02;//将 P0_1 设置成输入方向
P0INP &= ~0x02;//将 P0_1 设置成上拉/下拉
P2INP &= ~0x20;//将 P0端口 设置成上拉
P1SEL &= ~0x04;//将 P1_2 设置成通用I/O
P1DIR &= ~0x04;//将 P1_2 设置成输入方向
P1INP &= ~0x04;//将 P1_2 设置成上拉/下拉
P2INP &= ~0x40;//将 P2端口 设置成上拉
按钮抖动原理及处理方法
机械按钮的触点闭合和断开时,都会产生抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理。按键的抖动对于人类来说是感觉不到的,但对单片机来说,则是完全可以感应到的,而且还是一个很“漫长”的过程,因为单片机处理的速度在**“微秒”级,而按键抖动的时间至少在“毫秒”**级。
如果在触点抖动期间检测按键的通断状态,则可能导致判断出错,即按键一次按下或释放被错误地认为是多次操作,从而引起误处理。因此,为了确保单片机对一次按键动作只作一次响应,就必须考虑如何消除按键抖动的影响。
在处理按键抖动的程序中,必须同时考虑消除闭合和断开两种情况下的抖动。所以,对于按键消抖的处理,必须按最差的情况来考虑。机械式按键的抖动次数、抖动时间、抖动波形都是随机的。不同类型的按键其最长抖动时间也有差别,抖动时间的长短和按键的机械特性有关,按键输出的信号的跳变时间(上升沿和下降沿)最大是在20ms左右。按键一次闭合最短的时间大概是120ms。按键消抖的关键是提取稳定的低电平(或高电平)状态,滤除按键稳定前后的抖动脉冲。
消抖是为了避免在按键按下或是抬起时电平剧烈抖动带来的影响。按键的消抖,可用硬件或软件两种方法。
硬件消抖
在键数较少时可用硬件方法消除键抖动。硬件消抖的典型做法是:采用R-S触发器或RC积分电路。
1. 双稳态消抖
双稳态消抖即在按键输出端加R-S触发器或单稳态触发器构成消抖电路,如图所示,触发器一旦翻转,触点抖动对其不会产生任何影响。
2. 滤波消抖
编辑
如图所示,利用RC积分电路可以吸收振荡脉冲的特点,正确选取适当的时间常数,便可消除按键抖动的影响。
软件消抖
当按键较多时,硬件方法将导致系统硬件电路设计复杂化,硬件消抖将无法胜任,这时常采用软件方法进行消抖。常用软件方法去抖,即检测出引脚触发沿后执行一个延时程序,5ms~10ms的延时,让前沿抖动消失后再一次检测引脚的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。
软件消抖的基本原理是:在检测到有按键按下时,不是立即认定此键已被按下,而是执行一个10ms左右(具体时间应视所使用的按键进行调整)的延时程序后,再确认该键电平是否仍然保持闭合状态电平,若仍然保持,则确认该键真正被按下。
对于我们而言,当单片机的电路已经确定切不具备有硬件消抖的情况下,我们都采用软件消抖。
if(判断按钮是否是被按下的电平状态) { 延时10ms if(判断按钮是否是被按下的电平状态) { while(判断按钮是否还保持被按下的电平状态); 延时10ms /* 按钮触发处理事件
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!
习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!