谁能帮我搞个PT2313音量控制程序
什么功能 I2C控制的,对着芯片资料应该能搞成,先自己写一下,遇到困难再问问大家。给你个兼容的芯片的资料。 本帖最后由 liweiqiang668 于 2012-4-26 20:23 编辑樓主的電路做得太復習了,我以做過一個用89C2051控制PT2314的,接法如圖,是以前學匯編寫的,現在改學C了,回頭再用匯編覺得很難了.程序寫得很不規範,但能用.不知對你有沒有用.
功能是:4個LED作功能指示,音量/低音/高音/輸入通道切換/帶EEPROM存儲,數碼管顯示調節數值,在非音量顯示狀態下5秒自動返回音量指示狀態,本想加入紅外搖控的,但當時在主程序中作解碼,由於延時導至數碼管會閃一下,就沒繼續弄了.本來就用來玩一下,所以也沒有花太多時間弄. I2C控制的话,可以看下我的帖子,有PT2257 我在本坛发过2051/4051控制2311的帖子
楼主可以搜索一下
做个参考 dongls 发表于 2012-4-26 19:49 static/image/common/back.gif
I2C控制的,对着芯片资料应该能搞成,先自己写一下,遇到困难再问问大家。给你个兼容的芯片的资料。 ...
谢谢啦! liweiqiang668 发表于 2012-4-26 20:06 static/image/common/back.gif
樓主的電路做得太復習了,我以做過一個用89C2051控制PT2314的,接法如圖,是以前學匯編寫的,現在改學C了,回頭 ...
还是有点用的!我主要是想参考一下,不过还是很感谢{:handshake:} 这几天在做2313的程序,支持一下。 数字电位器 ic {:smile:}?
#define PT2313_ADDR 0x88 //I2C写地址
unsigned char contr;// = {63, 0, 31, 31, 15, 15, 3};
#pragma warn-
eeprom char mcontr;
#pragma warn+
extern unsigned char tda7131savecou = 0;
//unsigned char keycou = 0;
//extern unsigned int tcount = 0, keyval = 0x0f, keysta = 1, keytem = 0x0f, keycn = 22, ctrbit = 0;
static bit muteflag = 0;
#define keypin (PINC & 0x0f)
#define fcow 5
#define fvcow (fcow + 36)
#define bcow 70
#define bvcow (bcow + 36)
//#define MovLef 0x02fd
//#define MovRig 0xc23d
//#define ValAdd 0x906f
//#define ValDec 0xa857
void Radio_dsiplay(void);
/*///////////////////////////////////////////////////
四个通道衰减处理
通道0-3单独通道处理
通道4 前两通道处理
通道5 后两通道处理
通道6 四个通道同时处理
0静音31音最大
*////////////////////////////////////////////////////
unsigned char spkatt(unsigned char track, unsigned char atten)
{
unsigned char flag = 0, tem;
tem = track;
if(track >= 0 || track <= 7)//合法数据
{
track += 4;
track <<= 5;
}
else
{
return;
}
if(atten >= 0 && atten <= 31)
{
atten = 31 - atten;
}
else
return;
iicstart();
flag = write(PT2313_ADDR);
if(tem < 4)
{
flag = write(track | atten);
}
else
{
if(tem == 4)
{
flag = write(0x80 | atten);
flag = write(0xa0 | atten);
}
if(tem == 5)
{
flag = write(0xc0 | atten);
flag = write(0xe0 | atten);
}
// if(tem == 6)
// {
// flag = write(0x80 | atten);
// flag = write(0xa0 | atten);
// flag = write(0xc0 | atten);
// flag = write(0xe0 | atten);
// }
}
iicstop();
return(flag);
}
/*///////////////////////////////////////////////
0-2 3个输入通道
0-3 四级响度 响度为0时关闭响度
*////////////////////////////////////////////////
unsigned char audsw(unsigned char stern) //, unsigned char loud
{
unsigned char tem = 0x44, flag= 0;
if(stern > 2)
return;
// if(loud > 4)
// {
// return;
// }
// else
// {
// loud = 3 - loud;
// loud <<= 3;
// }
iicstart();
flag = write(PT2313_ADDR);
// if(loud == 4)
// {
// flag = write(0x44);
// }
// else
// {
// tem |= loud;
tem |= stern;
flag = write(tem);
// }
iicstop();
tda7131savecou = 30; //调音设置过后30秒保存
return(flag);
}
//////////////////////////////////////////////////
//type 为0 时设bass
// 1 Treble
//0-15 共16级设置
//////////////////////////////////////////////////
unsigned char bastre(unsigned char type, unsigned char lay)
{
unsigned char flag = 0;
if(type > 1)return;
if(lay >15)return;
if(lay > 7)
{
lay &= 0x07;
lay = 7 - lay;
lay |= 0x08;
}
iicstart();
flag = write(PT2313_ADDR);
if(type)
{
flag = write(lay | 0x70);
sprintf(lcd_buffer, "BA:%2d", contr);
display_ascii(34,7,1);
}
else
{
flag = write(lay | 0x60);
sprintf(lcd_buffer, "TR:%2d", contr);
display_ascii(0,7,1);
}
iicstop();
tda7131savecou = 30; //调音设置过后30秒保存
return(flag);
}
//////////////////////////////////////
//音量设置0最小,63最大
//
//////////////////////////////////////
unsigned char volume(unsigned char vol)
{
unsigned char flag = 0;
iicstart();
flag = write(PT2313_ADDR);
if(vol > 64)
return;
if(vol == 64)
{
sprintf(lcd_buffer, "VOLUME:MUT");
vol = 63;
flag = write(vol);
}
else
{
vol = 63 - vol;
sprintf(lcd_buffer, "VOLUME: %2d", 63 - vol);
flag = write(vol);
}
display_ascii(68,7,1);
iicstop();
tda7131savecou = 30; //调音设置过后30秒保存
return(flag);
}
void setload()
{
volume(contr);
audsw(contr); //,contr
spkatt(4,contr);
spkatt(5,contr);
bastre(0,contr);
bastre(1,contr);
}
/*void Tda7131Display(void)
{
sprintf(lcd_buffer, "VOLUME ");
display_ascii(fcow,2,1);
sprintf(lcd_buffer, " %d", contr);
display_ascii(fvcow,2,1);
sprintf(lcd_buffer, "AUD_SW %d", contr);
display_ascii(bcow,2,1);
sprintf(lcd_buffer, "BAK_SP %d", contr);
display_ascii(fcow,3,1);
sprintf(lcd_buffer, "FON_SP %d", contr);
display_ascii(bcow,3,1);
sprintf(lcd_buffer, "TREBLE %d", contr);
display_ascii(fcow,4,1);
sprintf(lcd_buffer, "BASS %d", contr);
display_ascii(bcow,4,1);
sprintf(lcd_buffer, "LOUNDN %d", contr);
display_ascii(fcow,5,1);
setload();
} */
void Tda7131Load(void)
{
unsigned char i;
for(i = 0; i < 7; i++) contr = mcontr; //{63, 0, 31, 31, 15, 15, 3};
if(contr > 63)contr = 30; //音量
if(contr > 2)contr = 0; //音源
switch(contr)
{
case 0: sprintf(lcd_buffer, " MHz");break;
case 1: sprintf(lcd_buffer, " CD Play");break;
case 2: sprintf(lcd_buffer, " PC au");break;
}
display_ascii16x32(0,2,1);
if(contr > 31)contr = 31; //后两声道音量
if(contr > 31)contr = 31; //前两声道音量
if(contr > 15)contr = 15; //高音值
if(contr > 15)contr = 15; //低音值
if(contr > 4)contr = 4; //响度
}
void Tda7131Save(void)
{
unsigned char i;
if(tda7131savecou == 1)
{
for(i = 0; i < 7; i++)
{
mcontr = contr;
}
}
}
void Tda7131_Ctr(unsigned int keyval)
{
switch(keyval)
{
case VolAdd: //vol +
{
if(contr < 63)
{contr ++; volume(contr);}
break;
}
case VolDec: //vol -
{
if(contr > 0)
{contr --;volume(contr);}
break;
}
case Mute: //mute
{
if(muteflag)
{
muteflag = 0;
volume(contr);
}
else
{
muteflag = 1;
volume(64);
}
break;
}
//-------------高音处理-----------------
case PRT: //tre +
{
if(contr < 15)contr ++; else contr = 0;
bastre(0,contr);
break;
}
//-----------------低音处理-----------------
case Clock: //bass
{
if(contr < 15)contr ++; else contr = 0;
bastre(1,contr);
break;
}
//------------------音源处理---------------
case Mode: //auswMode EQ
{
if(contr < 2)
{
contr ++;
}
else
contr = 0;
switch(contr)
{
case 0:
{
sprintf(lcd_buffer, " MHz");
display_ascii16x32(0,2,1);
Radio_dsiplay();
break;
}
case 1:
{
sprintf(lcd_buffer, " CD Play ");
break;
}
case 2:
{
sprintf(lcd_buffer, " PC au");
break;
}
}
display_ascii16x32(0,2,1);
audsw(contr); //,contr
break;
}
//---------------------前两声道处理------------
// case 0x5aa5: //fontsp +
// {
// if(contr < 31)
// {
// contr ++;
// sprintf(lcd_buffer, " %d", contr);
// display_ascii(bvcow,3,1);
// spkatt(5,contr);
// }
// break;
// }
// case 0x42ba: //fontsp -
// {
// if(contr > 0)
// {
// contr --;
// sprintf(lcd_buffer, " %d", contr);
// display_ascii(bvcow,3,1);
// spkatt(5,contr);
// }
// break;
// }
//-----------------后两声道处理----------
// case 0x4bd4: //backsp +
// {
// if(contr < 31)
// {
// contr ++;
// sprintf(lcd_buffer, " %2d", contr);
// display_ascii(fvcow,3,1);
// spkatt(4,contr);
// }
// break;
// }
// case 0x52ba: //backsp -
// {
// if(contr > 0)
// {
// contr --;
// sprintf(lcd_buffer, " %2d", contr);
// display_ascii(fvcow,3,1);
// spkatt(4,contr);
// }
// break;
// }
// break;
tda7131savecou = 30;
}
}
已经用了几年了,现在还在用。注释掉的是由flash空间不够精减的。 并且有自动记忆。 设置完30后记下当前设置。 30秒之内断电,再上电是启用上次设定值。 来学习了 单片机真牛,什么都用单片机了。 zwcled 发表于 2016-6-15 18:26
单片机真牛,什么都用单片机了。
抓紧学习下单片机吧~~~~~~~~~~~~~~{:lol:} 发点我做试验的图给楼主参考下:
不就个I2C接口控制嘛 lxa0 发表于 2016-6-15 19:21
抓紧学习下单片机吧~~~~~~~~~~~~~~
学了一点点了,会用点C,用过合泰的,PIC的,AVR的,51的,STM8的,以后看能不能用点STM32的。 zwcled 发表于 2016-6-16 08:57
学了一点点了,会用点C,用过合泰的,PIC的,AVR的,51的,STM8的,以后看能不能用点STM32的。 ...
祝贺你 ~~~~~~~~~~~~~~~~~~~~{:victory:} lxa0 发表于 2016-6-15 19:23
发点我做试验的图给楼主参考下:
你好,请问原理图是用什么画的?多谢 52HLX 发表于 2016-9-12 17:43
你好,请问原理图是用什么画的?多谢
photoshop画的
页:
[1]