通过矩阵键盘,放大电路,复位电路,晶振电路,功能选择电路,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; //喇叭引脚取反,产生频率的音乐
}
哈哈哈哈哈哈,由于封装没画好,下图为惨烈的教训。
链接:https://pan.baidu.com/s/1XhrUQqFtyu_Le3-jeH0SVQ 提取码:yi6o