单片机课程设计51系列_第1页
单片机课程设计51系列_第2页
单片机课程设计51系列_第3页
单片机课程设计51系列_第4页
单片机课程设计51系列_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机课程设计可存储式电子琴姓 名: 班 级:学 号:指导老师:组 长:小组成员:摘要电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。我们设计的这个简易电子琴以单片机作为主控核心,与键盘、蜂鸣器等模块组成核心主控制模块,在主控模块上设有4*4的矩阵键盘设计成16个音。本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。 根据使用者的操作随意弹奏想要表达的音乐。一首音乐是许多不同的音阶组成的,而每个音阶对应

2、着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号。此外,本系统还实现了实时存储,能将演奏的音律存储起来并一块演奏出来。 关键词:单片机;按键;蜂鸣器;音阶;电子琴;可存储 目录1 概述11.1电子琴设计目的及意义11.2设计任务11.3设计项目与功能简介11.31 设计项目简介11.32 系统功能简介22 硬件设计及说明32.1 硬件系统设计32.2 元件简介32.21 STC89C5232.22 蜂鸣器42.23 矩阵键盘52.24 LCD160263 软件程序设计

3、73.1 软件系统设计73.2音乐相关知识93.3 产生音频脉冲93.4 识别矩阵键盘103.5 LCD实时显示113.6实时存储音律信息134 系统调试134.1 硬件调试134.2软件调试135 课程设计个人分工及心得体会155.1个人分工155.2心得体会15致谢15参考文献16附录171 概述1.1 电子琴设计目的及意义 随着当代科学技术的发展,电子产品在人们的日常生活中占据着越来越重要的地位。电子琴作为其中的一个典型代表,引领着许多孩子进入音乐的殿堂。因此电子琴的设计不仅能够提高我的实践动手能力,还与实际生活有着紧密地联系。单片机是一门实践性很强的课程,而此次课程设计依据的理论基础是

4、单片机的相关知识。其主要目的是通过本课程的培养,启发学生的创造性思维,进一步理解数字系统的概念,掌握小型数字系统的设计方法,掌握小型数字系统的组装和调试技术,掌握查阅有关资料的技能。单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。1.2 设计任务本设计要求利用8051单片机的控制程序结合LCD,设计一台数字式可存储式电子琴。其基本要求为:(1)使用LCD显示器来显示音阶输入的相关信息;(2)当按下

5、键盘组相对按键,压电喇叭会发出相对音阶单音,共有2个8度音阶;(3)所有单音会存入8051内而保存起来;(4)至多可以输入64个单音,可以一起演奏出来;(5)演奏时可以按键中断;(6)可以实时显示目前正演奏的单音码。1.3 设计项目与功能简介1.31 设计项目简介 本项目设计是采用 STC89C52 单片机作为核心,利用单片机技术、无源蜂鸣器、4x4 键盘、SPEAKER、以及LCD显示屏实现原理图设计到电路板设计开发,并用 C51 高级语言进行键盘识别程序设计和音频脉冲输出程序与音频存储程序的设计。最终能够实现乐曲演奏和音律存储以及自动播放,并且可以通过LCD显示屏显示音符。1.32 系统功

6、能简介(1)能实现基本的琴键功能。 即按下每一个琴键,单片机能够检测到键盘的按键,并通过键盘的位置,通过程序来控制,使蜂鸣器发出不同频率的声音。(2)能够实现LCD显示按键。 每按下一个按键时,单片机能够检测到所按下的按键,然后通过按键的位置通过程序控制来实现在LCD中显示相应按键。(3)能够实现实时存储。 每按下一个按键时,发出一个单音并能将其存储起来。然后,通过一个播放键将所存储的音乐播放出来。(4)能够实现按键中断。 在播放音乐时可以按下中断键使音乐暂停与播放。 2 硬件设计及说明2.1 硬件系统设计硬件设计的任务是根据总体设计要求,在选择的机型的基础上,具体确定系统中所要使用的元器件,

7、设计出系统的结构图。该设计要实现一种由单片机控制可存储式电子琴,因为这是一个比较简单的系统,而STC89C52单片机经济实惠,也有很多优点,其性能完全可以满足设计的需求,所以我们选择STC89C52来作为此设计项目的核心。电子琴首先必须要有按键,又要求输出16个音阶,所以我们采用了4X4矩阵键盘。另外LCD显示器件具有工作电流小、重量轻、功耗低、寿命长、字迹清晰美观等优点,在便携式仪表、低功耗应用的仪器仪表中得到了广泛应用,所以我们选用了LCD1602来实现显示相应音符,其总体框图设计如下:图2.1 系统结构图2.2 元件简介2.21 STC89C52STC89C52是一种带 8K字节闪烁可编

8、程可擦除只读存储器(FPEROMFalsh Programmable and Erasable Read Only Memory)的低电压,高性能 CMOS8 位微处理器,俗称单片机。该器件采用高密度非易失存储器制造技术制造,与工业标准的 MCS-51 指令集和输出管脚相兼容。由于将多功能 8位CPU 和闪烁存储器组合在单个芯片中,STC89C52是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。STC89C52的主要特征:·8K字节可编程闪烁存储器寿命:1000写/擦循环数据保留时间:10年 ·全静态工作:0Hz-24Hz ·三级程序存储器

9、锁定 ·128*8位内部RAM ·32可编程 I/O线 ·两个16位定时器/计数器 ·6个中断源 ·可编程串行通道 ·低功耗的闲置和掉电模式 ·片内振荡器和时钟电路STC89C52的芯片图:图2.2 STC89C52芯片图2.22 蜂鸣器蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型1压电式蜂鸣器 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组

10、成。有的压电式蜂鸣器外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成。当接通电源后(1.515V直流工作电压),多谐振荡器起振,输出1.52.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。 压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。 2电磁式蜂鸣器 电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。 2.23 矩阵键盘单片机系统中,若使用按键的数量比较多时,通常选用用矩阵式键盘。矩阵式键由行线和列线构成,按键位于行、列线的交叉点上, 键盘矩阵是由四行四列构成,矩阵的四列和 P1 口的低四位相

11、连,四行与 P1 口的高四位相连。其键盘识别方法如下:(1) 判断键盘中有无键按下 将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。(2) 判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。图2.3矩阵式键盘结构2.24 LCD1602LCD160

12、2是以点阵字符型为显示方式的液晶显示器,每行可以显示16个字符,一共可以显示2行。它由LCD显示屏、扩展驱动器HD44100和控制器HD44780组成,其主要参数如下:3 软件程序设计3.1 软件系统设计 软件设计实际上就是程序编程,根据项目设计要求,我们把软件,设计部分大体分为了四个模块:音频脉冲产生程序设计、键盘扫描识别程序、实时存储程序与LCD显示程序。其设计图如下:图3.1 软件系统设计图其总体流程图如下:图3.2 总体流程图3.2音乐相关知识乐音听起来有的高,有的低,这就叫音高,音高是由发音物体振动频率的高低决定的,频率高声音就高,频率低声音就低,不同音乐的乐音是用C、D、E、F、G

13、、A、B表示的,这7个字母就是乐音的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,这是唱曲时乐音的发音,所以叫唱名。音持续时间的长短即时值,一般用拍数表示,休止符表示暂停发音。一首音乐是由许多不同的音符组成的,而每个音符对应着不同的频率,这样就可以利用不同频率的组合,加以与拍数对应的延时,构成音乐。3.3 产生音频脉冲在本实验中,单片机工作于12MHZ时钟频率,使用其定时/计数器T0,工作模式为1,改变计数值TH0和TL0可以产生不同频率的脉冲信号,在此情况下,C调的各音符频率与计数值T的对照如下表:音符频率(HZ)计数值(T值)音符频率(HZ)计数值(T值)低1DO2626

14、3628#4FA#74064860#1DO#27763737中5SO78464898低2RE29463835#5SO#83194934#2RE#31163928中6LA88064968低3MI33064021#6LA#93264994低4FA34964103中7SI96865030#4FA#37064185低1DO104665058低SO39264260#1DO#110965085#5SO#41564331高2RE117565110低6LA44064400#2RE#124565134#6LA#46664463高3MI131865157低7SI49464524高4FA139765178中1DO5

15、2364580#4FA#149065198#1DO#55464633高5SO156865217中2RE58764633#5SO#166165235#2RE#62264884高6LA176065252中3MI65964732#6LA#186565268中4FA69864820高7SI196765283 表3-1 音符频率与计数值T的对照表T的值决定了TH0和TL0的值,其关系为:TH0=T/256,TL0=T%256。3.4 识别矩阵键盘在单片机应用系统中,键盘的工作方式主要有两种,即编程扫描与定时扫描。编程扫描即行扫描法。行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,介绍过

16、程如下: (1) 检测当前是否有键被按下。(2) 去除键抖动。(3) 若有键被按下,应识别出是哪一个键闭合。方法是对键盘的行线进行逐行扫描。(4)为了保证键每闭合一次CPU仅作一次处理,必须却除键释放时的抖动。定时扫描是利用单片机内部的定时器产生一定时间的定时间隔,当定时时间到就产生定时器溢出中断,CPU响应中断时对键盘进行行扫描取键值,以响应键输入请求。因为编程扫描CPU需不停地扫描键盘,影响其他功能的执行,工作效率低,所以我们采用了第二种键盘扫描识别方法。其程序如下:void timer1()interrupt 3 TL1 =0x18 ; TH1 =0xfc ; KeyScan();此语句

17、实现了每1ms进行一次键盘扫描工作。函数名称:键盘扫描子程序函数功能:按键状态的采集,定时1ms和消抖掩码实现每个按键20ms的消抖延时void KeyScan() uint8 i; static uint8 iKeyOut=0; static uint8 KeyScanBuff44;KeyScanBuffiKeyOut0 = (KeyScanBuffiKeyOut0<<1) | KEY_IN_1) & DEBOUNCE_MASK; KeyScanBuffiKeyOut1 = (KeyScanBuffiKeyOut1<<1) | KEY_IN_2) &

18、DEBOUNCE_MASK; KeyScanBuffiKeyOut2 = (KeyScanBuffiKeyOut2<<1) | KEY_IN_3) & DEBOUNCE_MASK; KeyScanBuffiKeyOut3 = (KeyScanBuffiKeyOut3<<1) | KEY_IN_4) & DEBOUNCE_MASK; for (i=0; i<4; i+) if (KeyScanBuffiKeyOuti = DEBOUNCE_MASK) KeyStaiKeyOuti = KEY_UP; else if (KeyScanBuffiKeyO

19、uti = 0) KeyStaiKeyOuti = KEY_DOWN; iKeyOut = (iKeyOut+1) & 0x3; switch (iKeyOut) case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break; case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break; case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break; case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break; default: break; 3.5 LCD实时显示 LCD160

20、2的控制器HD44780的主要功能部件有:DDRAM显示数据RAM、CGROM字符产生器ROM、CGRAM字形产生器RAM、IR指令寄存器、DR数据寄存器、BF忙碌标志信号和AC地址计数器,七大部分组成。另外,HD44780还提供了清屏指令、读取状态指令、写数据指令、读数据指令等11条指令对DDRAM的内容和地址进行具体操作,这些指令足以完成我们的设计目标,具体相关程序如下:函数名称:LCD1602读繁忙标志位子程序void Lcd1602WaitReady() uint8 sta; P0 = 0xFF; LCD1602_RS = 0; LCD1602_RW = 1; do LCD1602_E

21、 = 1; _nop_(); sta = P0; LCD1602_E = 0; while (sta&0x80) != 0); 函数名称:LCD1602写命令子函数void Lcd1602WriteCmd(uint8 cmd) Lcd1602WaitReady(); LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_E = 1; P0 = cmd; nop_(); LCD1602_E = 0;函数名称:LCD1602写数据子函数void Lcd1602WriteDat(uint8 dat) Lcd1602WaitReady(); LCD1602_RS =

22、1; LCD1602_RW = 0; LCD1602_E = 1; P0 = dat;_nop_(); LCD1602_E = 0;函数名称:LCD1602初始化子程序void Lcd1602Init() Lcd1602WriteCmd(0x38); Lcd1602WriteCmd(0x0C); Lcd1602WriteCmd(0x06); 3.6实时存储音律信息 设计要求要把所弹奏的音律实时存储起来,所以编程时我们定义了一个数组来实现存储。我们把键值与该键所代表的音律脉冲一对应,在按下某个键时,把它代表的音律脉冲通过查询数组的方式存入另一个数组中,在连续播放时再调用这个数组。例如music_

23、savesave_count = i*4+j;这条语句用来储存键值,music_timesave_count = key_time;这条语句用来储存按键按下时间的长短,if(play_count<save_count)STH0 = music_tabmusic_saveplay_count/256;STL0 = music_tabmusic_saveplay_count%256;这些语句用于播放时查找存储的音律信息。4 系统调试4.1 硬件调试硬件调试主要是针对单片机部分进行调试,自行制作了电路板。硬件调试我们先采用了普中HC6800-EM3开发板进行调试,后自行制作了电路板,在上电前,

24、先确保电路中不在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。在确保硬件电路正常,无异常情况(断路或短路)方可上电调试,上电调试的目的是检验电路是否接错,同时还要检验原理是否正确,在本次设计中,上电调试主要键盘单片机控制部分、LCD显示部分、和音频转换电路硬件调试。1、键盘单片机控制部分调试:上电后,随机按动键盘可以发现各个按键对应的正确。2、LCD电路调试:接通电源,随机按下按钮可以看到LCD液晶显示数字。4.2软件调试软件调试主要方法和技巧:通常一个调试程序应该具备至少四种性能:跟踪、断点、查看变量、更改数值。整个程序是一个主程序调用各个子程序实现功能的过程,要使

25、主程序和整个程序都能平稳运行,各个模块的子程序的正确与平稳运行必不可少,所以在软件调试的最初阶段就是把各个子程序模块进行分别调试。我们调试日志如下:(1)编写了键盘扫描程序,初步实现弹奏。(2)放弃原来键盘扫描程序,编写新的键盘扫描程序。(3)实现弹奏和播放储存音乐功能。(4)初步编写LCD1602的驱动程序。(5)继续编写LCD1602程序,实现显示弹奏的音符和频谱图。(6)编写播放暂停功能。(7)完成在普中HC6800-EM3开发板调试。5 课程设计个人分工及心得体会5.1个人分工主程序的编写与整合、键盘扫描及按键动作程序的编写、电路板的加工与调试。5.2心得体会通过理论设计,到仿真软件仿

26、真,再到确定具体方案,再到安装实际电路,最后到调试电路、成型,整个过程都需要我们充分利用所学的知识进行思考、借鉴。可以说,本次课程设计是针对前面所学的知识进行的一次比较综合的检验,让我们所学到的知识更加深刻,同时把理论与实际充分的结合起来。总的来说,这次课程设计虽然累,但非常充实。另外,这次课程设计也让我们懂得了团结的重要性,我们小组5人分工明确,同时也互帮互助,同心协力才出色的完成了这次任务。 在这次实习中,正确的思路是很重要的,只有你的设计思路是正确的,那你的设计才有可能成功。因此我们在设计前必须做好充分的准备,认真查找详细的资料,为我们设计的成功打下坚实的基础。要做好本次的课程设计,熟练

27、地掌握课本上的理论知识是前提,这样才能对试验中出现的问题进行一定的分析和解决。另外,还要学会互相帮助,在自己走入困境无法走出时,这时别人的帮助可能会使你豁然开朗。此外在学习单片机知识的时候对于这个领域有了更新更全面的认识。作为21世纪的工科大学生,学好单片机,一方面可以加深对计算机原理和结构的认识,另一方面也为自身在专业上的深入发展构筑了一个很好的平台其重要性怎么强调都不为过。致谢这次课程设计能够得以顺利完成,是所有指导过我们的老师,帮助过我们的同学的结果。我们小组在这里对他们表示深深的谢意! 首先,要特别感谢我们的指导老师。老师丰富的专业知识,严谨的治学态度,精益求精的工作作风,诲人不倦的高

28、尚师德,朴实无华、平易近人的人格魅力对我们影响深远。 其次,要感谢所有曾经教我们单片机的任课老师刘鹏老师,他教会我们的不仅仅是专业知识,更多的是对待学习、对待生活的态度。 再次,感谢我们的同学,因为有你们的帮助,我们的项目才得以顺利完成。 参考文献【1】黄鑫,马善农,赵永科.基于CPLD的电子琴研究与设计J.科技广场,2007【2】吴金戌,沈庆阳,郭庭吉,8051单片机实践与应用M清华大学出版社,2001【3】龙威林,杨冠声,胡山.单片机应用入门:AT89S51和AVRM.北京:化学工业出版社,2008.【4】张毅刚,MCS-51单片机应用设计M哈尔滨工业大学出版社,2004【5】李朝青. 单

29、片机原理及接口技术M. 北京:北京航天航空大学出版色,2001【6】胡汉才. 单片机原理及其接口技术M. 北京:清华大学出版社,2004【7】陈明荧8051单片机课程设计实训教材M北京:清华大学出版社,2003年9月【8】徐新艳单片机原理、应用与实践M北京:高等教育出版社,2005年3月【9】杨恢先,黄辉先.单片机原理及应用M.北京:人民邮电出版社,2006【10】张虹.单片机原理及应用M.北京:中国电力出版社,2009【11】赵亮,侯国锐.单片机C语言编程与实例M.北京:人民邮电出版社,2003附录附录1:程序清单C程序(非程序文字)/*说明:*/#include<reg52.h>

30、;#include <intrins.h>#include"config.h"/程序设置头文件uint16 code music_tab=63628, 63835, 64021, 64103, /低音音阶 64260, 64400, 64524, 64580, 64580, 64633, 64732, 64820, /高音音阶 64898, 64968, 65030, 65058;uint8 code Ledshow_mus_tab='1', '2', '3', '4', '5',

31、'6', '7', '1', /低音音阶字符 '1', '2', '3', '4', /高音音阶字符 '5', '6', '7', '1'uint8 code Ledshow_pic_tab= 1, 2, 3, 4, /低音音阶频谱图 5, 6, 7, 8, 8, 9, 10, 11,/高音音阶频谱图 12, 13, 14, 15; volatile uint8 KeySta44; /当前的按键状态uint8 xdata

32、 music_save80; /保存音乐的音符uint16 xdata music_time80;/保存音乐的时间uint16 key_time;/音符时间计数uint8 save_count;/保存计数uint8 play_count;/播放计数uint8 play_flag;/播放标志位uint8 pause_flag;/暂停标志位uint16 STL0; /重装T0值uint16 STH0;void KeyScan();/键盘扫描子程序void KeyHandle();/键盘按键动作判断子程序void play();/音乐播放子程序void Lcd1602WaitReady();/LCD

33、1602读繁忙标志位子程序void Lcd1602WriteCmd(uint8 cmd);/LCD1602写命令子程序void Lcd1602WriteDat(uint8 dat);/LCD1602写数据子程序void Lcd1602Init();/LCD1602初始化子程序void Lcd1602_show_L1(uint8 dat);/LCD1602第一行显示子程序void Lcd1602_show_L2(uint8 dat);/LCD1602第二行显示子程序void play_pause();/音乐播放暂停子程序void delay_ms(uint8 i);/延时1ms子程序/*函数名称

34、:主函数函数功能:实现对个子函数的扫描调用*/void main()TMOD |= 0x11;/定时器0,方式1 驱动蜂鸣器 0001 0001TMOD &= 0xdd;/定时器1,方式1 用于键盘扫描 1101 1101ET0 = 1;/ XX01 XX01ET1 = 1;EA = 1;TR1 = 1;while(1)KeyHandle();play_pause();if(PLAYER)play_flag=1;if(play_flag)play();/*函数名称:定时器0中断子程序函数功能:定时不同时间,产生不同频率的方波,产生音符*/void timer0()interrupt 1

35、/Timer0定时产生特定频率的波形驱动蜂鸣器TH0 =STH0;TL0 =STL0;SPEAKER=SPEAKER;key_time+;/*函数名称:定时器1中断子程序函数功能:定时1ms,调用键盘扫描子程序实现按键状态的采集和按键的消抖*/void timer1()interrupt 3/Timer1定时1ms,用于按键的检测和消抖 TL1 =0x18 ; TH1 =0xfc ; KeyScan();/*函数名称:键盘扫描子程序函数功能:按键状态的采集,定时1ms和消抖掩码实现每个按键20ms的消抖延时*/void KeyScan() uint8 i; static uint8 iKeyO

36、ut=0; static uint8 KeyScanBuff44; / 扫描按键输入 KeyScanBuffiKeyOut0 = (KeyScanBuffiKeyOut0<<1) | KEY_IN_1) & DEBOUNCE_MASK; KeyScanBuffiKeyOut1 = (KeyScanBuffiKeyOut1<<1) | KEY_IN_2) & DEBOUNCE_MASK; KeyScanBuffiKeyOut2 = (KeyScanBuffiKeyOut2<<1) | KEY_IN_3) & DEBOUNCE_MASK;

37、 KeyScanBuffiKeyOut3 = (KeyScanBuffiKeyOut3<<1) | KEY_IN_4) & DEBOUNCE_MASK;/ 消抖后更新按键状态 for (i=0; i<4; i+) if (KeyScanBuffiKeyOuti = DEBOUNCE_MASK) KeyStaiKeyOuti = KEY_UP; else if (KeyScanBuffiKeyOuti = 0) KeyStaiKeyOuti = KEY_DOWN; / 逐行拉低行输出 iKeyOut = (iKeyOut+1) & 0x3;/&0x3的作

38、用使iKeyOut在03之间循环 switch (iKeyOut) case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break; case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break; case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break; case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break; default: break; /*函数名称:键盘按键动作判断子程序函数功能:实判断按键的按下和弹起动作,及执行相关操作*/void KeyHandle() uint8 i

39、, j; static uint8 bkKey44; / 检索按键状态的变化 for (i=0; i<4; i+) for (j=0; j<4; j+) if (bkKeyij != KeyStaij) /按键按下时的操作 if (bkKeyij = KEY_UP) /按键按下时播放音乐 STH0 = music_tabi*4+j/256;STL0 = music_tabi*4+j%256;TR0 = 1;/显示频谱和音符Lcd1602WriteCmd(0x01); /清屏 Lcd1602_show_L1(Ledshow_pic_tabi*4+j);Lcd1602_show_L2(

40、Ledshow_mus_tabi*4+j);/储存键值music_savesave_count = i*4+j; else /按键弹起时的操作/关闭音乐 TR0 = 0;/储存按键按下的时间music_timesave_count = key_time;save_count+;key_time = 0; /时间计数清零 bkKeyij = KeyStaij; /*函数名称:音乐播放子程序函数功能:播放一个音符,和调用LCD1602显示子程序*/void play()if(PLAYER) /播放初始时清屏 Lcd1602WriteCmd(0x01); if(play_count=save_cou

41、nt) /判断是否播放完成, /若播放完成清除各标志和计数save_count=0;play_count=0;play_flag =0;if(play_count<save_count)/播放音乐 STH0 = music_tabmusic_saveplay_count/256;STL0 = music_tabmusic_saveplay_count%256;if(pause_flag) /判断是否暂停播放TR0 =1;/LCD显示频谱和音符Lcd1602_show_L1(Ledshow_pic_tabmusic_saveplay_count);Lcd1602_show_L2(Ledshow_mus_tabmusic_saveplay_count);if(music_timeplay_count < key_time)TR0 =0;key_time=0;play_count+;if(pause_flag) /暂

温馨提示

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

评论

0/150

提交评论