📄 lcd.c
字号:
/* 版权所有,请勿用于商业目的,仅供学习参考,以下为程序说明:
程序中所引用的歌曲16进制数值,均从WAV歌曲文件中提取,其中WAV文件以8000HZ采样8位编码,DAC0832同样
以8000HZ采样8位编码恢复波形,通过示波器观察声音波形
程序中3首歌曲均选取WAV文件中的192个采样点即24ms时间的波形
*/
#include<reg52.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table1[]="The 1th oneM:6.7 m:3.5 24ms";
uchar code table2[]="The 2th oneM:6.1 m:4.5 24ms";
uchar code table3[]="The 3th oneM:6.8 m:3.0 24ms";
uchar code tableFailure[]="Failure!Not Defined!";
uchar code Music1[]={ 0x72,0x75,0x6C,0x78,0x78,0x7E,0x85,0x7E,0x86,0x77,0x7A,0x75,0x6A,0x76,0x6C,0x7B,
0x7A,0x7B,0x83,0x75,0x7A,0x6F,0x71,0x6E,0x70,0x70,0x7B,0x7C,0x8F,0x8D,0x95,0x95,
0x94,0x93,0x93,0x95,0x99,0x98,0xA0,0x9B,0x9E,0x9E,0x9A,0x9B,0x9A,0x97,0x96,0x8E,
0x93,0x8A,0x90,0x89,0x8A,0x86,0x81,0x7F,0x77,0x79,0x74,0x7A,0x72,0x7A,0x70,0x75,
0x67,0x6D,0x5A,0x65,0x59,0x62,0x61,0x60,0x69,0x60,0x70,0x65,0x71,0x68,0x6A,0x67,
0x65,0x6A,0x6A,0x71,0x74,0x75,0x78,0x77,0x74,0x7F,0x6F,0x75,0x6D,0x69,0x73,0x6C,
0x81,0x7A,0x89,0x8B,0x90,0x94,0x9E,0x98,0xAC,0x9E,0xAA,0x9E,0x98,0x97,0x8F,0x99,
0x97,0x9E,0xA5,0xA0,0xAA,0xA0,0x9F,0x99,0x8A,0x8C,0x7F,0x80,0x86,0x82,0x8F,0x8A,
0x89,0x87,0x7E,0x85,0x75,0x80,0x71,0x7D,0x73,0x80,0x75,0x7C,0x72,0x71,0x70,0x6C,
0x75,0x6C,0x75,0x71,0x72,0x70,0x6D,0x6C,0x67,0x6C,0x6B,0x6F,0x70,0x74,0x74,0x77,
0x72,0x76,0x6C,0x71,0x62,0x6C,0x62,0x6D,0x72,0x75,0x80,0x7D,0x88,0x88,0x88,0x8F,
0x85,0x91,0x87,0x94,0x93,0x95,0x9D,0x9B,0xA0,0xA0,0x9E,0x9A,0x9A,0x93,0x94,0x8D,0x00};
uchar code Music2[]={ 0x79,0x85,0x78,0x8F,0x75,0x8D,0x77,0x8D,0x75,0x94,0x74,0x90,0x77,0x91,0x76,0x94,
0x76,0x92,0x78,0x94,0x7B,0x90,0x7E,0x8C,0x7F,0x8B,0x83,0x85,0x84,0x85,0x81,0x86,
0x82,0x85,0x83,0x87,0x88,0x88,0x88,0x87,0x86,0x80,0x88,0x7E,0x86,0x81,0x82,0x7A,
0x81,0x77,0x85,0x81,0x85,0x7E,0x81,0x7A,0x83,0x7E,0x84,0x7E,0x7F,0x80,0x7E,0x7B,
0x7E,0x80,0x7E,0x84,0x81,0x7E,0x85,0x83,0x87,0x84,0x87,0x7C,0x86,0x7B,0x85,0x7C,
0x87,0x7E,0x87,0x7D,0x85,0x7A,0x88,0x81,0x89,0x7A,0x89,0x78,0x86,0x7A,0x85,0x73,
0x84,0x73,0x83,0x77,0x86,0x7B,0x84,0x7D,0x82,0x78,0x7F,0x76,0x80,0x77,0x7F,0x72,
0x7D,0x75,0x7D,0x79,0x82,0x7D,0x80,0x7C,0x7C,0x77,0x81,0x79,0x7E,0x75,0x7B,0x74,
0x7D,0x7C,0x80,0x82,0x7C,0x81,0x7A,0x84,0x7B,0x86,0x7B,0x81,0x77,0x7D,0x77,0x7F,
0x7A,0x82,0x74,0x80,0x75,0x88,0x7B,0x8E,0x7A,0x8B,0x78,0x86,0x7C,0x88,0x7F,0x8F,
0x78,0x90,0x79,0x96,0x7E,0x9B,0x7D,0x9C,0x7E,0x96,0x83,0x93,0x85,0x96,0x83,0x92,
0x82,0x97,0x83,0x96,0x83,0x8F,0x80,0x8C,0x80,0x7E,0x81,0x76,0x82,0x78,0x80,0x75,0x00};
uchar code Music3[]={ 0x75,0x6C,0x75,0x71,0x78,0x77,0x73,0x69,0x75,0x65,0x74,0x68,0x72,0x5D,0x76,0x60,
0x73,0x6E,0x75,0x7A,0x74,0x84,0x7A,0x99,0x7B,0x93,0x7C,0x7C,0x7E,0x69,0x78,0x53,
0x7B,0x4E,0x7B,0x4C,0x7A,0x5B,0x7E,0x64,0x82,0x75,0x83,0x8A,0x83,0x88,0x84,0x81,
0x7F,0x7F,0x7B,0x76,0x7A,0x71,0x7A,0x79,0x7E,0x80,0x7E,0x83,0x80,0x88,0x7C,0x8E,
0x77,0x8D,0x7C,0x86,0x78,0x7F,0x79,0x82,0x7A,0x82,0x7A,0x81,0x79,0x8C,0x7C,0x9C,
0x80,0xA6,0x7D,0xB1,0x84,0xAE,0x85,0x97,0x84,0x82,0x81,0x76,0x82,0x6E,0x84,0x6D,
0x7F,0x7C,0x7F,0x8C,0x7F,0x95,0x7E,0x9C,0x81,0x97,0x85,0x86,0x87,0x83,0x8A,0x87,
0x8F,0x88,0x94,0x8C,0x97,0x96,0x9E,0xA8,0x9D,0xA6,0x9B,0x9B,0x9A,0x94,0x97,0x84,
0x91,0x77,0x90,0x7F,0x98,0x88,0x95,0x83,0x95,0x88,0x95,0x97,0x8C,0x96,0x8A,0x98,
0x8A,0x98,0x86,0x8B,0x88,0x81,0x8B,0x7F,0x85,0x80,0x84,0x7E,0x83,0x89,0x7F,0x92,
0x7C,0x8B,0x79,0x85,0x76,0x79,0x72,0x67,0x71,0x60,0x71,0x65,0x6F,0x71,0x6B,0x80,
0x6B,0x88,0x67,0x89,0x66,0x87,0x6C,0x74,0x6B,0x60,0x6E,0x5D,0x73,0x51,0x74,0x51,0x00};
#define pa XBYTE[0x0000] //定义8255口地址
#define pb XBYTE[0x2000]
#define control8255 XBYTE[0x6000]
sbit lcdrs = P3^2; //LCD控制位
sbit lcden = P3^3;
sbit daccs=P3^1; //DAC控制位
sbit dacwr=P3^0;
uchar music123=1; //当前播放歌曲代号
uchar musicnum=0; //歌曲数据采样点
void DisplayFailure () ;
void delay(uint z) //延时子程序,单位约1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void keyscan() //********键盘扫描子程序************
{
uchar temp;
while(1)
{
P1=0xfe; //扫描第一行
temp=P1;
temp=temp & 0xf0;
if (temp!=0xf0) //消抖动检查与延时
{
delay(5);
temp=P1;
temp=temp & 0xf0;
if (temp!=0xf0)
{
uchar ChangeFlag=music123;//前进快退标志
uchar ReplayFlag=0; //重播标志
switch(temp)
{
case 0xe0:
{
music123--;
if(music123==0)music123=3;
break;
}
case 0xd0:
{ music123++;
if(music123==4) music123=1;
break;
}
case 0xb0:
{
ReplayFlag=1;
break;
}
case 0x70:
{
//CircleFlag=1;
break;
}
}
while(temp!=0xf0) //判断按键是否松开
{
temp=P1;
temp=temp & 0xf0;
}
if(ChangeFlag!=music123||ReplayFlag==1)//前进后退标志或重播标志改变开始播放
{
TR0=1;
}
else
DisplayFailure ();
}
}
P1=0xfd; //扫描第二行
temp=P1;
temp=temp & 0xf0;
if (temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp & 0xf0;
if (temp!=0xf0)
{
switch(temp)
{
case 0xe0:
{
// key=5;
break;
}
case 0xd0:
//key=6;
break;
case 0xb0:
//key=7;
break;
case 0x70:
// key=8;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp & 0xf0;
}
DisplayFailure (); //以下按键没定义显示提示
}
}
P1=0xfb; //扫描第三行
temp=P1;
temp=temp & 0xf0;
if (temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp & 0xf0;
if (temp!=0xf0)
{
switch(temp)
{
case 0xe0:
// key=9;
break;
case 0xd0:
// key=10;
break;
case 0xb0:
// key=11;
break;
case 0x70:
// key=12;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp & 0xf0;
}
DisplayFailure ();
}
}
P1=0xf7; //扫描第四行
temp=P1;
temp=temp & 0xf0;
if (temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp & 0xf0;
if (temp!=0xf0)
{
switch(temp)
{
case 0xe0:
// key=13;
break;
case 0xd0:
// key=14;
break;
case 0xb0:
// key=15;
break;
case 0x70:
// key=16;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp & 0xf0;
}
DisplayFailure ();
}
}
}
}
void write_com(uchar com) //向LCD写命令
{
lcdrs=0;
pa=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date) //向LCD写数据
{
lcdrs=1;
pa=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void DisplayMusicIfo (uchar *table) //显示当前播放的音乐信息,名字幅值与时间
{
uchar n ;
for(n=0;n<11;n++)
{
delay(20);
write_data(table[n]);
}
write_com(0x80+0x40);
for(n=11;n<27;n++)
{
write_data(table[n]);
}
}
void DisplayFailure () //未定义键,显示错误提示
{
uchar n ;
write_com(0x01);
for(n=0;n<8;n++)
{
delay(20);
write_data(tableFailure[n]);
}
write_com(0x80+0x40);
for(n=8;n<20;n++)
{
write_data(tableFailure[n]);
}
}
void Timer0(void) interrupt 1 //定时器0中断函数
{
daccs=0;
dacwr=0;
if(music123==1) //DAC显示波形
{ pb= Music1[musicnum];
}
if(music123==2)
{ pb= Music2[musicnum];
}
if(music123==3)
{ pb= Music3[musicnum];
}
musicnum++;
if(musicnum==193) //显示歌曲信息,关定时器停止显示
{
musicnum=0;
if(music123==1)
{
lcden=0;
write_com(0x01);
DisplayMusicIfo(table1);
}
if(music123==2)
{
lcden=0;
write_com(0x01);
DisplayMusicIfo(table2);
}
if(music123==3)
{
lcden=0;
write_com(0x01);
DisplayMusicIfo(table3);
}
TR0 = 0;
}
}
void init() //系统初始化,8255,LCD
{
control8255=0x80;
lcden=0;
write_com(0x38);
write_com(0x0f);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
void main()
{
init();
TH0=131;
TL0=131;
//T0=65536-125;
TMOD = 0x02;
EA = 1;
ET0 = 1;
TR0 = 1;
keyscan();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -