⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 1.存歌,从上至下,从左至右 两排八键为"1234567 1+
💻
字号:

//龙图开发网收集整理:http://www.longtoo.com
#include <reg52.h>
#include <absacc.h>

#define  COM8279 XBYTE[0xB801]//A0=1,输入:指令    输出:状态字
#define  DAT8279 XBYTE[0xB800]//A0=0,输入:数据    输出:数据

#define uchar unsigned char
#define uint unsigned int 
sbit ACC7=ACC^7;
uchar code tab[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0x77};
uchar code tab1[12]={0X30,0X2B,0X26,0X24,0X20,0X1C,0X19,0X18,0x10,0x20,0x30,0x40};//音符
uchar code flower[190]={0X18,0X30,0X1C,0X10,0X20,0X40,0X1C,0X10,0X18,0X10,0X20,0X10,0X1C,0X10,0X18,0X40,0X1C,0X20,
              0X20,0X20,0X1C,0X20,0X18,0X20,0X20,0X80,0X20,0X30,0X1C,0X10,0X18,0X20,0X15,0X20,0X1C,0X20,0X20,0X20,
			  0X26,0X40,0X20,0X20,0X2B,0X20,0X26,0X20,0X20,0X20,0X30,0X80,0X20,0X20,0X1C,0X10,0X18,0X10,0X20,0X20,
			  0X26,0X20,0x2B,0X20,0X30,0X20,0X2B,0X40,0X20,0X20,0X1C,0X10,0X18,0X10,0X20,0X20,0X26,0X20,0X2B,0X20,
              0X30,0X20,0X2B,0X40,0X20,0X30,0X1C,0X10,0X18,0X20,0X15,0X20,0X1C,0X20,0X20,0X20,0X26,0X40,0X20,0X20,    
              0X2B,0X20,0X26,0X20,0X20,0X20,0X30,0X80,0X20,0X30,0X1C,0X10,0X20,0X10,0X1C,0X10,0X20,0X20,0X26,0X20,
              0X2B,0X20,0X30,0X20,0X2B,0X40,0X20,0X15,0X1F,0X05,0X20,0X10,0X1C,0X10,0X20,0X20,0X26,0X20,0X2B,0X20,         
              0X30,0X20,0X2B,0X40,0X20,0X30,0X1C,0X10,0X18,0X20,0X15,0X20,0X1C,0X20,0X20,0X20,0X26,0X40,0X20,0X20,
              0X2B,0X20,0X26,0X20,0X20,0X20,0X30,0X30,0X20,0X30,0X1C,0X10,0X18,0X40,0X1C,0X20,0X20,0X20,0X26,0X40,
              0X13,0X60,0X18,0X20,0X15,0X40,0X13,0X40,0X18,0X80,0X00,0X80};//八月桂花香

sbit P10=P1^0;
uchar in=0,time=0x10,ton=0x00,pow=0,flag,ld,region=2; 
int num,n; 

//歌曲数据区           
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//接线:J20的一脚接P1.0口  12M晶振
//程序功能:1.存歌,从上至下,从左至右 两排八键为"1234567 1+',第三排为节拍
//         2.自动唱歌《八月桂花香》
//使用说明:KEY01选择存歌功能,KEY02选择放歌功能   
//          KEY03自动唱歌 KEY04调整音节
//////////////////////////////////////////////////////////////////////////////////////////////////////////
void display(unsigned long int dat,uchar head)
{
 uchar i;
 COM8279=0xd1;   //初始化8279  110 10001全部清零
	do{
 	ACC=COM8279;//读回状态信息
	   }	
	while(ACC7==1);//等待
    COM8279=0x90+head;//写显示RAM	100 1(自动加一)0000(指向第head个存储单元) 
	for(i=0;dat>0;i++)
	{
 	 DAT8279=tab[dat%10];
	 dat=dat/10;
	}
}
uchar key_scan(void)//键盘扫描,返回键值
{
 uchar m;		
        switch(DAT8279)	//读FIFO RAM
            {
              case 0xc3:m=0; break;  //K13键1100 0011
              case 0xc2:m=1; break;  //K9键 1100 0010
              case 0xca:m=2; break;  //K10键1100 1010
              case 0xd2:m=3; break;  //K11键1101 0010
              case 0xc1:m=4; break;  //K5键 1100 0001
              case 0xc9:m=5; break;  //K6键 1100 1001
              case 0xd1:m=6; break;  //K7键 1101 0001
              case 0xc0:m=7; break;  //K1键 1100 0000
              case 0xc8:m=8; break;  //K2键 1100 1000
              case 0xd0:m=9; break;  //K3键 1101 0000           
              
			  case 0xcb:m=10; break;  //K14键1100 1011                           
              case 0xd3:m=11; break;  //K15键1101 0011
              case 0xdb:m=12; break;  //K16键1101 1011
              case 0xda:m=13; break;  //K12键1101 1010 
              case 0xd9:m=14; break;  //K8键1101 1001
              case 0xd8:m=15; break;  //K4键1101 1000
               
              default: m=16;
            }
  return m;
}
void key13(void)//1
 {uint ton0;
  tn0=XBYTE[num]=tab1[0];
  sing(ton0);
  num++;
  display(1,0);
 }
void key14(void)//2
 {uint ton0;
  tn0=XBYTE[num]=tab1[1];
  sing(ton0);
   num++;
  display(2,0);
  }
void key15(void)//3
 {
   uint ton0;
  tn0=XBYTE[num]=tab1[2];
  sing(ton0);
   num++;
  display(3,0);
  }
void key16(void)//4
 {
   uint ton0;
  tn0=XBYTE[num]=tab1[3];
  sing(ton0);
   num++;
  display(4,0);
   }
void key9(void)   //5
{uint ton0;
  tn0=XBYTE[num]=tab1[4];
  sing(ton0);
  num++;
 display(5,0);
 }
void key10(void)  //6
{
  uint ton0;
  tn0=XBYTE[num]=tab1[5];
  sing(ton0);
  num++;
  display(6,0);
 }
void key11(void)  //7
{
  uint ton0;
  tn0=XBYTE[num]=tab1[6];
  sing(ton0);
  num++;
  display(7,0);
}
void key12(void)  //0
{
  uint ton0;
  tn0=XBYTE[num]=tab1[7];
  sing(ton0);
  num++;
 display(0,0);
}

void key5(void)//1/4拍
 {
   XBYTE[num]=tab1[8];
  num++;
  display(1,2);
 
  }
void key6(void)//2/4拍
 {
   XBYTE[num]=tab1[9];
  num++;
  display(2,2);
 }
void key7(void)//3/4拍
 {
   XBYTE[num]=tab1[10];
   num++;
   display(3,2);
  }
void key8(void)//4/4拍
 {
   XBYTE[num]=tab1[11];
   num++;
   display(4,2);
 }

void key1(void)//存歌曲
 { 
   ton=0x00;
   num=0;
   TR0=0;
 display(1,4);
 }
void key2(void)//开始唱弹的音乐
{
  flag=1;
  n=0;
  TR0=1;
  display(2,4);
 
  }
void key3(void)//开始唱《八月桂花香》
{ 
  flag=0;
   n=500;
   TR0=1;
  display(3,4);
}
void key4(void)//调整音节
{
region++;
if(region==4)region=0;
  display(4,4);
}


//8279的中断服务程序,跳转到相应键的服务程序
void int1_8279(void) interrupt 2 using 1
{
 uchar k;	
	EA=0;
	k=key_scan();
	 if(k==0)key13();
	else if(k==1)key9();
	else if(k==2)key10();
	else if(k==3)key11();
	else if(k==13)key12();
	else if(k==10)key14();
	else if(k==11)key15();
	else if(k==12)key16();
	else if(k==4)key5();
	else if(k==5)key6();
	else if(k==6)key7();
	else if(k==14)key8();
	else if(k==7)key1();
	else if(k==8)key2();
	else if(k==9)key3();
    else if(k==15)key4();
    EA=1;
}
void time0_int(void) interrupt 1
{
 TR0=0;
 in++;
 if(in==time)
  {
    
    in=0;
	ton=XBYTE[n];
    n++;
    time=XBYTE[n];
    n++;
	if(flag==0)
	 {
	 if(n==690)n=500;
	 }
	else if(flag==1)
	 {
	  if(n==num) n=0;
	 }
   }
 TH0=0XD8;
 TL0=0XEF;
 TR0=1;
}

void sing(void)
{
 uchar g,j;
 pow=1-pow;
 P10=pow;
 for(g=0;g<ton;g++)
   for(j=0;j<region;j++);
   
//ton
}
void storage(void)
{uchar k;
  int keep=500;
 for(k=0;k<190;k++)
 {
  XBYTE[keep]=flower[k];
  keep++;
 }
}

void main(void)
{
 TMOD=0X01;
 TH0=0XD8;
 TL0=0XEF;
  ET0=1; 
  P10=0; 
 TR0=0;  
 storage();           
 COM8279=0xd1;  //总清除
	do
	{
	ACC=COM8279;
	}while(ACC7==1);
	COM8279=0x27;	//时钟分频系数=7
	COM8279=0x00;   //8*8字符显示,左边输入,编码扫描键盘,双键封锁
	COM8279=0x50;   //读FnumFO RAM命令
	COM8279=0x90;   //写显示RAM(数码管选择)
	             //中断设置
	EX1=1;
	EA=1;
	IT1=1;
	 
while(1)
 {;}   //等待键盘输入
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -