📄 d61538ic-sl.cpp
字号:
/***************************************************/
/* yhy program for Qisheng AV1307 2005-04-08 */
/* 只选择了SL左环绕通道,请你帮忙,谢谢! */
/***************************************************/
#include <intrins.h> // 内部函数
#include "Global.h" // 全局变量函数文件
#include "define.h" // 自定义变量函数文件
#include <stdio.h>
/*=================================================*/
/*============= I2C总线程序函数 =============*/
/*=================================================*/
void I2CInit(void); // 初始化
void I2cWait(void); // 等待延时
void I2cStart(void); // 开始信号
void I2cStop(void); // 结束信号
Word Send_IC_16bitData(Word wData);
void D61538_senddata(Word bytecnt);
void Left_Surround_Volume_Increase(void); //左通道音量加
void Left_Surround_Volume_Decrease(void); //左通道音量减
/*=====================================================*/
// 将采集到的数据同D6153_buf[]相&,若&后结果为D61538_buf[]
// 数值,则为所选择的通道。
// 通道选择初始化数值 L R C SW SL SR Test-model
// 0x78f2(SL+SR,10,60DB) 0x50A1(C+SW,01,40DB) 0x78F0(L+R,00,60DB)
/*======================================================*/
Word TrmBuf[4] ={0xffff,0xffff,0xffff,0xffff};
// D615388音量代码数值,通过采集到的数据每七位控制各通道。
// surround Left channel
#define SL_1DB 0x03fe // 1dB 0000001 1111111 10
#define SL_10DB 0x15fe // 10dB 0001010 1111111 10
/*===========I2C transmit value function ==========*/
//Wait for some time to get proper i2c timing
//=======================================================
void I2cWait(void) ///delay time 8uS
{
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
}
/*===========================================
I2c start condition
SDA high -> low while SCL=high,read data while clock L-->H
send data a high single after send data D0~D15,while clock H-->L
=======================================*/
void I2cStart(void) ///开始函数
{
D61538_DATA=1;
D61538_CLK =1;
I2cWait(); // delay 8uS
D61538_DATA=0;
I2cWait(); // delay 8uS
D61538_CLK =0;
}
/*======================================
I2c stop condition
SDA low -> high while SCL=high
=======================================*/
void I2cStop(void) ///停止函数
{
D61538_DATA=0;
I2cWait();
D61538_CLK =1;
I2cWait();
D61538_DATA=1;
}
//===========================================
/*== 传送一个WORD数据至slave中 ========*/
//=======================================================
Word Send_IC_16bitData(Word wData) ///传送D0....D15数据
{
unsigned char i;
Bool ack;
//------------------------
// D61538_CLK =1;
//-------------------
for(i=0;i<15;i++)
{
//------------------------
D61538_CLK =1;
//-------------------
if(wData&0x8000) //若wData与0x8000作AND逻辑与后等于0x8000,即表示
// 位15等于"1"则条件成立,所以设定D61538_DATA="1",否则="0".
{
D61538_DATA=1;
}
else
{
D61538_DATA=0;
}
wData <<= 1; // 以便传送完16位
I2cWait();
D61538_CLK =1; // the rising edge of colock
I2cWait();
D61538_CLK =0; // the following edge of colock
I2cWait();
}
D61538_DATA=1; ///先设定SDA、SCL为1,
I2cWait();
D61538_CLK =1;
I2cWait();
ack = D61538_DATA;
D61538_CLK =0; /// 恢复SCL为"0"电平
I2cWait();
// D61538_DATA=0; /// 恢复SDA为"0"电平
return ack; //D61538_DATA ;
}
//=================================================
void D61538_senddata(Word bytecnt) ///D61538 IC送数函数
{
I2cStart();
Send_IC_16bitData(bytecnt);
I2cStop();
}
//*******************************************/
/* below for D61538 */
/* data to be sent is stored in TrmBuf */
/*******************************************/
BYTE gbLVol = DEFAULT_VOL ;
BYTE gbRVol = DEFAULT_VOL ;
BYTE gbSLVol = DEFAULT_VOL ;
BYTE gbSRVol = DEFAULT_VOL ;
BYTE gbCVol = DEFAULT_VOL ;
//=======================================
//================================
void D61538_init(void) // D61538 IC的初始化
{
//// 左环绕通道
TrmBuf[0] = gbSLVol; //(左环绕)存音量原数据
TrmBuf[1] = (TrmBuf[0] >> 9) & 0x007f; //保留有效数据
gbSLVol = TrmBuf[1];
TrmBuf[2] = TrmBuf[0] | 0x01fe; // 转无效数据全为-95dB~更大
TrmBuf[1] = TrmBuf[1] << 9 ; //有效数据回原位
TrmBuf[3] = TrmBuf[1] | TrmBuf[2]; //两数据组成预传数
D61538_senddata(TrmBuf[3]); ///送数
// Send_IC_16bitData(TrmBuf[3]);
}
/*-----------------*****************************-------------*/
// 思路:以0x27=39dB为分界线,高于以"V_Step"增减,低于以1dB增减
/*--------------------***************************------------*/
//// 左环绕通道的代码
/*-----------------------**********---------------------*/
void Left_Surround_Volume_Increase(void) //左环绕音量加函数
{
if(gbSLVol) ///gbSLVol是变化数值,就是通过遥控器的增加或者减少键,它的数值会变化的。
{
#ifdef QS3_VOL
if( (gbSLVol > 0x27) && (gbSLVol != 0) )
{
gbSLVol -= V_Step ;
}
else
{
gbSLVol -- ;
}
#else
gbSLVol--;
#endif
#ifdef NEW_ONE_KEY
if((gbMusicCinema == CINEMA_MODE) || (gbInputMode==AC3_MODE))
#else
if(gbMusicCinema == CINEMA_MODE)
#endif
{
/// D61538 IC的算法
//-------------添加代码--------------------------
TrmBuf[0] = gbSLVol; //存音量原数据
TrmBuf[1] = (TrmBuf[0] >> 9) & 0x007f; //保留有效数据
gbSLVol = TrmBuf[1];
TrmBuf[2] = TrmBuf[0] | 0x01fe; // 转无效数据全为-95dB~更大
TrmBuf[1] = TrmBuf[1] << 9 ; //有效数据回原位
TrmBuf[3] = TrmBuf[1] | TrmBuf[2]; //两数据组成预传数
D61538_senddata(TrmBuf[3]); ///送数
}
}
}
void Left_Surround_Volume_Decrease(void) //左环绕音量减函数
{
if(gbSLVol < 0x3b) //0x3b=59dB
{
#ifdef QS3_VOL
if( (gbSLVol >= 0x27) && (gbSLVol < 0x3b) )
{
gbSLVol += V_Step ;
}
else
{
gbSLVol ++ ;
}
#else
gbSLVol ++ ;
#endif
#ifdef NEW_ONE_KEY
if((gbMusicCinema == CINEMA_MODE) || (gbInputMode==AC3_MODE))
#else
if(gbMusicCinema == CINEMA_MODE)
#endif
{
/// D61538 IC的算法
//------------------------------------------
TrmBuf[0] = gbSLVol; //存音量原数据
TrmBuf[1] = TrmBuf[0] >> 9; //保留有效数据
gbSLVol = TrmBuf[1];
TrmBuf[2] = TrmBuf[0] | 0x017e; // 转无效数据全为-95dB~更大
TrmBuf[1] = TrmBuf[1] << 9 ; //有效数据回原位
TrmBuf[3] = TrmBuf[1] | TrmBuf[2]; //两数据组成预传数
D61538_senddata(TrmBuf[3]); ///送数
// Send_IC_16bitData(TrmBuf[2]);
//--------------------------------------------
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -