/*******************************************************************************
*
* 广西科技大学电气学院
*
*
--------------------------------------------------------------------------------
* 实 验 名 : LCD1602显示试验
* 实验说明 : LCD1602显示Pechin Science
* 连接方式 : 见连接图
* 注 意 :
*******************************************************************************/
#include
#define uchar unsigned char
#define uint unsigned int
/**********************************
PIN口定义
**********************************/
#define LCD1602_DATAPINS P0
sbit LCD1602_E = P2 ^ 7;
sbit LCD1602_RW = P2 ^ 5;
sbit LCD1602_RS = P2 ^ 6;
sbit P1_0=P1^7; // 扬声器输出口
#define key_p P3 //按键输入口
int m,i=0;
int tri;
int l;
int x=0,y=2;
playc(char ch);
char code toneh[14]=
{0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,};
char code tonel[14]=
{0x22,0x56,0x85,0x9A,0xC1,0xE3,0x03,0x10,0x2B,0x42,0x4C,0x60,0x71,0x81};
//歌曲乐谱
char code song1[]="222322113336622552223221133336622550531141255311432536653326425434332321034554330217023443332";
char code song2[]="167176671111322225777711105666611667665555003111132222355531110566662661166550665054667705111";
char code song3[]="356665533566655335544332230332133665511666615623000356663550000230232161250330334332402230232";
char code length[]="444444444444444422224422224422224444444444";
/*在51单片机12MHZ时钟下的延时函数*/
void Lcd1602_Delay1ms(uint c); //误差 0us
/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);
/*LCD1602写入8位数据子函数*/
void LcdWriteData(uchar dat);
/*LCD1602初始化子程序*/
void LcdInit();
/*显示行数子程序*/
void DisplayOneChar(uchar x,uchar y, uchar ddata);
/*显示函数子程序*/
void display(uchar *ddata,x,y);
/*按键控制函数子程序*/
void key();
//音乐部分
void timer0(void) interrupt 1 using 1 //计时器1
{
P1_0=~P1_0;
TH0=toneh[tri];
TL0=tonel[tri];
}
void timer1(void) interrupt 3 using 3 //计时器2
{
TH1=0xCA;
TL1=0xFE;
m++;
key();
}
/*******************************************************************************
* 函 数 名 : Lcd1602_Delay1ms
* 函数功能 : 延时函数,延时1ms
* 输 入 : c
* 输 出 : 无
* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/
int playc(char ch)
{
int ti;
switch(ch)
{
case'q':ti=0;break;
case'w':ti=1;break;
case'e':ti=2;break;
case'r':ti=3;break;
case't':ti=4;break;
case'y':ti=5;break;
case'u':ti=6;break;
case'1':ti=7;break;
case'2':ti=8;break;
case'3':ti=9;break;
case'4':ti=10;break;
case'5':ti=11;break;
case'6':ti=12;break;
case'7':ti=13;break;
case' ':ti=50;break;
default:ti=50;break;
}
if(ti==50)return (100);
else return ti;
}
/*******************************************************************************
* 函 数 名 : Lcd1602_Delay1ms
* 函数功能 : 延时函数,延时1ms
* 输 入 : c
* 输 出 : 无
* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/
void Lcd1602_Delay1ms(uint c) //误差 0us
{
uchar a, b;
for (; c>0; c--)
{
for (b = 199; b>0; b--)
{
for (a = 1; a>0; a--);
}
}
}
/*******************************************************************************
* 函 数 名 : LcdWriteCom
* 函数功能 : 向LCD写入一个字节的命令
* 输 入 : com
* 输 出 : 无
*******************************************************************************/
void LcdWriteCom(uchar com) //写入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //选择发送命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1); //等待数据稳定
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
/*******************************************************************************
* 函 数 名 : LcdWriteData
* 函数功能 : 向LCD写入一个字节的数据
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //写入数据
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
/*******************************************************************************
* 函 数 名 : LcdInit()
* 函数功能 : 初始化LCD屏
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //开显示
LcdWriteCom(0x0c); //开显示不显示光标
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x80); //设置数据指针起点
}
/*****************************************************************************
*函数名 :DisplayOneChr(uchar x,uchar y, uchar ddata)
*函数功能 :显示行数的设定
* 输 入 : x,y ddata
* 输 出 : 无
*******************************************************************************/
void DisplayOneChar(uchar x,uchar y, uchar ddata)
{
y&=1;
x&=15;
if(y)x|=0x40;
x|=0x80;
LcdWriteCom(x);
LcdWriteData(ddata);
}
/*****************************************************************************
*函数名 :display(uchar *ddata,x,y)
*函数功能 :显示函数
* 输 入 : x,y *ddata
* 输 出 : 无
*******************************************************************************/
void display(uchar *ddata,x,y)
{
uchar lis=0;
y&=0x01;
x&=0x0f;
while(x<16)
{
DisplayOneChar(x,y,ddata[lis]);
lis++;
x++;
}
}
/*******************************************************************************
* 函 数 名 : key()
* 函数功能 : 按键控制函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void key()
{
uchar key1;
key_p=0XFF;
key1=key_p;
if(key1!=0xFF)
{
Lcd1602_Delay1ms(1);
key_p=0xFF;
key1=key_p;
if(key1!=0xFF)
{
key1=key_p;
switch(key1)
{
case 0xFE:x=1; break;
case 0xFD:x=2; break;
case 0xFB:x=3; break;
case 0xF7:y=1; break;
case 0xEF:y=~y; break;
default : break;
}
}
}
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main(void)
{
//--定变量--//
uchar *s1,*s2,*s3,*h,*h1,*h2,*h3,*h4;
//uchar z;
uchar xi=16;
m=0;TMOD=0x11;
P1_0=0;
TH0=toneh[0];
TL0=tonel[0];
TH1=0xCE;
TL1=0xFE;
IP=0x08;
EA=1;
LcdInit();
s1=" I LOVE Chopin ";
s2=" MY LOVE ";
s3=" Without You ";
h=" Hello Music ";
h1=" Music 1: ";
h2=" Music 2: ";
h3=" Music 3: ";
h4=" Music is OVER ";
display(h,0,0) ;
Lcd1602_Delay1ms(10);
while(1)
{
key();
if(x==1) {display(h1,0,0);display(s1,0,1); }
if(x==2) {x=2;display(h2,0,0);display(s2,0,1); }
if(x==3) {display(h3,0,0);display(s3,0,1); }
if(y==1)
{
switch(x){
case 1:
for(i=0;i<93;i++)
{
ET1=1; TR1=1;
ET0=1; TR0=1;
while(!y){P1_0=1;}
xi=xi%16;
display(s1,xi,1);
xi--;
tri=playc(song1[i]);
l=length[i]-0x03;
while(m