新型的按键扫描程序
智能仪器复习资料

1.什么是智能仪器?其主要特点是什么?智能仪器是计算机技术和测试技术相结合的产物,是含有微计算机或微处理器的测量仪器。
由于它拥有对数据的存储、运算、逻辑判断及自动化操作等功能,具有一定智能的作用,因而被称为智能仪器。
特点:1操作自动化2具有自测功能3具有数据分析和处理能力4具有友好的人机对话功能5具有可程控操作能力。
简述内嵌式智能仪器的基本组成和各部分功能由硬件和软件组成。
硬件包括微处理器,存储器,输入/出通道,人机接口电路,通信接口电路等。
功能:微处理器仪器核心,存储器包括数据存储器和程序存储器,用来存储程序和数据。
输入通道主要包括传感器、信号调理电路和A/D转换器等,完成信号的滤波,放大,模数转换。
输出通道主要包括D/A转换器、放大驱动电路和模拟执行器等,将处理后的数字信号转换为模拟信号。
人机接口电路主要包括键盘和显示器,是操作者和仪器的通信桥梁。
操作者可通过键盘向仪器发出控制命令,仪器可通过显示器将处理结果显示出来。
通信接口可实现仪器与计算机和其它仪器的通信。
智能仪器常用放大器的种类和特点?程控放大器:为适应不同的工作条件,在整个测量范围内获得合适的分辨率,提高测量精度。
仪用放大器:输入阻抗和共模抑制比高、误差小、稳定性好。
隔离放大器:输入端和输出端各有不同的参考点。
可保护电子仪器设备和人生安全,提高共模抑制比,获得较精确的测量结果。
常见的A/D转换器有哪几种类型?其特点是什么?工作原理⑴并联比较型A/D转换器:转换速度快,但是随着输出位数的增加所需器件数增加速度很快⑵逐次逼近型A/D转换器:抗干扰能力差,所以在A/D转换器之前一般要加采样/保持器锁定电压。
⑶双积分型A/D转换器:能起到滤波作用提高了抗干扰能力。
由于转换速度依赖于积分时间,所以转换速度慢。
⑷Σ-△调制型A/D转换器:制作成本低,提高有效分辨率.采用逐次逼近法的A/D转换器是由一个比较器、D/A转换器、缓冲寄存器及控制逻辑电路组成,基本原理是从高位到低位逐位试探比较,好像用天平称物体,从重到轻逐级增减砝码进行试探。
《计算机控制技术》习题答案

《计算机控制技术》(机械工业出版社范立南、李雪飞)习题参考答案第1章1.填空题(1) 闭环控制系统,开环控制系统(2) 实时数据采集,实时决策控制,实时控制输出(3) 计算机,生产过程(4) 模拟量输入通道,数字量输入通道,模拟量输出通道,数字量输出通道(5) 系统软件,应用软件2.选择题(1) A (2) B (3) C (4) A (5) B3.简答题(1) 将闭环自动控制系统中的模拟控制器和和比较环节用计算机来代替,再加上A/D转换器、D/A转换器等器件,就构成了计算机控制系统,其基本框图如图所示。
计算机控制系统由计算机(通常称为工业控制机)和生产过程两大部分组成。
工业控制机是指按生产过程控制的特点和要求而设计的计算机,它包括硬件和软件两部分。
生产过程包括被控对象、测量变送、执行机构、电气开关等装置。
(2)操作指导控制系统:其优点是控制过程简单,且安全可靠。
适用于控制规律不是很清楚的系统,或用于试验新的数学模型和调试新的控制程序等。
其缺点是它是开环控制结构,需要人工操作,速度不能太快,控制的回路也不能太多,不能充分发挥计算机的作用。
直接数字控制系统:设计灵活方便,经济可靠。
能有效地实现较复杂的控制,如串级控制、自适应控制等。
监督计算机控制系统:它不仅可以进行给定值的控制,还可以进行顺序控制、最优控制、自适应控制等。
其中SCC+模拟调节器的控制系统,特别适合老企业的技术改造,既用上了原有的模拟调节器,又可以实现最佳给定值控制。
SCC+DDC的控制系统,更接近于生产实际,系统简单,使用灵活,但是其缺点是数学模型的建立比较困难。
集散控制系统:又称分布式控制系统,具有通用性强、系统组态灵活,控制功能完善、数据处理方便,显示操作集中,调试方便,运行安全可靠,提高生产自动化水平和管理水平,提高劳动生产率等优点。
缺点是系统比较复杂。
计算机集成制造系统:既能完成直接面向过程的控制和优化任务,还能完成整个生产过程的综合管理、指挥调度和经营管理的任务。
自动识别技术的不同特点和用途

条码技术的作用1条形码技术在临床实验室的自动化信息系统中所起的作用目的条形码技术利用现有医院管理系统(HIS)和实验室信息管理系统(LIS)的数据互相连接和信息共享,实现双向通讯;改变传统工作流程,提高临床实验室工作效率,杜绝不必要人为差错。
方法以VC、Windows 2000为服务器平台、Microsoft SQL Server 2000为数据库、Power Builder8. 0为前台开发工具,形成局域网,用网卡或串口将仪器联接, 并与HIS信息系统网络连接。
结果根据临床不同检验要求生成条形码标签,LIS系统通过读取标本的条形码,获取详细检验信息;自动化仪器利用双向通讯软件,读取标本容器上条形码,自动获取检验项目信息。
结论通过条形码技术应用于的临床实验室信息管理系统,达到省时、省力、方便快捷,避免不必人为差错,提高了检验质量管理水平,同时,为实现大型仪器的自动化打下基础。
2条码工业的应用作为一种管理者手中的强有力的工具,它又是如何来实现其强大的功能的呢?条码的功能主要是将所代表的信息快速地输入计算机系统,然后利用数据库技术对这些信息进行自动处理并输出结果。
下面我们举出几个条码技术应用的实例。
一、工业质量检测过程的管理实例在工业企业中,产品质量的好坏是关系到企业生死存亡的大事,而企业往往要花费大量的人力物力来对产品进行质量检测,统计质量参数,但质量参数还是往往不能及时地传送到企业决策层的手中,也难以避免在统计过程中出错而影响数据的准确性。
如果在质量检测过程中运用条码技术自动输入产品信息,用计算机的数据库系统进行自动统计,则可避免这些问题。
其实现过程如下:产品下生产线时统一贴上条码标签或金条码标牌,使每个产品有其唯一的产品标识,送交质检部门检验,在检验过程中通过条码读取设备读取唯一的产品标识,并由计算机键盘输入检测结果,存入核心数据库,再由数据库系统自动统计出检验不合格的产品的数量、工序、百分比等参数,供企业决策部门参考,找出影响产品质量的因素和工序。
智能药盒设计方案

系统结构由STC90C516单片机、2+2+4键盘、电源、晶振电路、复位电路、LCD显示、蜂鸣器电路、发光二极等几部分构成。系统结构如图2-2所示:
图2-2系统结构图
3
3.1
单片机最小系统主要由STC90C516单片机、晶振电路、复位电路等构成,单片机最小系统如图3-1所示:
图3-1单片机最小系统电路图
13、通用异步串行口(UART),还可用定时器软件实现多个UART。
14、工作温度范围:0-75℃/-40-+85℃。
15、封装:LQFP-44,PDIP-40,PLCC-44。
图3-2STC90C51RC/RD+系列单片机引脚图
1、电源
Vcc(引脚号40),芯片电源,接+5V;Gnd(引脚号20),电源接地端。
关键词:智能药盒;STC90C516;时钟;1602显示
1
1.1
很多老年人随着年龄的增长,都有健忘的毛病,对于这些老年人来说在生病的时候甚至是日常生活中按时吃药是一个难题,如果需要在不同时间吃不同的药,几乎很难独立完成,这次的结课论文题目所指的智能药盒就是针对这些老年人所设计的,是一种为了方便老年人服药而设计的药物存储容器,它可以更好地管理高龄人群吃药麻烦的问题,根据对老年人每天吃药的时间进行定时,来实现一天内对老年人每天三次或更多次的定时提醒,提醒使用者服用多种药物中的一种或多种,以帮助人们改掉不按时吃药的坏习惯。
一切科技都是为了服务人们更好的生活。鉴于目前不少老年人苦于用药的合理管理和定时服用,智能的药品管理系统正是大众所需。
近几年,随着单片机技术的快速发展,以单片机为核心的大规模集成电路在各种产品中得到了极其广泛的应用。而以单片机为核心的数字电路正是由于具有功能丰富,体积小,功耗低等优势,符合电子药盒这一产品的特点,具有极大的市场潜力和开发价值。
简易电子琴实验

哈尔滨理工大学单片机原理及接口技术课程设计报告设计题目:简易电子琴实验专业:电机与电器班级:电机10-1姓名:刘国生学号:1030350111《单片机原理及接口技术》课程设计任务书课题描述随着社会发展,计算机硬件技术越来越多的应用到生活中的各个领域,人们对软硬件技术结合开发出来的产品的要求越来越迫切,需求日益增加,如今用软硬件结合设计电子产品已经成为了一大时尚。
本设计编写的一个用开关模拟电子琴的程序,以8086作为处理器,用8255接八个开关K1~K8,做电子琴按键输入,以8253控制扬声器,拨动不同的开关,发出相应的音阶。
其中K1代表静音,K2发si的音,K3发la 的音,K4发sol的音,K5发fa的音,K6发mi的音,K7发re的音,K8发do的音。
开发工具:汇编语言;DICE-8086K实验系统。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
一、课程设计目的1、通过本次课程设计加深对单片机课程的认识和掌握,对单片机的应用做进一步了解。
2、通过本次课程设计提高学生的编程能力、调试能力、文献资料查阅能力,为毕业设计和以后工作打基础。
3、学生的创新意识,巩固了解汇编语言知识并要掌握8255芯片的使用并熟悉实验系统。
4、掌握蜂鸣器的使用方法;掌握蜂鸣器的不同发音的方法。
二、实验内容1、简易电子琴原理:(1)蜂鸣器输入不同频率的方波,会发出不同的声音(2)通过按键,由单边机控制产生不同频率的方波,从而发出不同的声音。
2、实验过程(1)通过单边机,使G6区的1到7号键由低到高发出1到7的音阶。
三、功能简介本简易电子琴的设计可实现的功能如下:通过一个独立键盘可以实现对该音乐的播放和停止操作的控制。
连续按下不同的按键,可以实现乐曲的演奏。
当按下某一按键,会发出相应的音调。
DS18B20 水温控制系统

DS18B20 水温控制系统(全)上个月参加的学校的电子设计大赛,说真的,参加完除了没有感受之外,剩下的感受就是很累。
我是计算机科学与技术学院的,按道理说电子大赛和我的专业根本就不怎么挂钩,不过我还是在同学的督促下“上当”了。
学校的那个信息工程的老师很奇怪,对我们专业好像及其有偏见,也怪不得他被扯下来,不让他教书了。
对我们也是非常有意见,讲说的那天,也是专门和我们做对。
这个温度控制,是用最小系统板做的。
因为我们不会硬件电路一些焊接等。
所以就找了个系统板来做.代码用了36个小时,文档用了18个小时完成。
差不多90%都是自己做的,所以我才说累。
由于代码是汇编做的,我是用Keil来调试代码的,还好最小系统板ME300B有在线仿真功能。
不过也调试了几乎100多次。
做完这个,学校还算给面子,应付我们一个三等奖。
然后他们大赛选一批人去北京培训,然后回来参加广东省的电子大赛,呵呵,当然我是被选上了,但是我从一开始不怎么想做这个,所以我不怎么想去,后来金山公司的暑假实习培训,录取了我,所以我就爽快的拒绝了去北京的那件事。
现在我觉得自己的决定还是很明智的。
呵呵,我只想做自己喜欢做的。
单片机是今年刚刚学的,然后就可以作出这么一个东西来,我觉得自己的脑子还好,至少吸收掌握的比较快,估计和我的基础有关系吧。
但是我的兴趣仍然是高级编程,Windows编程,毕竟自己学了很久了。
不想就这么放弃。
好废话不多说了,这个文档是我花了一个小时整理到博客上的,我觉得这个博客还是非常的COOL的,竟然没有字数限制。
呵呵喜欢。
以后就用你了。
这是我第一篇发表的文章,还希望大家多多留言,提出宝贵的意见。
目录一.引言...二.设计目的...三.系统功能...四.系统设备...五.温度控制总体方案与原理...1.系统模块图...2.系统模块总关系图...六.温度转换核心及其算法...1.温度传感器DS18B20原理与特性...DSl8B20的管脚及特点...DS18B20的内部结构...DS18B20的内存结构...DS18B20的测温功能...DSl820工作过程中的协议...温度传感器与单片机通讯时序...2.温度转换算法及分析...七.硬件设计说明...1.系统总体电路图...2.各个模块电路图...输入系统...输出系统...芯片系统...八.软件设计说明...1.总模块的流程图...2.各个模块的流程图...读取温度DS18B20模块的流程...键盘扫描处理流程...九.操作指引...按键功能...显示温度...设定温度...十.参考文献...程序源代码...一.引言在一些温控系统中,广泛采用的是通过热电偶、热电阻或PN结测温电路经过相应的信号调理电路,转换成A/D转换器能接收的模拟量,再经过采样/保持电路进行A/D转换,最终送入单片机及其相应的外围电路,完成监控。
基于单片机的智能饮水机的设计毕业论文
基于单片机的智能饮水机的设计毕业论文目录前言 (4)1绪论 (6)1.1课题研究的背景 (6)1.2市场饮水机现状 (6)1.3课题研究的目的和意义 (7)1.4智能饮水机的主体功能 (8)1.5课题设计的主体容 (9)2 智能饮水机的硬件结构设计 (10)2.1智能饮水机的总体设计 (10)2.2元器件选择 (11)2.3AT89S52的主要性能 (11)2.3.1 AT89S52功能特性描述 (12)2.3.2 AT89S52晶振电路的设计 (13)2.4测温电路的设计 (14)2.4.1 DS18B20的引脚图及方框图 (14)2.4.2 DS18B20主要性能 (16)2.4.3 DS18B20功能特性描述 (16)2.4.4 DS18B20供电方式 (19)2.5主控系统 (20)2.6输入控制 (21)2.7显示部分 (22)2.8其他功能部分 (24)3 智能饮水机的软件设计 (27)3.1系统分配方式 (27)3.2主程序设计 (28)3.3各模块程序设计 (31)3.3.1 温度检测程序设计 (31)3.3.2 显示程序设计 (35)3.3.3 键盘扫描程序 (37)3.3.4 延时程序 (42)4 调试及性能分析 (43)4.1软件调试 (43)4.1.1 新建工程 (43)4.1.2 新建文本 (44)4.1.3 添加文本 (44)4.1.4 程序编译 (45)4.2硬件调试 (46)4.2.1 电源电路的仿真 (46)4.2.2 出水电路模块的仿真 (46)4.2.3 加热模块电路的仿真 (47)4.2.4 显示模块电路的仿真 (48)4.2.5 报警电路的仿真 (49)4.3性能分析 (50)结论 (50)致谢 (52)参考文献 (54)参考文献 (54)附录1 (55)附录2 (57)附录3 (58)前言随着“信息时代”的到来,作为获取信息的手段——传感器技术得到了显著的进步,其应用领域越来越广泛,对其要求越来越高,需求越来越迫切。
软考中级整体范围输入输出工具与技术的速记口诀
软考中级整体范围输入输出工具与技术的速记口诀【软考中级】整体范围:输入输出工具与技术的速记口诀一、导言在当今数字化信息大爆炸的时代,输入输出工具与技术已经成为软件开发中不可或缺的一部分。
作为软考中级考试的重要内容之一,对于输入输出工具与技术的掌握在职业发展和技能提升中具有举足轻重的地位。
我在本篇文章中将深入探讨输入输出工具与技术,并给出相应的速记口诀,以便读者能够更好地理解和记忆。
二、输入输出工具与技术的基本概念1. 输入输出的定义输入(Input):是指计算机从外部设备或者其他程序中接收数据的过程。
键盘输入、鼠标点击等。
输出(Output):是指计算机向外部设备或者其他程序传递数据的过程。
显示器输出、打印机输出等。
2. 输入输出工具与技术的分类根据数据传输的方式和特点,输入输出工具与技术可以分为传统输入输出和新型输入输出两大类。
传统输入输出:指使用传统设备完成数据传输,如键盘、鼠标、显示器、打印机等。
新型输入输出:指采用新兴技术进行数据传输,如触摸屏、虚拟现实设备、语音识别等。
三、深入探讨传统输入输出技术1. 键盘输入键盘是常用的输入设备,其速记口诀为:按键、扫描、编码、解码。
- 按键:用户触摸键盘上的按键。
- 扫描:键盘通过扫描矩阵来检测用户的按键行为。
- 编码:键盘将按键转换成数字码。
- 解码:计算机将数字码解释成对应的字符。
2. 鼠标输入鼠标是常用的指针设备,其速记口诀为:移动、点击、传输、显示。
- 移动:用户通过鼠标移动来控制光标位置。
- 点击:用户通过鼠标点击来触发命令或操作。
- 传输:鼠标将用户操作传输给计算机。
- 显示:计算机根据用户操作来显示相应的内容。
3. 显示器输出显示器是常用的输出设备,其速记口诀为:刷新、解释、缓冲、显示。
- 刷新:显示器屏幕上的图像需要不断地进行刷新。
- 解释:计算机将数据解释成图像信号。
- 缓冲:显示器会对图像数据进行缓冲处理。
- 显示:显示器将处理后的图像数据展示给用户。
单片机简易电子琴课程设计报告
单片机简易电子琴课程设计报告山东交通学院单片机原理课程设计说明书题目:简易电子琴设计院(系)别交通与物流工程学院专业物联网工程班级物联141学号140516112姓名解文博指导教师侯贻蒙二○一六年六月摘要本课题的主要内容就是用单片机实现简易电子琴的设计。
本设计的主要内容是用AT89C52单片机为核心控制元件并与键盘、扬声器等模块聚城核心主控制模块,利用所给键盘的1,2,3,4,5,6,7,8,八个键,能够发出8个不同的音调,并且要求按下按键发声。
当系统扫描到键盘上有键被按下,则快速检测出是哪一个键被按下,然后单片机的定时器被启动,发出一定频率的脉冲,该频率的脉冲经喇叭驱动电路放大滤波后,就会发出相应的音调。
如果在前一个按下的键发声的同时有另一个键被按下,则启用中断系统,前面键的发音停止,转到后按的键的发音程序,发出后按的键的音调。
先根据要求设计硬件电路和编写相应的程序,然后进行仿真调试,最后细心焊接硬件电路图,将程序烤入芯片中,最终达到设计目的。
本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
关键词:单片机,按键,音阶,扬声器1设计的目的和意义单片机(单片微型计算机)是大规模集成电路技术发展的产物,具有高性能、高速度、体积小、价格低廉、稳定可靠等特点。
单片机的应用相当广泛,从平常的家用电器到航空航天系统和国防军事、尖端武器都能找到它的身影。
因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。
音乐随着人们的生活水平也逐步提高已经成为了我们生活中很重要的一部分,在工作和学习之余,欣赏音乐不仅使身心得到放松,同时也提高人们的精神品质和个人素养。
当代,爱好音乐的年轻人越来越多,也有不少人自己练习弹奏乐器,作为业余爱好和一种放松的手段,鉴于一些乐器学习难度大需花费太多精力,且其价格太过于高昂,使得一部分有这种想法的人不得不放弃这种想法,而电子琴又是一种新型的键盘乐器,它是现代电子科技与音乐结合的产物,价格相对便宜,能够满足一般爱好者的需求,因此,在现代音乐中扮演着重要的角色。
电容式感应触摸芯片功能说明
触控焊盘自身存在一个分布电容。当手指或者其它物体接近触控焊盘时,触 控焊盘周围的环境(地)改变,导致其分布电容发生变化。这种变化由触控芯片 内部的专用电路转换成频率信号后,交给芯片内部软件处理,而后作出相应的控 制动作。
3、特征
1> 最多支持 8 通道触摸按键 2> 输出可选择为 IIC 或者一对一接口(1 脚选择) 3> 一对一接口下灵敏度端口电容细调,外部电阻 6 级粗调 , IIC 下内部寄存器设置, 4> 端口内部集成电阻,可省略串入电阻 5> 单多按键模式,长短按时间内部寄存器可设置 6> 上电 0.5S 快速初始化 7> 可过电流注入 10V、电子群脉冲 4KV、静电 15KV(非接触)测试 8> 防尘、防水、环境改变自动校准
7 IIC 通信
7.1 开始与停止
7.2 从机地址
7.3 写数据
7.4 读数据
7.5 数据传输注意事项 1,发送数据必须一次全部写入共 17 字节数据。16 字节(0xD0~0xDF)+1 字节校验和,单字节写入和校验码错误写入数据都会被丢弃; 2,传输速率<100K; 3,SDA/SCL 线均需要设置为开漏接口,输出高为外部电阻上拉产生。 输出低,芯片直接拉低。 4,从机(YS8XX)忙碌时 SCL 为低电平,此期间主机不可传输数据。 主机传输数据前,检查 SCL 为高,才能传输下一个数据。
读
按键数量
1-24Key
读
EEPROM 状态 Bit7=1 资料错误 Bit2=1 忙碌
保留
读
按键输出
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
08H K8 K7 K6 K5 K4 K3 K2 K1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVR,PIC,甚至是ARM平台上面测试这个程马加爵序性能。
当然,我自己也是在多个项目用过,效果非常好的。
好了,工程人员的习惯,废话就应该少说,开始吧。
核心算法:unsigned char Trg;unsigned char Cont;void KeyRead( void ){unsigned char ReadData = PINB^0xff; // 1Trg = ReadData & (ReadData ^ Cont); // 2 Cont = ReadData; // 3}完了。
有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!!下面是程序解释:Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。
1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。
2:算法1,用来计算触发变量的。
一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。
3:算法2,用来计算连续变量。
看到这里,有种“知其然,不知其所以然”的感觉吧?代码很简单,但是它到底是怎么样实现我们的目的的呢?好,下面就让我们绕开云雾看青天吧。
我们最常用的按键接法如下:AVR是有内部上拉功能的,但是为了说明问题,我是特意用外部上拉电阻。
那么,按键没有按下的时候,读端口数据为1,如果按键按下,那么端口读到0。
下面就看看具体几种情况之下,这算法是怎么一回事。
(1)没有按键的时候端口为0xff,ReadData读端口并且取反,很显然,就是0x00 了。
Trg = ReadData & (ReadData ^ Cont); (初始状态下,Cont也是为0的)很简单的数学计算,因为ReadD ata为0,则它和任何数“相与”,结果也是为0的。
Cont = ReadData; 保存Cont 其实就是等于ReadDat a,为0;结果就是:ReadData =0;Trg =0;Cont =0;(2)第一次PB0按下的情况端口数据为0xfe,ReadData读端口并且取反,很显然,就是0x01 了。
Trg = ReadData & (ReadData ^ Cont); 因为这是第一次按下,所以Cont是上次的值,应为为0。
那么这个式子的值也不难算,也就是Trg = 0x01 & (0x01^ 0x00) = 0x01Cont = ReadData = 0x01;结果就是:ReadData =0x01;Trg =0x01;Trg只会在这个时候对应位的值为1,其它时候都为0Cont =0x01;(3)PB0按着不松(长按键)的情况端口数据为0xfe,ReadData读端口并且取反是0x01 了。
Trg = ReadData & (ReadData ^ Cont); 因为这是连续按下,所以Cont是上次的值,应为为0x01。
那么这个式子就变成了Trg = 0x01 & (0x01^0x01) = 0 x00Cont = ReadData = 0x01;结果就是:ReadData =0x01;Trg =0x00;Cont =0x01;因为现在按键是长按着,所以MCU会每个一定时间(20 ms左右)不断的执行这个函数,那么下次执行的时候情况会是怎么样的呢?ReadData =0x01;这个不会变,因为按键没有松开Trg =ReadData & (ReadData ^ Cont) =0x01& (0x01 ^ 0x01) = 0 ,只要按键没有松开,这个Tr g值永远为0 !!!Cont =0x01;只要按键没有松开,这个值永远是0x0 1!!(4)按键松开的情况端口数据为0xff,ReadData读端口并且取反是0x00 了。
Trg = ReadData & (ReadData ^ Cont) = 0x00 & (0x00^0x01) = 0x00Cont = ReadData = 0x00;结果就是:ReadData =0x00;Trg =0x00;Cont =0x00;很显然,这个回到了初始状态,也就是没有按键按下的状态。
总结一下,不知道想懂了没有?其实很简单,答案如下:Trg 表示的就是触发的意思,也就是跳变,只要有按键按下(电平从1到0的跳变),那么Trg在对应按键的位上面会置一,我们用了PB0则Trg的值为0x01,类似,如果我们PB7按下的话,Trg 的值就应该为0x80 ,这个很好理解,还有,最关键的地方,Trg 的值每次按下只会出现一次,然后立刻被清除,完全不需要人工去干预。
所以按键功能处理程序不会重复执行,省下了一大堆的条件判断,这个可是精粹哦!!Cont代表的是长按键,如果PB0按着不放,那么Cont的值就为0x01,相对应,PB7按着不放,那么Cont的值应该为0x80,同样很好理解。
如果还是想不懂的话,可以自己演算一下那两个表达式,应该不难理解的。
因为有了这个支持,那么按键处理就变得很爽了,下面看应用:应用一:一次触发的按键处理假设PB0为蜂鸣器按键,按一下,蜂鸣器beep的响一声。
这个很简单,但是大家以前是怎么做的呢?对比一下看谁的方便?#define KEY_BEEP 0x01void KeyProc(void){if (Trg & KEY_BEEP) // 如果按下的是KEY_BEE P{Beep(); // 执行蜂鸣器处理函数}}怎么样?够和谐不?记得前面解释说Trg的精粹是什么?精粹就是只会出现一次。
所以你按下按键的话,Trg & KEY_BEEP 为“真”的情况只会出现一次,所以处理起来非常的方便,蜂鸣器也不会没事乱叫,hoh o~~~或者你会认为这个处理简单,没有问题,我们继续。
应用2:长按键的处理项目中经常会遇到一些要求,例如:一个按键如果短按一下执行功能A,如果长按2秒不放的话会执行功能B,又或者是要求3秒按着不放,计数连加什么什么的功能,很实际。
不知道大家以前是怎么做的呢?我承认以前做的很郁闷。
但是看我们这里怎么处理吧,或许你会大吃一惊,原来程序可以这么简单,这里举个简单例子,为了只是说明原理,PB0是模式按键,短按则切换模式,P B1就是加,如果长按的话则连加(玩过电子表吧?没错,就是那个!)#define KEY_MODE 0x01 // 模式按键#define KEY_PLUS 0x02 // 加void KeyProc(void){if (Trg & KEY_MODE) // 如果按下的是KEY_MO DE,而且你常按这按键也没有用,{ //它是不会执行第二次的哦,必须先松开再按下Mode++; // 模式寄存器加1,当然,这里只是演示,你可以执行你想// 执行的任何代码}if (Cont & KEY_PLUS) // 如果“加”按键被按着不放{cnt_plus++; // 计时if (cnt_plus > 100) // 20ms*100 = 2S 如果时间到{Func(); // 你需要的执行的程序}}}不知道各位感觉如何?我觉得还是挺简单的完成了任务,当然,作为演示用代码。
应用3:点触型按键和开关型按键的混合使用点触形按键估计用的最多,特别是单片机。
开关型其实也很常见,例如家里的电灯,那些按下就不松开,除非关。
这是两种按键形式的处理原理也没啥特别,但是你有没有想过,如果一个系统里面这两种按键是怎么处理的?我想起了我以前的处理,分开两个非常类似的处理程序,现在看起来真的是笨的不行了,但是也没有办法啊,结构决定了程序。
不过现在好了,用上面介绍的办法,很轻松就可以搞定。
原理么?可能你也会想到,对于点触开关,按照上面的办法处理一次按下和长按,对于开关型,我们只需要处理Cont就OK了,为什么?很简单嘛,把它当成是一个长按键,这样就找到了共同点,屏蔽了所有的细节。
程序就不给了,完全就是应用2的内容,在这里提为了就是说明原理~~好了,这个好用的按键处理算是说完了。
可能会有朋友会问,为什么不说延时消抖问题?哈哈,被看穿了。
果然不能偷懒。
下面谈谈这个问题,顺便也就非常简单的谈谈我自己用时间片轮办法,以及是如何消抖的。
延时消抖的办法是非常传统,也就是第一次判断有按键,延时一定的时间(一般习惯是20ms)再读端口,如果两次读到的数据一样,说明了是真正的按键,而不是抖动,则进入按键处理程序。
当然,不要跟我说你delay(20)那样去死循环去,真是那样的话,我衷心的建议你先放下手上所有的东西,好好的去了解一下操作系统的分时工作原理,大概知道思想就可以,不需要详细看原理,否则你永远逃不出“菜鸟”这个圈子。
当然我也是菜鸟。
我的意思是,真正的单片机入门,是从学会处理多任务开始的,这个也是学校程序跟公司程序的最大差别。
当然,本文不是专门说这个的,所以也不献丑了。
我的主程序架构是这样的:volatile unsigned char Intrcnt;void InterruptHandle() // 中断服务程序{Intrcnt++; // 1ms 中断1次,可变}void main(void){SysInit();while(1) // 每20ms 执行一次大循环{KeyRead(); // 将每个子程序都扫描一遍KeyProc();Func1();Funt2();……while(1){if (Intrcnt>20) // 一直在等,直到20ms时间到{Intrcnt="0";break; // 返回主循环}}}}貌似扯远了,回到我们刚才的问题,也就是怎么做按键消抖处理。
我们将读按键的程序放在了主循环,也就是说,每20ms我们会执行一次KeyRead()函数来得到新的Trg 和Cont 值。
好了,下面是我的消抖部分,很简单,基本架构如上,我自己比较喜欢的,一直在用。
当然,和这个配合,每个子程序必须执行时间不长,更加不能死循环,一般采用有限状态机的办法来实现,具体参考其它资料咯。
懂得基本原理之后,至于怎么用就大家慢慢思考了,我想也难不到聪明的工程师们。
例如还有一些处理,怎么判断按键释放?很简单,Trg 和Cont都为0 则肯定已经释放了。
在这个基础上再增加一个按键释放检测功能,程序如下:volatile unsigned char Trg;volatile unsigned char Cont;volatile unsigned char Release;// 再增加新功能!void KeyRead( void ){unsigned char ReadData = PINB^0xff; // 1 读键值Trg = ReadData & (ReadData ^ Cont); // 2得到按下触发值Release= (ReadData ^ Trg ^ Cont); // 3 得到释放触发值Cont = ReadData; // 4 得到所有未释放的键值}。