之前嵌入式課上用C51單片機(jī)做的,這是之前寫的代碼,比較簡(jiǎn)單,樓主可以借鑒一下,希望樓主采納~#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1=P3^2;
sbit beep=P3^7;
sbit beep2=P2^7;
sbit p20=P2^0;//切換音樂
sbit p21=P2^1;//播放模式/鍵盤模式
sbit p22=P2^2;//(錄音)
uchar i,ri;
uchar song_Index=0,Tone_Index=0;
uchar *song_Tone,*song_Time;
const LED_tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,
0x82,0xF8,0x80,0x90,0xFF};
uint code Tone_tab[]={
63773,63965,64137,64215,64360,64488,64603,
64654,64751,64836,63036,63148,63212,10,65535,64892,64952};
uint recordi[]={0,1,2,3,4,5,6,7};
unsigned keymode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//矩陣式鍵盤
uchar buff;
void delay1ms(void){
uchar i;
for(i=200;i>0;i--);
}
void key_scan(void){
uchar hang,lie;
P1=0xf0;
if((P1&0xf0)!=0xf0) //行碼為0,列碼為1
{delay1ms(); //消抖動(dòng)
if((P1&0xf0)!=0xf0){//有鍵按下,列碼為0
hang=0xfe; //逐行掃描
while((hang&0x08)!=0)//掃描完各行后跳出
//while((hang&0x10)!=0)//4X4
{
P1=hang;
if((P1&0xf0)!=0xf0)//本行有鍵按下
{lie=(P1&0xf0)|0x0f;
buff=((~hang)+(~lie));
switch(buff){
case 0x11:Tone_Index=0;break;
case 0x21:Tone_Index=1;break;
case 0x41:Tone_Index=2;break;
case 0x81:Tone_Index=3;break;
case 0x12:Tone_Index=4;break;
case 0x22:Tone_Index=5;break;
case 0x42:Tone_Index=6;break;
case 0x82:Tone_Index=7;break;
case 0x14:Tone_Index=8;break;
case 0x24:Tone_Index=9;break;
case 0x44:Tone_Index=15;break;
case 0x84:Tone_Index=16;break;
//case 0x18:Tone_Index=12;break;
//case 0x28:Tone_Index=0;break;
//case 0x48:Tone_Index=1;break;
//case 0x88:Tone_Index=2;break;
}
}
else hang=(hang<<1)|0x01;
}
}
}
}
/*
uint code Tone_tab[]={
62018,62401,62491,62895,63184,63441,63506,
63773,63965,64137,64215,64360,64488,64603,
64654,64751,64836,64876,64948,65012,65067,65535};
uchar code song1_Tone[]={
11,9,11,14,12,14,12,11,11,7,8,9,8,7,8,
11,9,11,14,13,12,14,11,11,7,8,9,6,7,
12,14,14,13,12,13,14,12,13,14,12,12,11,10,7,8,
11,9,11,14,13,12,14,11,11,8,9,10,6,7,0xff};
uchar code song1_Time[]={
4,2,2,8,4,2,2,8,4,2,2,4,2,2,12,
4,2,2,4,2,4,4,8,4,2,2,4,2,12,
4,4,8,4,2,2,8,2,2,2,2,2,2,2,2,16,
4,2,2,4,2,4,4,8,4,2,2,4,2,12,0xff};
*/
uchar code song1_Tone[]={//兩只老虎
13,0,13,1,13,2,13,0,13,0,13,1,13,2,13,0,13,2,13,3,13,4,13,13,13,2,13,3,13,4,13,13,13,4,5,4,3,2,13,0,13,4,5,4,3,2,13,0,13,2,13,11,13,0,13,13,2,13,11,13,0,13,13,0xff};
uchar code song1_Time[]={
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,1,1,1,1,1,1,1,1,1,1,1,0xff};
uchar code song2_Tone[]={//小星星
13,0,0,4,4,5,5,4,13,3,3,2,2,1,1,0,13,4,4,3,3,2,2,1,13,4,4,3,3,2,2,1,0xff};
uchar code song2_Time[]={
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0xff};
uchar code song3_Tone[]={//歡樂頌
13,2,2,3,4,4,3,2,1,0,0,1,2,2,1,1,13,2,2,3,4,4,3,2,1,0,0,1,2,1,13,0,0,13,1,1,2,0,1,3,2,0,1,3,2,1,0,1,12,13,0xff};
uchar code song3_Time[]={
3,3,3,3,3,3,3,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0xff};
uchar code song4_Tone[]={//生日快樂
13,4,4,5,13,4,13,7,13,6,13,13,4,4,5,13,4,13,8,13,7,13,13,0xff};
uchar code song4_Time[]={
2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xff};
uchar code song5_Tone[]={//兩只老虎
13,0,13,1,13,2,13,0,13,0,13,1,13,2,13,0,13,2,13,3,13,4,13,13,13,2,13,3,13,4,13,13,13,4,5,4,3,2,13,0,13,4,5,4,3,2,13,0,13,2,13,11,13,0,13,13,2,13,11,13,0,13,13,0xff};
uchar code song5_Time[]={
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,1,1,1,1,1,1,1,1,1,1,1,0xff};
void delayms(uint ms)
{uchar a;
while(ms--)
{
for(a=2300;a>0;a--);
}
}
void Timer0() interrupt 1 //中斷函數(shù)
{
TH0=Tone_tab[Tone_Index]/256;
TL0=Tone_tab[Tone_Index]%256;
beep=~beep;
}
void select(void)
{
if(song_Index==0)
{
song_Tone=song1_Tone;
song_Time=song1_Time;
}
if(song_Index==1)
{
song_Tone=song2_Tone;
song_Time=song2_Time;
}
if(song_Index==2)
{
song_Tone=song3_Tone;
song_Time=song3_Time;
}
if(song_Index==3)
{
song_Tone=song4_Tone;
song_Time=song4_Time;
}
if(song_Index==4)
{
song_Tone=song5_Tone;
song_Time=song5_Time;
}
}
void int_init(void){
TMOD=0X01;
ET0=1;
EX0=1;
IT0=1;
EA=1;
TR0=0;
}
void display(void){
delay1ms();
if(P1!=0xf0) TR0=1;
else TR0=0;
}
void recordplay(void){
uint i=0;
while(i<8&&p22==0){
Tone_Index=recordi[i];
TR0=1;
delayms(150);
TR0=0;
i++;
}
}
void record(void){
recordi[ri]=Tone_Index;
delayms(10);
ri++;
}
void main(void)
{
int_init();
song_Tone=song1_Tone;
song_Time=song1_Time;
i=0;
while(1)
{
if(p20==0){
delayms(100);
song_Index++;
i=0;
if(song_Index==5) song_Index=0;
select();
}
if(p21==0){
if(p22==0){
if(p20==1&&P1!=0xf0) record();//錄音
if(p20==0) {recordplay();ri=0;}//錄音播放
}
key_scan();
display();
}
else{
P0=LED_tab[song_Index];
TR0=1;
Tone_Index=song_Tone[i];
if(Tone_Index==0xff){
i=0;
TR0=0;}
TR0=1;
delayms(song_Time[Tone_Index]*60);
TR0=0;
i++;
}
}
}
|