我们继续来说矩阵按键的问题,这次是用在实际电路中的。在仿真中我们没有发现问题,但是文章最后我提出了,这个电路在实际应用中一定是存在问题的,那么问题在哪里呢?

这是我们分析的电路。

前几篇我们也对硬件进行了测试,我们可以发现,仿真没有问题,但是凡是按键开关,在实际应用中,都会出现按键按下响应不稳定的情况,我们称之为抖动,在实际应用中,抖动的问题,是一定存在的,无论电路优化的多么完美,那么我们在现在这个阶段,如何处理呢,依然是采用软件延时消抖大法。

对这个方法不是很熟悉的,可以翻阅前期文章,我们此处不再详细展开。就直接使用了。抖动的发生,是我们检测到按键的变化开始的,也就是检测到按键发生改变,接着就要消抖了。

P1=0xef;   //第四行1110 1111

if(P1!=0xef){keyJS();}

这是我们按键检测的代码,第一行代码我们对行进行了置零,然后检测是那一列发生了改变。当我们检测到按键被按下时,就进入了判断语句,也就是这个时候,需要进行按键的消抖了。为了方便理解,我先把消抖写在外边。

原本我们判断后就会直接进行按键的计算输出,但是这样就会造成一次按下,却输出了三次以上的结果,在有些场合是不行的,会触发误动作,所以我们就需要消抖操作。我们这里采用的是延时消抖的方法,在扫描时,先让行置零,然后判断置零后是否有按键按下,如果有按键按下,那么此时P1的端口值就会与设定的存在不同,通过判断不同,来进入判断语句,为了防止抖动影响,我们先让按键的键值保存起来,然后等待一段时间,接着判断当前的P1值与之前保存的是否一致,如果一致,就认为按键按下了,并且已经稳定,然后就可以执行按键处理程序了,处理完,为了防止按键的连续重复操作,我们需要对按键的抬起进行监控,当检测到按键已经抬起,此时缓存值会与P1不同,就会跳出循环,就不会出现长按按键,反复检测开关,导致连续动作。

好的理论有了,我们进行下仿真。先进行软件仿真,出现错误方便修改。

软件仿真打开后,导入程序,然后打开运行,首先出现的界面是所有端口都是高电位,P1的低四位在不断的扫描。接着我们按下任意一个按键,按三次看下结果。

可以看到,上方的二极管显示的是0000 0011,转译成十进制就是3.我们为了验证测试下多次多个按键按下,就选择中间八个按键依次按下。

此时显示的是000 1011,翻译成十进制就是8+2+1=11,我们操作了11次,显示11,说明仿真没有问题,至少证明程序可以实现功能,接下来我们使用电路板测试下。

在程序中运行完美的程序,到了我的电路板上就失控了。

完全没有反应好不,什么情况?难道要翻车?我一个好好的教程要变成一个维修课程了。这是我遇到的第一个故障,目前不清楚是硬件还是软件故障,程序是两天前写的,外出两天回来,第一次下载就这样,我相信我的硬件应该不会有问题,因为矩阵按键很简单,就是按键两端连上线,然后连接到单片机上就可以了,而LED小灯就更简单了。那么消除故障的过程就这么猝不及防的开始吧,因为后期制作过程中必然会遇到更多的问题。趁着小孩睡觉了,我来看看故障究竟出在哪里。

我们比较方便的就是去判断软件的问题,因为程序出现问题的概率远远大于硬件。首先我先写个测试的文件。新建一个工程吧。

语句就尽可能简单,主要测试延时和按键响应问题。来判断是否是硬件出了毛病。我会挨个判断四个按键。

编译后下载到单片机中。呦呵,没有反应!难道是我太急躁,代码有问题?我把代码修改的简单些。

嗯,这次基本就可以判断是代码的问题了,按下按键,LED就熄灭了。接下来是四个按键测试下。

这是四个按键,我先下载看下效果。

哎呦,不错哦,说明按键是没有毛病的。那就看之前的代码了,检查代码也是个技术活。我们的测试文件中没有体现出按键输出的处理函数,这次就添加上按键处理函数。函数从代码上没有看出有什么问题,通过循环判断出符合哪一个,然后执行P0加一,然后返回,看似问题不在这里。

好吧,程序下载好之后,确实没有反应了。

if(key0==0)

{delay(3);if(key0==0)

{keyJS();while(key0==0);}}

这是判断的代码,我把key4置0了,然后再把key0置零,这时P1》01110111》0x77.

按照道理上说,此时应该可以执行才对,为什么?

我们再把代码写的简单些,看是不是我们程序的流程存在瑕疵。

再次编译后下载到单片机中测试。我的老天,还是不行,问题不应该在代码,这个代码是不会有问题的,我要回过头查下硬件了,先测试下当我按下P1.0时是否有0电位输入。

这是按键没有按下时的电压。我用的是18650电池,电压是3.9V正常的。

按下P1.0就变成了0V,这说明问题不在此处。

哎呦,电压也没有问题呢,什么情况?我检查下电路,首先是电源电路,对所有电源进行重现排查,然后重新插紧。再次测试下,然后好了。

这个问题出在哪里呢?且待我细细分析一番,以免后期同样故障无法排除。

。。。。。。。

嗯,知道问题在哪里了,主要是面包板的问题,因为我们这里近段时间在下雨,估计南方的同志们也是如此,希望雨水赶快消停。由于天气潮湿,我得面包板的负极接线头有些锈蚀了,就造成了接触电阻增加,平时点亮单个小灯还好,但是如果电流增加,例如我们做16个按键的扫描,然后8个LED的点亮,就会耗费大量的电流,此时电流的增加,就会造成接触电阻分压增加,继而就会造成单片机电源电压低于3.3V,处于假死状态,然后所有端口就会复位,效果跟按下复位键一样,就是硬件死机了。将插针处理好后,就可以了。此时我们之前的程序重新下载到单片机中,再次检测一下。

指示灯000 1100

指示灯1000 1100

指示灯0100 1100

到这里基本就可以看出来,代码运行正常了。通过这次实际运行测试,我们可以看出,实际的操作可以让我们学习到仿真无法带来的知识。通过检修,我们可以明白,往往硬件故障都是有原因的,这些原因都隐藏在电流、电压这些数据之中。尽管使用PCB制作的板子会稳定很多,但是同样你对电路的了解也就会少很多,最多知道这是干什么的,回头就会忘记电路怎么连了。而我们学习单片机的,只写代码是徒有灵魂,就像你知道火箭可以飞到月球,可是不会造,岂不是空谈?总之好的软件工程师,必然不会是硬件小白。

马上放假了,可以多动手练习练习。

单片机怎么跳出循环_自学单片机第二十七篇:矩阵按键的硬件测试相关推荐

  1. 第二十七篇 导航栏和内容块

    导航栏和内容块 上节课留下了一个小练习: 老师做了一份,但是没有图片图标,所以代码里没有用到 img 标签. 在写之前,我们要分析吧,这个页面,难度只有左侧的导航栏.因为动态! 我们可以用到jQuer ...

  2. stc89c51单片机音乐盒系统设计_基于单片机的火控系统语音报读设计

    在现代大多控制系统中,通常使用发光二极管LED.数码管.液晶显示器.蜂鸣器等进行状态 / 结果显示和故障报警,如果在显示报警仪表上采用数字语言技术,使适合用听觉传送的信息用语言传送,就可以发挥听觉的优 ...

  3. 单片机ch2o程序_基于单片机的甲醛浓度检测仪的设计_李娟娟

    摘要: 甲醛的刺激味道和致癌作用严重威胁着人类的健康, 文献 [ 1,2 ] 中提到当甲醛浓度超过 0.08mg/m3 时, 人就有不适 感.针对甲醛浓度问题设计了一款通用的室内甲醛气体浓度检测仪器, ...

  4. 输出毫秒_自学单片机第十三篇上:单点输出

    关注一下,更多精彩等着你! 打开之前的工程,当然新建也可以,具体步骤看之前的文章就行.因为是学习,所以也用不着总是新建工程,起名起一大堆,接下来,除非要用两个执行文件,只要是单独的程序,我们就用这个工 ...

  5. 单片机large模式_对单片机存储分配新的认识

    51单片机存储器采用的是哈佛结构,即是程序存储器空间和数据存储器空间分开,程序存储器和数据存储器各自有自己的寻址方式.寻址空间和控制系统. 51存储器可以分为 程序存储器ROM:用于存放程序和表格之类 ...

  6. 单片机ch2o程序_基于单片机的室内甲醛浓度检测系统

    基于单片机的室内甲醛浓度检测系统 田秀荣 [期刊名称] <山西电子技术> [年 ( 卷 ), 期] 2014(000)003 [ 摘 要 ] As everyone knows , the ...

  7. stc89c51单片机音乐盒系统设计_基于单片机数字音乐盒的设计与实现(附PCB,电路图,程序)...

    基于单片机数字音乐盒的设计与实现(附PCB,电路图,程序)(开题报告,中期检查表,毕业论文18000字) 摘要 传统的音乐盒多是机械音乐盒,其工作原理是通过齿轮带动一个带有铁钉的铁桶转动,铁桶上的铁钉 ...

  8. 合泰单片机触摸例程_合泰单片机iic例程

    本程序是基于合泰单片机的 ,如果需要移植于其他单片机只需稍微修改即可 模拟IIC(I2C)时序,C语言程序 #include "ht46R65.h" #define SDA _pa ...

  9. 合泰单片机做电压表_合泰单片机使用总结

    之前一直用ARM 系列的单片机,现在因为产品需要,用了一款合泰单片机(HT67F2360),整个开发过程中发现还是有很多差异. 一.开发环境中的一些差异# arm 系列单片机,直接用keil 接 选用 ...

最新文章

  1. 第5次作业+105032014166+张珍珍
  2. 【C++/C】【学习笔记】二分算法——处理“最小却最大”问题
  3. 解决Linux中文乱码
  4. zookeeper原理与使用
  5. R语言观察日志(part6)--初识rMarkdown
  6. 前端学习(2932):vue中的v-show
  7. 【常见笔试面试算法题12续集三】动态规划算法案例分析3 LIS练习题(最长上升子序列)
  8. c语言如何制作多线程序,c语言中如何创建多线程。最好有一个例子,谢谢!!...
  9. Fibonacci (hdu1568)数学公式
  10. [Unity3D]ml-agent入门案例
  11. 大学生安卓期末设计之本地音乐播放器
  12. 四川婚姻登记捷宇SC10T高拍仪技术规格说明书
  13. java技术英文名词读音_Java开发,Java development,音标,读音,翻译,英文例句,英语词典...
  14. 【新手入门】自己动手搭建云服务器
  15. 公众号裂变一般用什么方法?小白如何做好一场公众号裂变活动?
  16. SpringIOC、AOP
  17. vue与微信小程序的写法对比
  18. 明日之后说正在连接服务器,手游明日之后一直正在连接服务器
  19. 当女生说没衣服穿时。。。。
  20. java求圆和梯形_jsp与javabean例子 求三角形、圆、梯形面积

热门文章

  1. 集合框架(List的三个子类的特点)
  2. 行列式计算的两种方法
  3. ubuntu安装virtualbox
  4. SharpSvn使用说明
  5. 比特币现金(BCH)独立日一周年庆!里程碑一览!
  6. 比特币现金的一年回顾
  7. 灯塔的出现给那些有想法,有能力而又缺乏资金的社区人士提供了一条途径,也给那些有资金的BCH爱好者提供了一条投资渠道,良性的共赢机制在保证平台健康发展的前提下,一定会催生出更多基于BCH的应用。
  8. JavaScript数据运算
  9. 我的网站搭建 (第十七天) celery 定时刷新缓存
  10. Redisbook学习笔记(1)跳跃表