注册
登录
电子工程世界-论坛
返回首页
EEWORLD首页
频道
EE大学堂
下载中心
Datasheet
专题
单片机
物联网
汽车电子
嵌入式
手机/便携
模拟电子
家用电子
网络通信
电源管理
工业控制
测试测量
半导体设计/制造
安防电子
传感器
医疗电子
凔海的个人空间
https://home.eeworld.com.cn/space-uid-641902.html
[收藏]
[复制]
[分享]
[RSS]
空间首页
动态
记录
日志
相册
主题
分享
留言板
个人资料
借用开发板
论坛
淘帖
Collection
查看新帖
最新回复
社区活动
联系管理员
我的空间
帖子
日志
收藏
好友
勋章
积分
安全验证
请完成以下验证码
日志
给按键编个码
已有 898 次阅读
2016-3-23 09:08
按键通常是一种长常开型按钮开关,例如下图,如果不按动得话它就是断开状态的。
它作为单片机的附属小鬼,主要就是为了让单片机检测出它的状态,然后单片机根据这个状态来干一些事。例如,当按键按下灯亮,当按键按下开启某个器件。
看上面这四个按键,如果你不按他的话,单片机的IO口接收的就是高点平,如果按键按下则为低电平了。所以嘞,单片机通过检测该IO口的电平是不是低电平来判断是否按下,如果按键按下,可以执行按键按下所对应的一些事。
然而,这并不代表这你就可以顺利的使用这个按键了。因为我们还没有进行按键消抖。消抖?!按键会抖动?YES!百度说了:“按键作为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。”如下图
那么,为什么要消抖了?
答:会产生误判,如果用按键计数的话,按一下就好像按了好几下的样子,不稳定,试想,我就想按下它,它却在那里抖半天,忍受不了。╭∩╮(︶︿︶)╭∩╮
如何消抖了?有软件消抖和硬件消抖俩种。这里主要说的是软件消抖,就是首次检测到低电平的时候,等待那么一会再检测是不是低电平,如果是的话,那说明却是按下去了,这样就可以了。这个等待,百度说5ms~10ms,但看人家程序差不多15ms。
if(K1==0)
{
delay1ms(15);//延时15ms
if(K1==0)
{
这样就OK啦
下面就用按键实现加一功能。满九归零。
不过节约资源是人类传统美德,要让单片机用更少的IO口去控制更多的按键自然是必然趋势。所以,我们发明了矩阵键盘,例如2*3、3*4、4*4等等,接下来就一起看看4*4的矩阵键盘吧。
这个与单独一个按键的区别不仅在于多,更在于连个地都没有,该怎么检测哪个键按下了?你不给我GND,我自个模拟个GND( ̄◡◝)。先写P1=0x0f,即让P10、P11、P12、P13为低电平,P14、P15、P16、P17为高电平 。这样,如果K0按下,则P14也为低电平。说实话,我一开始并不知道为什么P10不为高电平而P14为低电平,最后听说这事线与功能。再回到刚才说的,K0按下P14低电平,如果K4按下的话,P14也是低电平,所以这样虽然有了GND,但还是检测不出哪个按下了,是吧?
在这里提供有俩种方法,一种叫扫描法,一种称为线翻转法。
1、扫描法
扫描,说白了就是挨个问,唉,是不是你啊?不是?那是不是你啊?还不是我靠?!接着问,只要有按键按下总能问出来的。
所以,用程序如何实现呢?
扫描大法第一步:
检测有没有按键按下
P1 = 0xff;
P1 = 0xf0;
temp_key = P1;
if(temp_key != P1)
{
delaynms(15);
if(temp_key != P1)
这个和单个按键检测方式一样的
扫描大法第二步:
逐行扫描,逐个判断这是扫描大法的精髓所在
首先,给P1 = 0xfe;再把P1的值读取给temp_key = P1;这是何种目的?在说之前要确定一件事,现在你还没有松开按键了,单片机虽然不快吧,但也比咱手按按键快得多,之所以提,因为记得当初我以为这个时候我的手已经松开了(⊙﹏⊙)b。我们看4*4矩阵键盘,因为P1=0xfe,如果第一行K0、K1、K2、K3其中一个按下,则对应的P14、P15、P16、P17其中一个为低电平,这时,把P1检测的值发给temp_key,然后看看temp_key是不是K0、K1、K2、K3其中的一个编码(即ee de be 7e)其中一个。那如何看看啊?这个就用switch来进行
switch(temp_key)
{
case(0xee):display(0);break;
case(0xde):display(1);break;
case(0xbe):display(2);break;
case(0x7e):display(3);break;
}
当然这只是完成了一行的扫描,咱一共四行嘞,所以要进行这样操作四次。
第二行……
这就是扫描大法 ,虽实现了对按键的检测,但略显麻烦,故有了方法二线翻转法。
线反转大法
第一步:检测是否有按键按下,同扫描大法一样
第二步:线反转法之核心就在于翻转
temp_1 = P1;temp_1所得到的值可以判断出那一列按下,如果我们P1 = 0x0f;temp_2 = P1; 这样就可以判断出哪一行的贱按下,这样行列交叉或以下就可以判断出世那个歌健按下temp = temp_1 | temp_2;temp的值就是按键的编码,然后用switch进行寻找即可 。
学识浅薄出拙文,如察错误望赐教,小弟在此感涕零。
若瞧关于单片机、FPGA等系列文章,欢迎戳下
凔海笔记本
本文来自论坛,点击查看完整帖子内容。
收藏
邀请
举报
全部
作者的其他最新日志
•
凔海笔记之FPGA(十一):SDRAM(づ。◕‿‿◕。)づ
•
凔海笔记之FPGA(九):玩一玩DS1302
•
凔海笔记之FPGA(十):Verilog描述IIC单字节读写协议
•
凔海笔记之FPGA(八):Verilog描述RS232 UART
•
凔海笔记之FPGA(七):触发器和锁存器
•
凔海笔记之FPGA(六):二进制的加法番外篇
评论 (
0
个评论)
涂鸦板
您需要登录后才可以评论
登录
|
注册
评论
凔海
加为好友
给我留言
打个招呼
发送消息
热门文章
头条资讯
新品 | 只需一对铜线,即可完成以太网传输的标准化建设
谷歌无人车离奇车祸曝光:人类安全员睡着后,误触关闭了自动驾驶
融合创新,推动中国集成电路产业供给侧改革 ——2017年中国半导体市场年会暨第六届中国集成电路产业创新大会今日于南京举行
学习、旅行、锻炼,人生不能俭省的三件事
莫大康:中国存储器梦初探
预告:银行业务光凭“刷脸”真的靠谱吗?
新增数据手册
AGLN030V2-ZQNG81PP
240-032-2-15SCF6J5-18H
EUGA18-FREQ5-I2
2402-32-CJ-B
MATP18DS-GK-BHT
C1206H101J2GAL7800
热搜器件
Y00751K80000B9L
DJT14F11-5AN
LM4890
MASMCG45CA
653P5005C3T
Motor Driver
推荐下载
IAR_kegen_6.4
嵌入式I2C总线调试.pdf
利用示波器的X和Y通道输出采样波形图形注:显示两个周期。扫频频率100Hz
Si4432官方demo程序,版本B1
FPGA实战手册
刚才上传的NEWMyOAS为分割后的其中一个功能模块
推荐关注
AXS4056:1000mA单节锂电池充电芯片参数资料、内置锂电池反接保护功能
《图解入门——功率半导体基础与工艺精讲(原书第3版)》阅读心得——碳化硅与氮化镓
ROS2 中 TF 变换发布与订阅:实现 base_link 和 test_link 实时可视化显示
《图解入门——功率半导体基础与工艺精讲(原书第3版)》阅读心得之一——一本好书
ROS2 应用:按键控制 MoveIt2 中 Panda 机械臂关节位置
对射传感器最大感应距离是多少米,最大感应距离的多种因素影响