完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
通过矩阵键盘,放大电路,复位电路,晶振电路,功能选择电路,LCD显示电路构成 以下是部分代码 。 void main(void) //主函数 { LED1=0; LED2=0; IE=0x87; //定义外部中断控制器 TMOD=0x01; //定义定时器0工作方式1 IT0=1; IT1=1; lcd_init(); init_play(); while(1) { P1=0xf0; if((P1&0xf0)!=0xf0) //判断 P1 口是否有变化 { anjian(); //读取键值 if(Mode==0) //如果是弹奏模式 { S_TH0 = tab[k]/256; S_TL0 = tab[k]%256; //根据 k 的值赋初值给 T0 TR0 = 1; //打开定时器用于定时产生频率发生 wr_com(0x89); wr_dat(0x30+k/10); wr_dat(0x30+k%10); while ((P1&0xf0)!=0xf0); //按键不松开的话, T0 就一直产生频率 TR0=0; //按键松开后关闭 T0 计时,频率停止 } else //如果是播放模式(上面的 if 语句不成立就执行 else) { while (Mode==1) //进入播放模式 { if(Song[k][Tone_Number]==-1) { Tone_Number=0; break; } wr_com(0x89); wr_dat(0x30+Song[k][Tone_Number]/10); wr_dat(0x30+Song[k][Tone_Number]%10); S_TH0=(tab[Song[k][Tone_Number]])/256; S_TL0=(tab[Song[k][Tone_Number]])%256; TR0 = 1; //打开定时器定时开关 delay1(300*Beat[k][Tone_Number]); //节拍数组延 Tone_Number++; //变量加准备播放下一个音符 TR0 = 0; //停止定时器 anjian(); //扫描按键 while((P1&0xf0)!=0xf0); } } } } } void EXO_IXT() interrupt 0 //外部中断 0 { unsigned char j; Mode=0; //弹奏模式 LED1=1; LED2=0; //点亮弹奏模式指示灯 Tone_Number=0; wr_com(0x01); wr_com(0x80); for(j=0;j《16;j++) { wr_dat(num_1[j]); } } void EX1_INT() interrupt 2 //外部中断 1 { unsigned char j; Mode=1; //播放模式 LED1=0; LED2=1; wr_com(0x01); wr_com(0x80); for(j=0;j《16;j++) { wr_dat(num_2[j]); } } void time0_int(void) interrupt 1 using 0 //定时器 0 { TH0 = S_TH0; //定时器赋初值 TL0 = S_TL0; SPKER=!SPKER; //喇叭引脚取反,产生频率的音乐 } |
|
|
|
只有小组成员才能发言,加入小组>>
2350 浏览 0 评论
874浏览 2评论
516浏览 1评论
1397浏览 0评论
281浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-31 09:31 , Processed in 1.139707 second(s), Total 48, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191