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; } }
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库电子琴论文 - 图文(6)在线全文阅读。
相关推荐: