📄 music-teaching.c
字号:
#include "reg51.h"
#include "intrins.h"
#include "ABSACC.h"
#define DELAY5US _nop_();
#define WR_DATA XBYTE[0x2001]
#define RD_DATA XBYTE[0x2003]
#define WR_CODE XBYTE[0x2000]
#define RD_CODE XBYTE[0x2002]
#define WSLA1 0x70
#define RSLA1 0x71
sbit RST=P1^6;
sbit CSA=P1^5;
sbit SDA=P1^0;
sbit SCL=P1^1;
sbit BUTTON=P1^2;
sbit P1_7=P1^7;
sbit P3_3=P3^3;
void DO();
void RA();
void MI();
void FA();
void SO();
void LA();
void XI();
void HDO();
void PAUSE();
void START(void);
void OVER(void);
void MACK(void);
void NMACK(void);
void CACK(void);
void WRBYT(unsigned char *p);
void RDBYT(unsigned char *p);
void WRNBYT(unsigned char *R3,unsigned char *R2,unsigned char *R0,unsigned char n);
void RDNBYT(unsigned char *R3,unsigned char *R4,unsigned char *R2,unsigned char *R0,unsigned char n);
void DISP_x(unsigned char x, unsigned char y, unsigned char ctxt);
void DISP_shu(unsigned char x, unsigned char y, unsigned char ctxt);
void DISP_white();
void DISP_0(unsigned char x, unsigned char y, unsigned char d);
void LCD_symbol(unsigned char temp);
void sound_note(unsigned char u,unsigned char v);
void LCD_lyric(unsigned char temp);
void sound_music(unsigned char *c);
void DELAY();
void BF();
unsigned char code a[8]={0xec,0xfc,0x00,0xb6,0xee,0x1c,0x9c,0x8e};
unsigned char showout[8];
unsigned char temp[1]={0};
unsigned char tem=0;
unsigned char i,j;
const unsigned char code TAB_1[8]={0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00}; //1的字符码
const unsigned char code TAB_2[8]={0x00,0x42,0x61,0x51,0x49,0x46,0x00,0x00}; //2的字符码
const unsigned char code TAB_3[8]={0x00,0x21,0x41,0x45,0x4B,0x31,0x00,0x00}; //3的字符码
const unsigned char code TAB_4[8]={0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00}; //4的字符码
const unsigned char code TAB_5[8]={0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00}; //5的字符码
const unsigned char code TAB_6[8]={0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00}; //6的字符码
const unsigned char code TAB_7[8]={0x00,0x00,0x01,0x79,0x05,0x03,0x00,0x00}; //7的字符码
const unsigned char code TAB_8[8]={0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00}; //8的字符码
const unsigned char code TAB_9[8]={0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00}; //9的字符码
const unsigned char code TAB_a[8]={0x00,0x00,0x38,0x44,0x44,0x38,0x40,0x00}; //A的字符码
const unsigned char code TAB_b[8]={0x00,0x41,0x7F,0x49,0x49,0x36,0x00,0x00}; //B的字符码
const unsigned char code TAB_c[8]={0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00}; //C的字符码
const unsigned char code TAB_d[8]={0x00,0x41,0x7F,0x41,0x41,0x3E,0x00,0x00}; //D的字符码
const unsigned char code TAB_e[8]={0x00,0x00,0x38,0x54,0x54,0x58,0x00,0x00}; //E的字符码
const unsigned char code TAB_f[8]={0x00,0x00,0x10,0xfc,0x12,0x14,0x00,0x00}; //F的字符码
const unsigned char code TAB_g[8]={0x00,0x00,0x4c,0x92,0x92,0x7c,0x00,0x00}; //G的字符码
const unsigned char code TAB_h[8]={0x00,0x00,0x7e,0x08,0x08,0x70,0x00,0x00}; //H的字符码
const unsigned char code TAB_i[8]={0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00}; //I的字符码
const unsigned char code TAB_j[8]={0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00}; //J的字符码
const unsigned char code TAB_k[8]={0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00}; //K的字符码
const unsigned char code TAB_l[8]={0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00}; //L的字符码
const unsigned char code TAB_m[8]={0x00,0x00,0x78,0x04,0x78,0x04,0x78,0x00}; //M的字符码
const unsigned char code TAB_n[8]={0x00,0x00,0x78,0x04,0x04,0x78,0x00,0x00}; //N的字符码
const unsigned char code TAB_o[8]={0x00,0x00,0x38,0x44,0x44,0x38,0x00,0x00}; //O的字符码
const unsigned char code TAB_p[8]={0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00}; //P的字符码
const unsigned char code TAB_q[8]={0x00,0x3E,0x41,0x51,0x21,0x5E,0x00,0x00}; //Q的字符码
const unsigned char code TAB_r[8]={0x00,0x00,0x78,0x08,0x04,0x08,0x00,0x00}; //R的字符码
const unsigned char code TAB_s[8]={0x00,0x00,0x18,0x54,0x54,0x20,0x00,0x00}; //S的字符码
const unsigned char code TAB_t[8]={0x00,0x00,0x08,0x7c,0x48,0x28,0x00,0x00}; //T的字符码
const unsigned char code TAB_u[8]={0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00}; //U的字符码
const unsigned char code TAB_v[8]={0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00}; //V的字符码
const unsigned char code TAB_w[8]={0x00,0x00,0x18,0x20,0x18,0x20,0x18,0x00}; //W的字符码
const unsigned char code TAB_x[8]={0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00}; //X的字符码
const unsigned char code TAB_y[8]={0x00,0x00,0x4e,0x50,0x50,0x3e,0x00,0x00}; //Y的字符码
const unsigned char code TAB_z[8]={0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00}; //Z的字符码
const unsigned char code TAB_SP[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //空格的字符码
const unsigned char code h[8]={0x21,0xe0,0x8b,0xd7,0x67,0xe8,0x5b,0x8e};
const unsigned char code l[8]={0xf9,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc,0xfc};
const unsigned char code s[]={1,1,1,1,5,1,1,1,7,1,2,1,3,3,3,3,1,3,3,3,2,3,4,3,5,1,5,1};
const unsigned char code o[]={1,2,3,2,1,5,6,5,6,6,1,2,3,2,1,5,6,7,1,1,2,3,2,1,5,6,5,6,6,1,2,3,2,1,5,6,7,1};
const unsigned char* code pcharAddr[36]={ TAB_1,TAB_2,TAB_3,TAB_4,TAB_5, TAB_6,
TAB_7,TAB_8,TAB_9,TAB_a,TAB_b,TAB_c,TAB_d,TAB_e,TAB_f,TAB_g,TAB_h,TAB_i,TAB_j,TAB_k,TAB_l,TAB_m,TAB_n,TAB_o,TAB_p,TAB_q,TAB_r,TAB_s,TAB_t,TAB_u,TAB_v,TAB_w,TAB_x,TAB_y,TAB_z,TAB_SP};
const unsigned char code disps1[]={'s','i','n','g','s','i','n','g','t','o','g','e','t','h','e','r'};
const unsigned char code disps2[]={' ','m','e','r','r','i','l','y',' ','m','e','r','r','i','l','y'};
const unsigned char code disps3[]={' ',' ','s','i','n','g',' ',' ','s','i','n','g',' ',' ',' ',' '};
const unsigned char code disps4[]={' ','s','i','n','g',' ','s','i','n','g',' ','s','i','n','g',' '};
const unsigned char code dispo1[]={' ','s','h','a','l','l',' ','w','e',' ','g','o',' ','a',' ',' '};
const unsigned char code dispo2[]={' ','f','l','y','i','n','g',' ',' ','f','l','y','i','n','g',' '};
const unsigned char code dispo3[]={' ','s','h','a','l','l',' ','w','e',' ','g','o',' ','a',' ',' '};
const unsigned char code dispo4[]={' ','f','l','y',' ','t','o',' ','t','h','e',' ','m','o','o','n'};
const unsigned char code classon[8]={0x00,0x01,0x02,0x03,0x03,0x04,0x05,0x06};
const unsigned char code classoff[8]={0x07,0x07,0x01,0x03,0x03,0x04,0x05,0x06};
void main()
{
unsigned char n,i,WSLA=WSLA1,in_add=0x10,*inside,*woutside,*target;
if(BUTTON)
{for(i=0;i<8;i++)
showout[i]=a[classon[i]];}
else
{for(i=0;i<8;i++)
showout[i]=a[classoff[i]];}
P1_7=0;
DELAY();
P1_7=1;
EA=1;
EX0=1;
IT0=1;
while(1)
{
if(BUTTON)
{for(i=0;i<8;i++)
showout[i]=a[classon[i]];}
else
{for(i=0;i<8;i++)
showout[i]=a[classoff[i]];}
woutside=&WSLA;
inside=&in_add;
target=showout;
n=8;
WRNBYT(woutside,inside,target,n);
DELAY();
tem=temp[0];
while(tem!=0)
{switch(tem)
{ case 0x01 :DO();break;
case 0x02 :RA();break;
case 0x03 :MI();break;
case 0x04 :FA();break;
case 0x05 :SO();break;
case 0x06 :LA();break;
case 0x07 :XI();break;
case 0x08 :HDO();break;
case 0x09 :PAUSE();break;
case 0x0a :START();break;
case 0x0b :OVER();break;
}
}
}
}
void INT_7290()interrupt 0 using 0
{ unsigned char n=4,registe[4],*woutside,*routside,*inside,*target,in_add=0x00,WSLA=WSLA1,RSLA=RSLA1;
target=registe;
inside=&in_add;
woutside=&WSLA;
routside=&RSLA;
RDNBYT(woutside,routside,inside,target,n);
temp[0]=registe[1];
if(BUTTON)
{for(i=0;i<8;i++)
showout[i]=a[classon[i]];}
else
{for(i=0;i<8;i++)
showout[i]=a[classoff[i]];}
target=showout;
}
void DELAY()
{unsigned char i,j;
for(i=0;i<255;i++)
for(j=0;j<255;j++);
}
void DO()
{i=0x21;
j=0xf9;
LCD_symbol(tem);
sound_note(i,j);
}
void RA()
{i=0xe0;
j=0xf9;
LCD_symbol(tem);
sound_note(i,j);
}
void MI()
{i=0x8b;
j=0xfa;
LCD_symbol(tem);
sound_note(i,j);
}
void FA()
{i=0xd7;
j=0xfa;
LCD_symbol(tem);
sound_note(i,j);
}
void SO()
{i=0x67;
j=0xfb;
LCD_symbol(tem);
sound_note(i,j);
}
void LA()
{i=0x8e;
j=0xfb;
LCD_symbol(tem);
sound_note(i,j);
}
void XI()
{i=0x5b;
j=0xfc;
LCD_symbol(tem);
sound_note(i,j);
}
void HDO()
{i=0x8e;
j=0xfc;
LCD_symbol(tem);
sound_note(i,j);
}
void PAUSE()
{i=0x8e;
j=0xfc;
sound_note(i,j);
DELAY();
DELAY();
DELAY();
sound_note(i,j);
}
void START()
{LCD_lyric(tem);
sound_music(s);
}
void OVER()
{LCD_lyric(tem);
sound_music(o);
}
void LCD_symbol(unsigned char temp)
{
unsigned char x; //x页地址(第一页)
unsigned char i,shu,z; //z:列位置(0-15)
unsigned char disp[]={' ','t', 'h','e',' ','n','o','t','e',' ','i','s',' ', ' ',' ',
' '}; //待显示的(<=16个)ASCII码
unsigned char cdata=temp; //待现显示的数据
RST=0; //液晶模块复位
DELAY();
RST=1;
DISP_white(); //全白屏显示
DELAY();
DELAY();
DELAY();
DELAY();
//显示一行字符(disp数组)自左向右128列(16个字符)
CSA=1;
BF();
x=5; //设定显示行起始位置(0-7)
z=0; //显示的列位置(0-15)
for(i=z;i<sizeof(disp);i++) //for循环,循环次数由disp的元素决定
{
if(i<8)
{ //如果是前8个字符则选择左半屏
CSA=1;
BF();
WR_CODE=0x3f; //写入"开显示"命令
BF();
WR_CODE=0xc0; //写入z地址()
DISP_x(x,i,disp[i]);
}
else //第9个字符从右半屏开始显示
{
CSA=0;
BF();
WR_CODE=0x3f;
BF();
WR_CODE=0xc0;
DISP_x(x,i-8,disp[i]);
}
}
DELAY();
DELAY();
DELAY();
DELAY();
// 显示数据(char型数据00-0xff转换成3位BCD码)
BF();
WR_CODE=0x3f;
BF();
WR_CODE=0xc0;
x=5; //给定页(行)位置(0-7)
z=11; //给定起始列位置(0-15)实际上为0-12(因为数据占3位)
shu=cdata; //要显示的char型数据
DISP_shu(x,z,shu); //调数字显示函数(具有自动换屏功能)
DELAY();
DELAY();
DELAY();
DELAY();
}
void LCD_lyric(unsigned char temp)
{
unsigned char x; //x页地址(第一页)
unsigned char i,z; //z:列位置(0-15)
unsigned char disp[8];
unsigned char *p;
if(temp==0x0a)
{
//-------------------------------------------------------------------------//
p=disps1;
RST=0; //液晶模块复位
DELAY();
RST=1;
DISP_white(); //全白屏显示
DELAY();
DELAY();
DELAY();
DELAY();
//显示一行字符(disp数组)自左向右128列(16个字符)
CSA=1;
BF();
x=1; //设定显示行起始位置(0-7)
z=0; //显示的列位置(0-15)
for(i=z;i<sizeof(disp);i++) //for循环,循环次数由disp的元素决定
{
if(i<8)
{ //如果是前8个字符则选择左半屏
CSA=1;
BF();
WR_CODE=0x3f; //写入"开显示"命令
BF();
WR_CODE=0xc0; //写入z地址()
DISP_x(x,i,p[i]);
}
else //第9个字符从右半屏开始显示
{
CSA=0;
BF();
WR_CODE=0x3f;
BF();
WR_CODE=0xc0;
DISP_x(x,i-8,p[i]);
}
}
DELAY();
DELAY();
DELAY();
DELAY();
//--------------------------------------------//
p=disps2;
//显示一行字符(disp数组)自左向右128列(16个字符)
CSA=1;
BF();
x=3; //设定显示行起始位置(0-7)
z=0; //显示的列位置(0-15)
for(i=z;i<sizeof(disp);i++) //for循环,循环次数由disp的元素决定
{
if(i<8)
{ //如果是前8个字符则选择左半屏
CSA=1;
BF();
WR_CODE=0x3f; //写入"开显示"命令
BF();
WR_CODE=0xc0; //写入z地址()
DISP_x(x,i,p[i]);
}
else //第9个字符从右半屏开始显示
{
CSA=0;
BF();
WR_CODE=0x3f;
BF();
WR_CODE=0xc0;
DISP_x(x,i-8,p[i]);
}
}
DELAY();
DELAY();
DELAY();
DELAY();
//---------------------------------------------//
p=disps3;
//显示一行字符(disp数组)自左向右128列(16个字符)
CSA=1;
BF();
x=5; //设定显示行起始位置(0-7)
z=0; //显示的列位置(0-15)
for(i=z;i<sizeof(disp);i++) //for循环,循环次数由disp的元素决定
{
if(i<8)
{ //如果是前8个字符则选择左半屏
CSA=1;
BF();
WR_CODE=0x3f; //写入"开显示"命令
BF();
WR_CODE=0xc0; //写入z地址()
DISP_x(x,i,p[i]);
}
else //第9个字符从右半屏开始显示
{
CSA=0;
BF();
WR_CODE=0x3f;
BF();
WR_CODE=0xc0;
DISP_x(x,i-8,p[i]);
}
}
DELAY();
DELAY();
DELAY();
DELAY();
//------------------------------------------------------------//
p=disps4;
//显示一行字符(disp数组)自左向右128列(16个字符)
CSA=1;
BF();
x=7; //设定显示行起始位置(0-7)
z=0; //显示的列位置(0-15)
for(i=z;i<sizeof(disp);i++) //for循环,循环次数由disp的元素决定
{
if(i<8)
{ //如果是前8个字符则选择左半屏
CSA=1;
BF();
WR_CODE=0x3f; //写入"开显示"命令
BF();
WR_CODE=0xc0; //写入z地址()
DISP_x(x,i,p[i]);
}
else //第9个字符从右半屏开始显示
{
CSA=0;
BF();
WR_CODE=0x3f;
BF();
WR_CODE=0xc0;
DISP_x(x,i-8,p[i]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -