📄
字号:
//龙图开发网收集整理: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 + -