基于AT89C51的电子琴设计

上传人:仙*** 文档编号:28055123 上传时间:2021-08-23 格式:DOC 页数:43 大小:811.50KB
收藏 版权申诉 举报 下载
基于AT89C51的电子琴设计_第1页
第1页 / 共43页
基于AT89C51的电子琴设计_第2页
第2页 / 共43页
基于AT89C51的电子琴设计_第3页
第3页 / 共43页
资源描述:

《基于AT89C51的电子琴设计》由会员分享,可在线阅读,更多相关《基于AT89C51的电子琴设计(43页珍藏版)》请在装配图网上搜索。

1、等级:湖南工程学院课 程 设 计课程名称 单片机原理与应用 课题名称 电子琴 专 业 电气工程 班 级 1005班 学 号 姓 名 指导教师 2013 年 6 月 21 日湖南工程学院课 程 设 计 任 务 书课程名称 单片机原理与应用 课 题 电子琴 专业班级 电气工程1005 学生姓名 学 号 指导老师 审 批 任务书下达日期 2013 年 6 月 8 日任务完成日期 2013 年 6 月 21 日设计内容与设计要求设计内容:本课题以单片机为核心,设计和制作一个电子琴。要求由4X4组成16个按钮矩阵,设计成16个音,可随意弹奏想要表达的音乐。设计要求:1. 设计方案要合理、正确;2. 系统

2、硬件设计;3. 完成必要元器件选择;4. 系统软件设计及调试;5. 写出设计报告。主 要 设 计 条 件1. MCS-51单片机实验操作台1台;2. PC机及单片机调试软件;3. 单片机应用系统板1套;4. 制作工具1套;5. 系统设计所需的元器件。说 明 书 格 式1. 封面2. 课程设计任务书3. 目录4. 系统总体方案设计5. 系统硬件设计6. 软件设计(包括流程图)7. 系统的安装调试说明8. 总结 9. 参考文献10. 附录11. 课程设计成绩评分表。 进 度 安 排第一周星期一、上午:布置课题任务,课题介绍及讲课。 下午:借阅有关资料,总体方案讨论。星期二、确定总体方案,学习与设计

3、相关内容。星期三、各部分方案设计。星期四、各部分设计。星期五、设计及上机调试。第二周星期一:设计及上机调试。星期二:调试,中期检查。星期三:调试、写说明书。星期四-星期五上午:写说明书、完成电子版并打印成稿。 星期五下午:答辩。参 考 文 献1.单片机原理与应用 王迎旭等编 机械工业出版社2.51系列单片机设计实例 楼然苗等编 北京航空航天大学出版社3.计算机硬件技术基础实验教程 黄勤等编 重庆大学出版社4.微型计算机接口技术及应用 刘乐善主编 华中科技大学出版社5.单片微型计算机原理及接口技术陈光东等 华中科技大学出版社目 录第1章 课题设计的背景、要求及目的11.1课题设计的背景11.2课

4、题设计的要求11.3课题设计的目的2第2章 系统总体方案选择与说明22.1 系统方案综述22.2 系统设计思路32.3 系统设计方案3第3章 系统框图与工作原理及芯片介绍43.1 系统硬件电路设计框图43.2 工作原理43.3 芯片介绍5第4章 各硬件电路的设计说明64.1 按键模块的设计74.2 蜂鸣器模块的设计84.3电源部分及其他附属模块的设计8第5章 系统软件设计95.1 系统软件方案的设计95.2 系统程序的设计10设计总结15参考文献16附录A 系统硬件电路原理图17附录B 程序设计数据18第1章 课题设计的背景、要求及目的1.1课题设计的背景 电子计算机的发展经历了从电子管、晶体

5、管、中小规模集成电路到大规模集成电路四个阶段,尤其是随着大规模的集成电路技术的飞速发展,在20世纪70年代初诞生的单片微型计算机,使得计算机应用日益广泛。而单片微型计算机(简称单片机)的问世,更进一步推动了计算机应用技术的发展,标志着计算机系统两大部分的正式形成,即通用计算机系统和嵌入式计算机系统。前者主要以发展海量、高速数值计算为趋势,后者则主要实现面向对象的实时控制。 单片微型计算机是大规模集成电路技术发展的产物,属于第四代电子计算机它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。他的应用必定导致传统的控制技术从根本上发生变革。因此,单片机的开发应用已成为高科技和工程领域

6、的一项重大课题。 电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。本文的主要内容是用AT89C51单片机为核心控制元件,设计一个电子琴。以单片机作为主控核心,与键盘扬声器等模块组成核心主控制模块,在主控模块上设有16个按键,设计成16个音,可随意弹奏想要表达的音乐。因此,我们只要把一首歌曲的音阶对应频率关系编写正确就可以达到我们想要的曲目。1.2课题设计的要求 本课题以单片机为核心,设计和制作一个电子琴。要求由4X4组成16个按钮矩阵,设计成16个音,可随意弹

7、奏想要表达的音乐。1.3课题设计的目的 1、能够对电子电路、电子元器件、印制电路板等方面的知识有进一步的认识,独立对其进行测试与检查。 2、熟悉AT89C51单片机的内部结构和功能,合理使用其内部寄存器,能够完成相关软件编程设计工作。 3、为实现预期功能,能够对系统进行快速的调试,并能够对出现的功能故障进行分析,及时修改相关软硬件。 4、对软件编程、排错调试、相关软件的使用技能等方面得到较全面的锻炼和提高。 5、理解音乐产生的原理和编码键盘扫描方法以及单片机内部定时器的溢出中断编程方法。 6、本次课程设计从硬件和软件两个方面入手,全面具体地掌握设计思路、方法和过程,使理论与实际相结合,充分地锻

8、炼了动手能力和思维扩展能力。第2章 系统总体方案选择与说明2.1 系统方案综述 从系统实现的功能上来看,简易电子琴的课程设计主要是手动按键弹奏乐曲。手动弹奏乐曲是根据具体的硬件键盘设置功能键实现音谱的各个音。 从系统硬件结构上来看,我们主要使用到51系列单片机、矩阵16键输入电路、蜂鸣器以及电源电路等等。将这些硬件电路有机地结合起来使之满足简易电子琴的实现硬件需要。 从系统软件设计角度来看,将简易电子琴的课程设计采用程序模块化设计方法,将程序分为主程序、键盘扫描程序模块、音乐产生模块等等。此外,采用程序设计思想、外部按键方式,来实现可手动弹奏乐曲。 因此,我们可以综合上述的方案设计原理,从软件

9、和硬件两部分进行有计划有步骤的系统分析和设计。2.2 系统设计思路 1、手动弹奏乐曲用编码的矩形键盘来实现,手动弹奏乐曲中矩阵键盘的16个键分别设置不同的音符。 2、软件的设计主要包括无符号音符的定义、矩形键盘键值的读取和手动弹奏乐曲控制程序。 3、此次程序设计主要是手动弹奏乐曲程序控制。而音符的在程序的开始就被定义好了,只要在控制程序中调用即可。2.3 系统设计方案2.3.1 播放模块 播放模块是由扩音器接单片机控制引脚P3.7构成,中间接限流电阻以及PNP三极管,且它几乎不存在噪声,音响效果较好,而且由于所需驱动功率较小,且价格低廉,所以,被广泛应用。2.3.2 按键控制模块 电子琴设有1

10、6个按键, 16个按键分别代表16个音符,包括中音段的全部音符,通过软硬件设计,然后通过查询电子琴所按下的按键,读取电子琴按键的输入状态,跳转到对应的程序入口,实现自编歌曲的。2.3.3 键盘扫描程序 检测是否有键按下,有键按下则记录按下键的键值,并跳转至功能转移程序;无键按下,则返回键盘扫描程序继续检测。2.3.4 功能转移程序 对检测到得按键值进行判断,是琴键则跳转至琴键处理程序,是功能键则跳转至相应的功能程序,我们设计的功能程序有两种,即音色调节功能。第3章 系统框图与工作原理及芯片介绍3.1 系统硬件电路设计框图 基于单片机系统电子琴的基本结构如下图图3.1 系统框图3.2 工作原理

11、1、演奏音乐原理:通过控制单片机程序首先设置的音符,通过控制程序调用,以及通过程序判断是否有按键按下来经放大后驱动蜂鸣器是否发出不同音节的声音。用软件延时来控制发音时间的长短,控制节拍。把乐谱的音符和相应的节拍变换为定时常数和延时常数,作为数据表格存放在存储器中,由程序到这量常数和延时常数。另单片机晶振频率为12MHZ。 2、键盘扫描原理:先将44矩阵键盘的行和列全部置为高电平,然后再逐行置为低电平,当有键按下时P1口的值会发生相应的改变,通过与给定数的比较,判定是否有键按下和是否键已松开。并给定列号,根据所给的列号的值,一方面给单片机送入确定好的数值,即发出相应音符音,从而来达到谱乐谱的目的

12、。3.3 芯片介绍 (1)在本次电子琴设计中,我所用的单片机芯片选用了AT89C51型号的芯片, 89C51系列的兼容性也比较好。P3口也可作为AT89C51的一些特殊功能口,如下表所示:P3口引脚特殊功能P3.0RXD(串行输入口)P3.1TXD(串行输出口)P3.2(外部中断0)P3.3(外部中断1)P3.4T0(定时器0外部输入)P3.5T1(定时器1外部输入)P3.6WR(外部数据存储器写选通)P3.7RD(外部数据存储器读先通)(2)p3.7口音频输出,接一个喇叭。(3)复位电路我们本来在方案选择的时候有两种选择的,上电复位和按扭复位,上电复位是利用电容充电来实现的,而按扭复位是电源

13、对外节电容的充电使RST为高电平,复位松开后,电容通过下拉电阻放电,使RST恢复低电平。为了功能的完美我还是选择用上电自动复位,因为它比较方便,不需要人另外去操作。第4章 各硬件电路的设计说明由于时间原因,本次所设计硬件电路以及程序只经过了仿真软件测试,而没有去单片机实验室去用单片机试验箱去测试程序。4.1 按键模块的设计图4.1.1 按键电路上图为硬件系统的16键44的矩阵式键盘电路逻辑图,键盘的行线连接到P1.0-P1.3口上,列线连接到P1.4-P1.7口上,单片机通过逐行扫描的方法对键盘进行扫描,读取判断有无键被按下以及按键的位置。为了判断有没有键被按下,可先经输出口向所有列线输出高电

14、平然后在输出各行状态。若行线状态皆为高电平则表明无键被按下;若行线状态中有低电平就表示有键被按下,然后再根据接通的行线和列线判定按键的位置。当经扫描表明有键被按下后,紧接着就是进行去抖动处理,抖动时间的长短与键的机械特性有关,一般为10-20ms。4.2 蜂鸣器模块的设计图4.2.1扩音电路 电磁式蜂鸣器由振荡器、电磁线圈、磁铁振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。本系统设计的蜂鸣器通过驱动电路与单片机的P3.7连接,单片机就可以通过P3.7的输出信号进行控制。4.3电源部分及其他附属

15、模块的设计图4.3.1 上电复位电路 对输入电路产生的电源我们的要求是稳定在5V左右,保证单片机的正常工作。 复位是单片机的初始化操作,其作用是使CPU和系统中其他部件都处于一个确定的初始状态,并从这个状态开始工作。本系统采用上电与按键复位电路,为了防止干扰串扰复位端,所以再接一个去耦电容。 晶振电路的设计可以两个电容与一个晶振即可,用来产生一个约等于12MHZ的稳定的频率。第5章 系统软件设计5.1 系统软件方案的设计 进行应用软件设计时可采用模块化设计,其优点是:(1)每个模块的程序结构简单,任务明确,易于编写、调试和修改;(2)程序可读性好,对程序的修改可局部进行,其他部分可以保持不变,

16、便于功能的扩充和版本的升级;(3)对于使用频繁的子程序可以建立子程序库,便于多个模块调用;(4)便于进行程序的编写和修改调试工作,加快软件的研制进度。 根据设计要求,首先要确定软件设计方案,即确定该软件应该完成哪些功能;其次是规划这些功能需要分成多少个功能模块,以及每一个程序模块的具体任务是什么。其系统的软件设计的模块应该遵循下述原则: (1) 每个模块应具备独立的功能,能产生一个明确的结果。 (2) 模块之间的控制参数应尽量简单,数据参数应尽量少。控制参数是指模块进入和退出的条件及方式,数据参数是指模块间信息的交换方式、交换量的多少及交换的频繁程度。 (3) 模块的长度适中。模块语句的长度要

17、始终,模块太长,调试和分析会有难度;模块太短,信息交换太过频繁,不利于模块功能的体现 系统的结构模块图如下所示:主程序模块手动弹奏乐曲模块功能转换模块音乐播放模块5.2 系统程序的设计 系统主程序的功能是进行端口定义,以及各个音符的无符号定义,这样方便程序的调用.5.2.1主程序设计如下#include#include SoundPlay.h#define uchar unsigned char#define uint unsigned int#define cnt_delay_cnt1 25 /按键去抖动延时阀值#define cnt_delay_cnt2 5 /按键行输出信号稳定的小延时阀

18、值unsigned int dleay_time1;/*各个按键的音调*/unsigned char code Music_Code_1= 0x15,0x02, 0x00,0x00;unsigned char code Music_Code_2= 0x16,0x02, 0x00,0x00;unsigned char code Music_Code_3= 0x17,0x02, 0x00,0x00;unsigned char code Music_Code_4= 0x18,0x02, 0x00,0x00;unsigned char code Music_Code_5= 0x19,0x02, 0x0

19、0,0x00;unsigned char code Music_Code_6= 0x1A,0x02, 0x00,0x00;unsigned char code Music_Code_7= 0x1B,0x02, 0x00,0x00;unsigned char code Music_Code_8= 0x0B,0x02, 0x00,0x00;unsigned char code Music_Code_9= 0x0C,0x02, 0x00,0x00;unsigned char code Music_Code_10=0x0D,0x02, 0x00,0x00;unsigned char code Musi

20、c_Code_11=0x0E,0x02, 0x00,0x00;unsigned char code Music_Code_12=0x0F,0x02, 0x00,0x00;unsigned char code Music_Code_13=0x10,0x02, 0x00,0x00;unsigned char code Music_Code_14=0x11,0x02, 0x00,0x00;unsigned char code Music_Code_15=0x15,0x03, 0x00,0x00;unsigned char code Music_Code_16=0x16,0x03, 0x00,0x00

21、;unsigned char key_step=1;/按键扫描步骤变量,在switch()语句的括号里unsigned int delay_cnt2=0; /延时计数器的变量unsigned char key_lock1=0; /按键自锁标志unsigned int delay_cnt1=0; /延时计数器的变量uchar key_sec;sbit key_dr1= P10; /4X4按键行输出sbit key_dr2= P11; /4X4按键行输出sbit key_dr3= P12; /4X4按键行输出sbit key_dr4= P13; /4X4按键行输出sbit key_sr1= P14

22、; /4X4按键行输入sbit key_sr2= P15; /4X4按键行输入sbit key_sr3= P16 ; /4X4按键行输入sbit key_sr4= P17; /4X4按键行输入5.2.2主函数程序的设计/*主函数*/void main() InitialSound(); /初始化播发器 key_lock1=0; while(1) key_scan(); switch(key_sec) case 1: Play(Music_Code_1,0,3,360); key_sec=0; break; case 2: Play(Music_Code_2,0,3,360); key_sec=

23、0; break; case 3: Play(Music_Code_3,0,3,360); key_sec=0; break;case 4: Play(Music_Code_4,0,3,360); key_sec=0; break; case 5: Play(Music_Code_5,0,3,360); key_sec=0; break; case 6: Play(Music_Code_6,0,3,360); key_sec=0; break; case 7: Play(Music_Code_7,0,3,360); key_sec=0; break;case 8: Play(Music_Cod

24、e_8,0,3,360); key_sec=0; break;case 9: Play(Music_Code_9,0,3,360); key_sec=0; break; case 10: Play(Music_Code_10,0,3,360); key_sec=0; break;case 11: Play(Music_Code_11,0,3,360); key_sec=0; break; case 12: Play(Music_Code_12,0,3,360); key_sec=0; break; case 13: Play(Music_Code_13,0,3,360); key_sec=0;

25、 break;case 14: Play(Music_Code_14,0,3,360); key_sec=0; break; case 15: Play(Music_Code_15,0,3,360); key_sec=0; break; case 16: Play(Music_Code_16,0,3,360); key_sec=0; break; 设计总结 由于我以前专科阶段上过C语言版的单片机课程,相对于本学期的所学的汇编语言,我觉得C语言版的更容易接受,所以本次课程设计我选用C编程。 经过这两周的单片机课程设计对我获益匪浅,让我重新系统性地认识和掌握了单片机技术,让我将平常学的C语言和编程

26、方法学以致用,使我的C语言能力有了很大提高和进步,让我对单片机外围接口设备有了深入细致的了解。 由于课程设计安排跟我个人的很多事情安排起冲突,所以课程设计的主要完成是在第二周。一开始,我在网上寻找有关的资料和仔细读懂老师设计任务书从而研究设计方案,进行设计的总体规划,理清课程设计思路。但是将这些具体的方案落实到每一个设计环节和步骤中,难免会出现意想不到错误,这就需要我们在进行设计的过程中利用所掌握的知识认真排查错误原因,多方面的思考问题的关键不断地改正自己的设计不足之处和错误。 此外,对硬件电路的工作原理和单片机知识的掌握是进行下一步的软件设计的关键。这次课程设计能顺利的完成任务很大程度上是因

27、为在软件设计之前对硬件的设计及工作原理有了细致的了解。 在进入了软件设计方案和具体的编程和调试运行阶段。在这个阶段中,对系统的需求分析和如何采用模块化设计思想是设计方案主要解决的问题,通过不断地设计尝试和反复地设计调试初步解决了问题。但是也存在了设计上的不足之处,即如何实现自动音乐播放的暂停和断点播放,在在我设计初期,希望能另外实现16个音乐的播放的自我播放和按键暂停,在采用了这样的设计方法上在原理上可以行得通,但是由于难度太大,以及个人的水平问题,最后放弃了这个设想。最后,现在经过两周后,经过实践的操作和调试,对单片机软件都有了更深的了解。通过设计,巩固之前所学课程,使所学知识牢固掌握并灵活

28、运用。在整个课程设计中,我的指导老师寻大勇老师给予很多指导性的意见。软件设计和仿真过程中,刘其涛同学也帮助我解决了一些实际问题。本次课程设计必将成为自己以后学习道路上的宝贵的实践经验。参考文献1、王迎旭编单片机原理与应用机械工业出版社.2、周向红 编51系列单片机应用与实践教程北航出版社3、楼然苗编51系列单片机设计实例 北航出版社.4、黄勤编计算机硬件技术基础实验教程重庆大学出版社5、刘乐善编微型计算机接口技术及应用华中科技大学出版社.6、陈光东编单片微型计算机原理及接口技术华中科技大学出版社。附录A 系统硬件电路原理图附录B 程序设计数据#include#include SoundPlay

29、.h#define uchar unsigned char#define uint unsigned int#define cnt_delay_cnt1 25 /按键去抖动延时阀值#define cnt_delay_cnt2 5 /按键行输出信号稳定的小延时阀值unsigned int dleay_time1;/*各个按键的音调*/unsigned char code Music_Code_1= 0x15,0x02, 0x00,0x00;unsigned char code Music_Code_2= 0x16,0x02, 0x00,0x00;unsigned char code Music_

30、Code_3= 0x17,0x02, 0x00,0x00;unsigned char code Music_Code_4= 0x18,0x02, 0x00,0x00;unsigned char code Music_Code_5= 0x19,0x02, 0x00,0x00;unsigned char code Music_Code_6= 0x1A,0x02, 0x00,0x00;unsigned char code Music_Code_7= 0x1B,0x02, 0x00,0x00;unsigned char code Music_Code_8= 0x0B,0x02, 0x00,0x00;u

31、nsigned char code Music_Code_9= 0x0C,0x02, 0x00,0x00;unsigned char code Music_Code_10=0x0D,0x02, 0x00,0x00;unsigned char code Music_Code_11=0x0E,0x02, 0x00,0x00;unsigned char code Music_Code_12=0x0F,0x02, 0x00,0x00;unsigned char code Music_Code_13=0x10,0x02, 0x00,0x00;unsigned char code Music_Code_1

32、4=0x11,0x02, 0x00,0x00;unsigned char code Music_Code_15=0x15,0x03, 0x00,0x00;unsigned char code Music_Code_16=0x16,0x03, 0x00,0x00;unsigned char key_step=1;/按键扫描步骤变量,在switch()语句的括号里unsigned int delay_cnt2=0; /延时计数器的变量unsigned char key_lock1=0; /按键自锁标志unsigned int delay_cnt1=0; /延时计数器的变量uchar key_sec

33、;sbit key_dr1= P10; /4X4按键行输出sbit key_dr2= P11; /4X4按键行输出sbit key_dr3= P12; /4X4按键行输出sbit key_dr4= P13; /4X4按键行输出sbit key_sr1= P14; /4X4按键行输入sbit key_sr2= P15; /4X4按键行输入sbit key_sr3= P16 ; /4X4按键行输入sbit key_sr4= P17; /4X4按键行输入/*/*/void DelayUs(unsigned char us)/delay us unsigned char uscnt; uscnt=us

34、1;/* Crystal frequency in 12MHz*/ while(-uscnt);/*/void DelayMs(unsigned char ms)/delay Ms while(-ms) DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); void key_scan() /按键扫描函数 /补充说明:如果中断一次就把所有的按键都扫描完,中断占用的时间片就会太多,势/必会影响main函数里其他子程序的运行,为了避免一口气把所/的按键都扫描完,此/处用switch语句把4个按键分成2等分,一次中断只扫描2个按键switch(

35、key_step) /按键扫描步骤, case 1: /扫描1号键,2号键 key_dr1=0; /按键行扫描输出第一行低电平 key_dr2=1;key_dr3=1;key_dr4=1; delay_cnt2=0; /延时计数器清零 key_step+; /切换到下一个运行步骤 break; case 2: delay_cnt2+; if(delay_cnt2cnt_delay_cnt2) /小延时,但不是去抖动延时,替代一直受网友争议的delay1(40) delay_cnt2=0; key_step+; /切换到下一个运行步骤 break; case 3: if(key_sr1=1&ke

36、y_sr2=1&key_sr3=1&key_sr4=1) /如果没有按键按下,则2个IO输入都是高电平 key_step+; /如果没有按键按下,下一个中断扫描下2个/按键key_lock1=0; /按键自锁标志清零 delay_cnt1=0; /按键去抖动延时计数器清零,此行非常巧妙 else if(key_sr1=0&key_sr2=1&key_sr3=1&key_sr4=1&key_lock1=0) / key_lock1按键自锁,避免按键一直触发,下降沿有效 +delay_cnt1; /延时计数器 if(delay_cnt1cnt_delay_cnt1) /延时计数器超过一定的数值 d

37、elay_cnt1=0;key_lock1=1; /自锁按键置位,避免一直触发,只有松开按键,/此标志位才会被清零(经典) key_sec=1; /触发1号键dleay_time1 = 0; / 自锁计数延时/led1 = 0; / 有按键按下,打开背光灯/dleay_time3 =0; / 背光灯延时计数器 清零 else if(key_sr1=1&key_sr2=0&key_sr3=1&key_sr4=1&key_lock1=0) +delay_cnt1; if(delay_cnt1cnt_delay_cnt1) delay_cnt1=0;key_lock1=1; /自锁按键置位,避免一直

38、触发 key_sec=2; /触发2号键dleay_time1 = 0; / 自锁计数延时 / led1 = 0; / 有按键按下,打开背光灯 /dleay_time3 =0; / 背光灯延时计数器 清零 else if(key_sr1=1&key_sr2=1&key_sr3=0&key_sr4=1&key_lock1=0) +delay_cnt1; if(delay_cnt1cnt_delay_cnt1) delay_cnt1=0;key_lock1=1; /自锁按键置位,避免一直触发 key_sec=3; /触发3号键dleay_time1 = 0; / 自锁计数延时 / led1 = 0

39、; / 有按键按下,打开背光灯 /dleay_time3 =0; / 背光灯延时计数器 清零 else if(key_sr1=1&key_sr2=1&key_sr3=1&key_sr4=0&key_lock1=0) +delay_cnt1; if(delay_cnt1cnt_delay_cnt1) delay_cnt1=0;key_lock1=1; /自锁按键置位,避免一直触发 key_sec=4; /触发4号键dleay_time1 = 0; / 自锁计数延时 / led1 = 0; / 有按键按下,打开背光灯 /dleay_time3 =0; / 背光灯延时计数器 清零 break; ca

40、se 4: /扫描/扫描3号键,4号键 key_dr1=1; key_dr2=0; /按键行扫描输出第二行低电平key_dr3=1;key_dr4=1; delay_cnt2=0; /延时计数器清零 key_step+; /切换到下一个运行步骤 break; case 5: delay_cnt2+; if(delay_cnt2cnt_delay_cnt2) /小延时,但不是去抖动延时,替代一直受网友争议的delay1(40) delay_cnt2=0; key_step+; /切换到下一个运行步骤 break; case 6: if(key_sr1=1&key_sr2=1&key_sr3=1&

41、key_sr4=1) /如果没有按键按下,则2个IO输入都是高电平 key_step+; /如果没有按键按下,下一个中断扫描下2个按键key_lock1=0; /按键自锁标志清零 delay_cnt1=0; /按键去抖动延时计数器清零,此行非常巧妙 else if(key_sr1=0&key_sr2=1&key_sr3=1&key_sr4=1&key_lock1=0) / key_lock1按键自锁,避免按键一直触发,下降沿有效 +delay_cnt1; /延时计数器 if(delay_cnt1cnt_delay_cnt1) /延时计数器超过一定的数值 delay_cnt1=0;key_loc

42、k1=1; /自锁按键置位,避免一直触发,只有松开按键,/此标志位才会被清零 key_sec=5; /触发1号键dleay_time1 = 0; / 自锁计数延时/led1 = 0; / 有按键按下,打开背光灯/dleay_time3 =0; / 背光灯延时计数器 清零 else if(key_sr1=1&key_sr2=0&key_sr3=1&key_sr4=1&key_lock1=0) +delay_cnt1; if(delay_cnt1cnt_delay_cnt1) delay_cnt1=0;key_lock1=1; /自锁按键置位,避免一直触发 key_sec=6; /触发2号键dle

43、ay_time1 = 0; / 自锁计数延时 / led1 = 0; / 有按键按下,打开背光灯/dleay_time3 =0; / 背光灯延时计数器 清零 else if(key_sr1=1&key_sr2=1&key_sr3=0&key_sr4=1&key_lock1=0) +delay_cnt1; if(delay_cnt1cnt_delay_cnt1) delay_cnt1=0;key_lock1=1; /自锁按键置位,避免一直触发 key_sec=7; /触发4号键dleay_time1 = 0; / 自锁计数延时 / led1 = 0; / 有按键按下,打开背光灯/dleay_ti

44、me3 =0; / 背光灯延时计数器 清零 Elseif(key_sr1=1&key_sr2=1&key_sr3=1&key_sr4=0&key_lock1=0) +delay_cnt1; if(delay_cnt1cnt_delay_cnt1) delay_cnt1=0;key_lock1=1; /自锁按键置位,避免一直触发 key_sec=8; /触发4号键dleay_time1 = 0; / 自锁计数延时 / led1 = 0; / 有按键按下,打开背光灯/dleay_time3 =0; / 背光灯延时计数器 清零 break;case 7: /扫描/扫描3号键,4号键 key_dr1=

45、1; key_dr2=1; /按键行扫描输出第二行低电平key_dr3=0;key_dr4=1; delay_cnt2=0; /延时计数器清零 key_step+; /切换到下一个运行步骤 break; case 8: delay_cnt2+; if(delay_cnt2cnt_delay_cnt2) /小延时,但不是去抖动延时,替代一直受网友争议的delay1(40) delay_cnt2=0; key_step+; /切换到下一个运行步骤 break; case 9:if(key_sr1=1&key_sr2=1&key_sr3=1&key_sr4=1) /如果没有按键按下,则2个IO输入都是高电平 key_step+; /如果没有按键按下,下一个中断扫描下2个/按键key_lock1=0; /按键自锁标志清零 delay_cnt1=0; /按键去抖动延时计数器清零,此行非常巧妙 else if(key_sr1=0&key_sr2=1&key_sr3=1&key_sr4=1&key_lock1=0)

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!