<1>确定矩阵式键盘上何键被按下介绍一种“行扫描法”。
行扫描法 行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如上图所示键盘,介绍过程如下。
1、判断键盘中有无键按下 将全部行线Y0-Y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。
2、判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
下面给出一个具体的例子:
图仍如上所示。8031单片机的P1口用作键盘I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位。列线P1.0-P1.3分别接有4个上拉电阻到正电源+5V,并把列线P1.0-P1.3设置为输入线,行线P1.4-P.17设置为输出线。4根行线和4根列线形成16个相交点。
1、检测当前是否有键被按下。检测的方法是P1.4-P1.7输出全“0”,读取P1.0-P1.3的状态,若P1.0-P1.3为全“1”,则无键闭合,否则有键闭合。
2、去除键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。
3、若有键被按下,应识别出是哪一个键闭合。方法是对键盘的行线进行扫描。P1.4-P1.7按下述4种组合依次输出:
P1.7 1 1 1 0
P1.6 1 1 0 1
P1.5 1 0 1 1
P1.4 0 1 1 1
在每组行输出时读取P1.0-P1.3,若全为“1”,则表示为“0”这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值
4、为了保证键每闭合一次CPU仅作一次处理,必须去除键释放时的抖动。
键盘扫描程序:
从以上分析得到键盘扫描程序的流程图所示。程序如下
SCAN: MOV P1,#0FH
MOV A,P1
ANL A,#0FH
CJNE A,#0FH,NEXT1
SJMP NEXT3
NEXT1: ACALL D20MS
MOV A,#0EFH
NEXT2: MOV R1,A
MOV P1,A
MOV A,P1
ANL A,#0FH
CJNE A,#0FH,KCODE
MOV A,R1
SETB C
RLC A
JC NEXT2
NEXT3: MOV R0,#00H
RET
KCODE: MOV B,#0FBH
NEXT4: RRC A
INC B
JC NEXT4
MOV A,R1
SWAP A
NEXT5: RRC A
INC B
INC B
INC B
INC B
JC NEXT5
NEXT6: MOV A,P1
ANL A,#0FH
CJNE A,#0FH,NEXT6
MOV R0,#0FFH
RET
<2>确定矩阵式键盘上何键被按下介绍一种“高低电平翻转法”。
首先让P1口高四位为1,低四位为0,。若有按键按下,则高四位中会有一个1翻转为0,低四位不会变,此时即可确定被按下的键的行位置。
然后让P1口高四位为0,低四位为1,。若有按键按下,则低四位中会有一个1翻转为0,高四位不会变,此时即可确定被按下的键的列位置。
最后将上述两者进行或运算即可确定被按下的键的位置。
键盘处理程序就作这么一个简单的介绍,实际上,键盘、显示处理是很复杂的,它往往占到一个应用程序的大部份代码,可见其重要性,但说到,这种复杂并不来自于单片机的本身,而是来自于 *** 作者的习惯等等问题,因此,在编写键盘处理程序之前,最好先把它从逻辑上理清,然后用适当的算法表示出来,最后再去写代码,这样,才能快速有效地写好代码。
解析MIDI电子琴的设计用单片机是如何实现的摘要:用单片机控制通用MIDI音源模块制作制作出的电子琴,结构简单,可靠性高,并且价格低廉,具有实用的价值。这种电子琴能够支持单音和复音d奏,如果与高品质的音源芯片连接,音质更可与高档电子琴相媲美。我们在实验过程中,也曾采用手机中通用的音乐芯片构成音源模块,效果不错,价格更低廉,如韩国产的QS6400 等,这些芯片的驱动要复杂一些,需要对芯片进行初始化设置,详细内容可参看国防工业出版社出版的《MIDI原理与开发应用》一书中的相关章节。
关键字:电子琴,单片机,音源板,MD2064
1、电子琴的硬件设计方案
本电子琴包含48个按键键盘,即具有4个8度的音域,单片机AT89C51通过对所d按键的识别,产生相应的MIDI消息。它支持单音d奏和最多16个复音d奏。电子琴结构示意图和电路原理图分别如图1和图2所示。AT89C51作为主控芯片,它使得键盘矩阵模块、通道和音色选择以及串口发送等各功能模块协调工作。48按键行列式键盘矩阵构成MIDI电子琴的键盘扫描输入端,由于89C51的P0口内部没有上拉电阻,故这里采用电阻R14——R21将列线拉至高电平,与六条行线组合完成48个琴键的扫描识别,在图1中,单片机与键盘矩阵间的双箭头线表示单片机在扫描键盘矩阵时,P0口和P2口分别作为输入/输出口使用。人机接口电路则利用了单片机P1口的大部分口线,并通过或门向INT0发出中断请求,该部分电路主要完成MIDI电子琴的通道设置和音色选择等人机交互功能。键盘的d奏信息以及通道、音色信息经CPU处理后,由串口将标准的MIDI数据发送给MIDI音源及放大器,推动扬声器发声。
图1:MIDI电子琴结构示意图
图2:MIDI电子琴电路图
音源模块采用MD2064 套板,如图3所示。它是一种模块化的MIDI音源产品,由得理电子公司开发,具有标准MIDI接口,该板能接受标准GM MIDI命令进行音乐播放,自带3D, REVERB, CHORUS等效果处理。由于该套板的MIDI 接口采用了光耦合器,电流驱动,故设计了由Q1、Q2等器件组成的驱动电路,使单片机串口数据得以正常传输。在模块的耳机输出端取得信号后,经小功率放大即可推动扬声器发声。
2、电子琴的软件设计特点
该电子琴软件采用模块化设计方法,程序也较简单。软件中各功能模块都由相应的子程序完成,主要包含通道选择模块,音色选择模块,48按键键盘扫描模块,串口发送模块等,其中为了及时完成用户命令,音色选择模块采用了中断服务子程序,可以在演奏中快速响应使用者的请求。
主程序在完成串口初始化、相关变量的初始化以及设置通道后,即进入键盘扫描、发送音符消息流程,为了使按键识别准确可靠,还设置了两个缓冲区BUFF1和BUFF2保存键盘扫描值。主程序流程图如图3。
图3:MIDI电子琴程序的流程图
以下是部分功能模块的程序设计介绍。
2.1 音色选择模块的设计
该模块的功能是使MIDI电子琴能按要求快速改变音色,所以采用了中断服务子程序。当某个音色选择按键压下时,通过或门向单片机的INT0发出中断请求,CPU响应后进入该中断服务子程序。MIDI技术规范规定,标准MIDI含有128种音色,它们的编号范围是0~127,为了能够快速找到所需音色,硬件中设置3个按键,其中2个用于音色编号的单步增加和减小,每次增加或减小1个音色编号,另外一个键用于音色快进,当快进键有效时,每次增加8个音色编号,选择增加8个音色的原因是:标准MIDI的128种音色是按每8个音色一组编排的,共包含16个乐器组。电子琴开机时默认的音色编号是0,即大钢琴音色。
单片机的P1.2口线连接着音色增加按键,P1.3则连接音色减小按键,P1.4连接音色快进键。低电平时按键有效,这三个按键通过与门连接外部中断INT0,以便实时响应音色设置。该外部中断0的中断服务子程序流程图见图4,(图中省去了按键延时去抖动部分):
图4:音色改变子程序流程图
在该子程序中,变量TAMBER中存放当前音色,其值可在0~127间循环,当TAMBER是最大值127时,加1后又变为0;而当TAMBER为0时,减1则变为127;在边界范围加8取模后,刚好为其对应的音色值。
2.2 串口发送模块
串口发送模块主要用于发送产生的MIDI消息,串口采用的模式1,发送的波特率是31.25KBPS。串口通过驱动电路连接MIDI音源,发送MIDI消息。通道号存放在变量CHANNEL中,通过与90H相与,所得值就是当前所设置的通道号。
2.3 键盘扫描模块
本电子琴提供了48个MIDI按键,即4个8度音的音域范围,当按下单个键时,产生一条MIDI消息,当按下多个键值时产生对应键值的多条MIDI音符开消息,当某个键值被释放时,发送对应的音符关消息。这些MIDI消息通过串口发送给MIDI音源,产生MIDI音乐。音乐的时值由按键的时间长度控制,当按键被释放,实时产生MIDI消息,关闭被释放的键值音。
由P0口和P2口的P2.0~P2.5构成行列式键盘,也可继续扩展键盘,例如改为常用的49键或64键。因为支持复音按键,键盘扫描程序必须扫描到行列式键盘的每个键值,扫描所得的键值存放在缓冲区BUFF1或BUFF2中。键盘扫描程序获得的键盘编号范围是0~47,还需将这个键盘编号值转换为MIDI设备能够识别的钢琴键盘编号,这个功能由一个子程序来完成,限于篇幅本文不再详述。键盘扫描子程序流程如图5。
图5:键盘扫描子程序
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)