📄 music-teaching.c
字号:
}
}
DELAY();
DELAY();
DELAY();
DELAY();
}
else
{
//-------------------------------------------------------------------------//
p=dispo1;
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=dispo2;
//显示一行字符(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]);
}
}
DELAY();
DELAY();
DELAY();
DELAY();
}
}
void DISP_x(unsigned char x, unsigned char y, unsigned char ctxt)
{
//一行字符显示函数:将disp[]数组提供的ASCII码的字符串显示在所需要的行上(0-7行)
// 形参说明:x:页数据(0-7)、y:列位置(0-15)、ctxt:字符表首地址
unsigned char i,z;
BF();
x=x+0xb8; //将行位置转换为页地址(0-7行转换为B8H-BFH)
WR_CODE=x; //写入页地址
BF();
if(y>7) //如果列位置超过7则转换为右半屏并转换为0-7
y=y-8; //将列位置大于7的数据转换为0-7
z=y*8+0x40; //列位置转换为列地址(一个字符要占8列位置)
WR_CODE=z; //写入列地址
BF();
if(ctxt<='9' && ctxt>='0') //将DISP[]数组中的ASCII码转换为可查表的数据
{ //如果是0-9的ASCII码
for(i=0;i<8;i++)
WR_DATA=pcharAddr[ctxt-48][i]; //将此数据-30H得数字本身(30H-39H转换为0-9)
}
else if(ctxt<='z' && ctxt>='a') //如果是大写的字母A-Z,则-41H,再加10
{
for(i=0;i<8;i++)
WR_DATA=pcharAddr[ctxt-97+10][i];
}
else if(ctxt==' ')
{
for(i=0;i<8;i++)
WR_DATA=pcharAddr[36][i];
}
}
void DISP_shu(unsigned char x, unsigned char z, unsigned char ctxt) //显示3位BCD数据
{ //x显示的行位置,z列位置,ctxt要显示的char型数据
if(z<8) // 如果列位置小于8则从左半屏开始
CSA=1;
else CSA=0; //如果列位置大于等于8则从右半屏开始显示
DISP_x(x,z,ctxt/100+48); //将一个char型数据数据的百位进行拆分并转换为ASCII码
z=z+1; //列位置加一
BF();
WR_CODE=0x3f;
BF();
WR_CODE=0xc0;
if(z<8)
CSA=1;
else CSA=0;
DISP_x(x,z,(ctxt-ctxt/100*100)/10+48); //将char型数据的十位进行拆分并转换为ASCII码
z=z+1;
BF();
WR_CODE=0x3f;
BF();
WR_CODE=0xc0;
if(z<8)
CSA=1;
else CSA=0;
DISP_x(x,z,ctxt%10+48); //将一个char型数据数据的个位进行拆分并转换为ASCII码
}
void DISP_white() //全白屏显示函数
{ unsigned char x=0xb8,y=0x40,d;
d=0x00;
CSA=1;
BF();
WR_CODE=0x3f;
BF();
WR_CODE=0xc0;
DISP_0(x,y,d);
CSA=0;
BF();
WR_CODE=0x3f;
BF();
DISP_0(x,y,d);
}
void BF()
{
while((RD_CODE&0x80)==0x08);
}
void sound_music(unsigned char *c)
{
unsigned char i,j;
TMOD=0x11;
TR1=1;
TL0=0xc6;
TH0=0xff;
for(i=0;i<64;i++)
{
TL1=h[c[i]];
TH1=l[c[i]];
//i++;
for(j=0;j<5;j++)
{
do{
while(TF1!=1);
TF1=0;
TL1=h[c[i-1]];
TH1=l[c[i-1]];
if(c[i-1]==0)
P3_3=P3_3;
else
P3_3=~P3_3;
TR0=1;
}
while(TF0!=1);
TF0=0;
//TL0=0xc6;
//TH0=0xff;
//TR0=0;
}
}
TR0=0;
TR1=0;
}
void DISP_0(unsigned char x, unsigned char y, unsigned char d) //半屏显示函数
{ unsigned char i; //x:起始页地址
do //y:起始列地址
{ //d:要写入的数据
BF();
WR_CODE=x;
BF();
WR_CODE=y;
for(i=0;i<64;i++) //for循环64次(某行64列的操作)
{ BF();
WR_DATA=d; //写入数据
}
x++; //换页
}while(x!=0xc0);
}
void sound_note(unsigned char u,unsigned char v)
{unsigned char m;
for(m=0x00;m<=0x50;m++)
{TL1=u;
TH1=v;
while(TF1!=1);
TF1=0;
TL1=u;
TH1=v;
P3_3=~P3_3;
DELAY();
DELAY();
P3_3=1;}
}
//#################################################################################
void STA(void) //启动信号子函数
{ SDA=1;
SCL=1;
DELAY5US
SDA=0;
DELAY5US
SCL=0;
}
//#################################################################################
void STOP(void) //停止信号子函数
{ SDA=0;
SCL=1;
DELAY5US
SDA=1;
DELAY5US
}
//#################################################################################
void MACK(void) //应答信号子函数
{ SDA=0;
SCL=1;
DELAY5US
SCL=0;
SDA=1;
}
//#################################################################################
void NMACK(void) //非应答信号子函数
{ SDA=1;
SCL=1;
DELAY5US
SCL=0;
SDA=0;
}
//#################################################################################
void CACK(void) //应答检测子程序
{
SDA=1;
SCL=1;
DELAY5US
F0=0;
if(SDA==1)
F0=1;
SCL=0;
}
//#################################################################################
// 发送一字节子数据程序 WRBYT
//#################################################################################
void WRBYT(unsigned char *p)
{ unsigned char i=8,temp;
temp=*p;
while(i--)
{ if((temp&0x80)==0x80)
{ SDA=1;
SCL=1;
DELAY5US
SCL=0;
}
else
{ SDA=0;
SCL=1;
DELAY5US
SCL=0;
}
temp=temp<<1;
}
}
//#################################################################################
// 接收一字节子数据程序 RDBYT
//#################################################################################
void RDBYT(unsigned char *p)
{ unsigned char i=8,temp=0;
while(i--)
{ SDA=1;
SCL=1;
DELAY5US
temp=temp<<1;
if(SDA==1)
temp=temp|0x01;
else
temp=temp&0xfe;
SCL=0;
}
*p=temp;
}
//#################################################################################
// 发送N个字节子数据程序 WRNBYT
//#################################################################################
void WRNBYT(unsigned char *R3,unsigned char *R2,unsigned char *R0,unsigned char n)
{
loop: STA();
WRBYT(R3);
CACK();
if(F0)
goto loop;
WRBYT(R2);
CACK();
if(F0)
goto loop;
while(n--)
{ WRBYT(R0);
CACK();
if(F0)
goto loop;
R0++;
}
STOP();
}
//#################################################################################
// 接收N个字节子数据程序 RDNBYT
//#################################################################################
//【子函数入口参数说明】:
//R3是外部器件地址写,R4是外部器件地址读,R2是从器件内部子地址,R0是目标数据块首地址,//n是要读的字节数
void RDNBYT(unsigned char *R3,unsigned char *R4,unsigned char *R2,unsigned char *R0,unsigned char n)
{
loop1: STA();
WRBYT(R3);
CACK();
if(F0)
goto loop1;
WRBYT(R2);
CACK();
if(F0)
goto loop1;
STA();
WRBYT(R4);
CACK();
if(F0)
goto loop1;
while(n--)
{ RDBYT(R0);
if(n>0)
{
MACK();
R0++;
}
else NMACK();
}
STOP();
}
//#################################################################################
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -