电子琴论文 - 图文

发布时间 : 星期二 文章电子琴论文 - 图文更新完毕开始阅读

{1,1,1,1,0,1,1,1,1,1,0,1,1,0,1,1,0,1,1,3,1,-1}, {0,1,1,0,1,1,2,1,1,0,1,1,0,1,1,2,-1}, {0,1,1,2,0,1,1,0,1,1,0,1,1,0,1,1,2,1,-1}, {0,1,1,0,1,1,2,1,1,0,1,1,0,1,1,4,-1}, {0,1,1,2,0,1,1,0,1,1,0,1,1,0,1,4,-1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1},

{1,1,2,0,1,1,0,1,1,0,1,1,0,1,1,2,1,0,1,1,0,1,1,2,1,1,0,1,1,0,1,1,4,0,1,1,2,0,1,1,0,1,1,0,1,1,0,1,4,-1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1} };

/*音符与计数值班对应表*/ uint code tab[]=

{0,63628,63835,64021,64103,64260,64400,64524, 64580,64684,64777,64820,64898,64968,65030, 65058,65110,65157,65178,65217,65252,65283 };

void delay1 (uint ms) //播放歌曲时实现节拍的延时函数 {

uchar t;

while (ms--) for (t=0;t<120;t++); }

/*键消抖延时函数*/ void delay(void) {

uchar i;

for (i=300;i>0;i--); }

/*键扫描函数*/

uchar getkey(void) {

uchar scancode,tmpcode; if ((P0&0xf0)==0xf0) return (0); scancode = 0xfe;

while((scancode&0x10)!=0) //逐行扫描 {

P0=scancode; //输出行扫描码 if((P0&0xf0)!=0xf0) //本行有键按下 {

tmpcode = (P0&0xf0)|0x0f;

/*返回特征字节码,为1的位即对应于行和列*/

return((~scancode)+(~tmpcode)); }

else scancode=(scancode<<1)|0x01; //行扫描码左移一位 } }

/*外部中断0,这里是弹唱按键*/ void EXO_IXT() interrupt 0 {

FY=0;LED1=1;LED2=0; }

/*外部中断线,这里是播放按键*/ void EX1_INT() interrupt 2 {

FY=1;LED1=0;LED2=1; }

/*定时器0中断服务子程序*/

void time0_int(void) interrupt 1 using 0 {

/*设置计数初值*/ TH0 = STH0; TL0 = STL0;

SPK=!SPK; //反相,产生输出脉冲*/ P2=DSY_CODE[k]; }

void main(void) { LED1=1; LED2=0; P2=0x3f; IE=0x87; TMOD=0x01; IT0=1; IT1=1; while(1) {

P0=0xf0; //发全0列扫描码 if((P0&0xf0)!=0xf0) //若有键按下 {

delay(); //延时去抖动

if((P0&0xf0)!=0xf0) //延时后再判断一次,去除抖动影响 {

key=getkey(); //调用键盘扫描函数

switch(key) //根据获取的按键位置得到K值 {

case 0x88:

k = 0;

break; case 0x48: k = 1;

break; case 0x28: k = 2 ; break; case 0x18: k = 3 ; break; case 0x84: k = 4 ; break; case 0x44: k = 5 ; break; case 0x24: k = 6 ; break; case 0x14: k = 7 ; break; case 0x82: k = 8 ; break; case 0x42: k = 9 ; break; case 0x22: k = 10 ; break; case 0x12: k = 11 ; break; case 0x81: k = 12 ; break; case 0x41: k = 13 ; break; case 0x21: k = 14 ; break;

case 0x11: k = 15 ; break; default : break; } if(FY==0) {

/*根据所得的K值设定计数器1的计数初值*/ 音符

} } } }

STH0 = tab[k]/256; STL0 = tab[k]%6;

TR0 = 1; //开始计数

while ((P0&0xf0)!=0xf0); //若没有松开按键,则等待,等待期间弹奏该 TR0=0; //若按键松开,则停止计数,不产生脉冲输出 }

else {

while (FY==1) {

if(Song[k][Tone_Index]==-1) Tone_Index=0;

STH0=(tab[Song[k][Tone_Index]])/256; STL0=(tab[Song[k][Tone_Index]])%6; P2=DSY_CODE[Song[k][Tone_Index]]; TR0 = 1;

delay1(300*Len[k][Tone_Index]); Tone_Index++; TR0=0; } }

联系合同范文客服:xxxxx#qq.com(#替换为@)