62429音量控制+输入选择(1602显示)

#include
#include

#define uchar unsigned char //宏定义{用uchar代替"unsigned char(无符号字符型)"}
#define uint unsigned int //宏定义{用uint 代替"unsigned int (无符号字整型)"}

sbit rs = P2^4;
sbit rw = P2^5;
sbit ep = P2^6;

sbit k1 = P1^0; //音量UP
sbit k2 = P1^1; //音量DOW
sbit kbgm= P1^2; //音源BGM输入
sbit kcd = P1^3; //音源CD输入
sbit kdvd= P1^4; //音源dvd输入


sbit on = P2^7; //电源指示
sbit bgm= P1^5; //音源BGM继电器控制脚
sbit cd = P1^6; //音源CD继电器控制脚
sbit dvd= P1^7; //音源DVD继电器控制脚

sbit M62429_DAT= P2^0; //数据定义位 4
sbit M62429_CLK= P2^1; //时钟定义位 5
uchar a;
uchar b;
bit out;
bit in;
uint voldata ;
uint LR=0x00;

uchar code dis1[] = {"music-volums"};
uchar code dis2[] = {"WELCOME TO MJAMP"};
uchar code dis3[] = {"0123456789 "};
uchar code dis4[] = {"WAIT Patience!!"}; //....download....
uchar code dis5[] = {"BGM CD DVD "};


delay(uchar ms);


bit lcd_bz(); // 测试LCD忙碌状态
lcd_wcmd(uchar cmd); // 写入指令数据到LCD
lcd_pos(uchar pos); // 设定显示位置
lcd_wdat(uchar dat); // 写入字符显示数据到LCD
lcd_init(); // LCD初始化设定

void VolSet(uint Volume);
//void comint();
void input(uint in);


delay(uchar ms)
{ // 延时子程序
uchar i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}


bit lcd_bz() // 测试LCD忙碌状态
{
bit result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P0 & 0x80);
ep = 0;
return result;
}

lcd_wcmd(uchar cmd) // 写入指令数据到LCD
{
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}

lcd_pos(uchar pos) //设定显示位置
{
lcd_wcmd(pos | 0x80);
}

lcd_wdat(uchar dat) //写入字符显示数据到LCD
{
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}

lcd_init() //LCD初始化设定
{
lcd_wcmd(0x38); //
delay(1);
lcd_wcmd(0x0c); //
delay(1);
lcd_wcmd(0x06); //
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}

void main()
{ unsigned char l,m,i;
lcd_init(); // 初始化LCD
VolSet(0); //开机静音
// comint();
in =0;
a = 0;
b = 0x05;
out=0;
/*********************/
lcd_pos(0x00);
for(m=0;m<=15;m++)
{
lcd_wdat(dis4[m]);
}
/***********************/

lcd_pos(0x40);


for(m=0;m<=15;m++)
{
lcd_wdat(dis2[m]);
}

/******开机延时*******/
for(i=0;i<10;i++)
{delay(1010); lcd_pos(0x0F); lcd_wdat(dis3[9-i]);}
on=0;
lcd_init();
lcd_wcmd(0x01);
delay(10);
/*********************/

lcd_pos(0x02);
for(m=0;m<=15;m++)
{
lcd_wdat(dis5[m]);
}
/*********************/
lcd_pos(0x41);
for(l=0;l<12;l++)
{
lcd_wdat(dis1[l]);
}
/*********************/


/***********************/
while(1)
{
/***********************/
if(k1==0)
{
delay(30);
if(k1==0)
{
if(a<87)
{a++;out=0;}
}
}
/***********************/
if(k2==0)
{
delay(30);
if(k2==0)
{
if(a>0)
{a--;out=0;}
}
}
/***********************/
if(kbgm==0)
{
delay(30);
if(kbgm==0&&in==0)
{
b=0x05;
out=0;
in = 1;
}
}
//in = 0;
if(kcd==0)
{
delay(30);
if(kcd==0&&in==0)
{
b=0x09;
out=0;
in = 1;
}
}
//in = 0;
if(kdvd==0)
{
delay(30);
if(kdvd==0&&in==0)
{
b=0x0e;
out=0;
in = 1;
}
}
//in = 0;
if(kbgm==1&&kcd==1&&kcd==1 )
{in=0;}


/**************************/
if(out==0)
{
VolSet(a);
lcd_pos(0x4e);
lcd_wdat(dis3[a/10]);
lcd_pos(0x4f);
lcd_wdat(dis3[a%10]);
/**************************/
lcd_pos(0x05);
lcd_wdat(0x20);

lcd_pos(0x09);
lcd_wdat(0x20);

lcd_pos(0x0e);
lcd_wdat(0x20);
/**************************/
lcd_pos(b);
lcd_wdat(0x7f);
input(b);
out=1;
}
}

}

void input(uint in)
{
switch(in)
{
case 0x05 :bgm=0;cd=1;dvd=1;break;
case 0x09 :cd=0;bgm=1;dvd=1;break;
case 0x0e :dvd=0;bgm=1;cd=1;break;
}


}


void VolSet(uint Volume)

{
uint Dat=0;
uchar i;
EA=0;
M62429_DAT=0;
M62429_CLK=0;

//Volume=87-Volume; //得到要送到芯片的实际数。。。。。。加上此句最大为0db,最小为87
Dat=(((Volume<<5)&0x60)|((Volume>>2)&0x1f))|0x80;//得到要控制的数值(看数据手册)

/*************************************************/
for (i=0;i<2;i++) //发送2位数据,控制声道 D0,D1
{
M62429_DAT=LR&0x01;
_nop_();_nop_();_nop_();_nop_();
M62429_CLK=1;
_nop_();_nop_();_nop_();_nop_();
M62429_DAT=0;
_nop_(); _nop_();_nop_();_nop_();
M62429_CLK=0;
LR=LR>>1;
}

/*************************************************/
for (i=0;i<8;i++) //发送8位数据,控制音量 D2....D9
{
M62429_DAT=Dat&0x01;
_nop_();_nop_();_nop_();_nop_();
M62429_CLK=1;
_nop_();_nop_();_nop_();_nop_();
M62429_DAT=0;
_nop_(); _nop_();_nop_();_nop_();
M62429_CLK=0;
Dat=Dat>>1;
}

/*************************************************/
M62429_DAT=1; //发送最后1位数据, D10
_nop_();_nop_();_nop_();_nop_();
M62429_CL

K=1;
_nop_();_nop_();_nop_();_nop_();
M62429_CLK=0;
// M62429_DAT=0;
EA=1;

}

/********串口初始化********
void comint()
{
SCON = 0x50;//方式1,允许接收
TMOD = 0x20;//定时器1方式2
PCON |= 0x80;//波特率倍速
TL1 = 0xfa; //波特率倍速情况下晶振为11.0592MHZ,波特率为9600
TH1 = 0xfa; //波特率倍速情况下晶振为11.0592MHZ,波特率为9600
ES = 1;//开串口中断
EA = 1;//开启总中断
TR1 = 1;//启动定时器1
}

void serial(void) interrupt 4
{

if(RI)//接收完成中断
{
RI = 0;//清零接收标志位
a = SBUF;//读出串口接收到的数据
TI=0;
SBUF=a;
out=0;
// VolSet(voldata);
}

}

***/

相关文档
最新文档