//PT2314的音量调节, 高低音调节 ,声道选择, 静音, 红外遥控,
/**********************************************************************************************/
#include"reg52.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/*pt2314写入地址*/
#define WriteDeviceAddress 0x88
/*红外0/1代码时长定义*/
#define Imax 14000
#define Imin 8000
#define Inum1 1450
#define Inum2 700
#define Inum3 3000
/*对应音量+, 音量-,高音+,高音-,低音+,低音- 静音,音源选择 */
/*菜单,静音,加,减,dvd,vcd,cd,aut*/
#define Vol_Cut 0x08/*静音*/
#define up 0x07
#define down 0x0a
#define menu_Choose 0x05/*包括 treble , bass, vol*/
/*#define vol_bass_up 0x05 遥控器的便捷扩展按键
#define vol_bass_down 0x06
#define vol_treble_up 0x03
#define vol_treble_down 0x04*/
#define menu_road_Choose 0x03 //菜单选择包括了下面 按一下就跳变次
/* #define Choose_dvd 0x09 遥控器的便捷扩展按键
#define Choose_cd 0x10
#define Choose_mp3 0x11
#define Choose_mp4 0x12 */
/*显示定义*/
//unsigned char Bass=0x60;
//unsigned char Treble=0x70;
/////////////////////
#define vol 0x00;
#define bass 0x60;
#define treble 0x70;
#define aud_Choose 0x40;
///////////////////////////////////////////////送到显示程序中的数组
unsigned char tab_display[]={0x7c,0x3a,0xfe,0xfc,0x04};//C:0x9c D:0xfc V:0x7c o:0x3a B:0xfe A:0xee
///////////////////////////////////////////////共阴数MR6625显示 T:0x1e r:0x0e
unsigned char code dis_code[]={
0xfc,/*0*/
0x60,/*1*/
0xDA,/*2*/
0xF2,/*3*/
0x66,/*4*/
0xB6,/*5*/
0xBE,/*6*/
0xE0,/*7*/
0xFE,/*8*/
0xF6/*9*/
};
/////////////////////////////////////////////
unsigned char vol_iic[]={0,0,0,0x5c,0,0};/*vol,bass,treble,aud_Choose ,左声道静音量 右声道静音量, 传到iiC的数据 */
/////////////////////////////////////////////
unsigned char Choose_vbt[]={38,8,8};/*vol,bass,vtreble 音量调节变量存储*/
/////////////////////////////////////////////////MR-6625 最后一位显示表格
//unsigned char code MR_6625[]={0X20,0X01,0X02,0X04,0X08,0X10,0X40};//mp4,播放,暂停,DVD,CD,点,mp3 正
unsigned char code MR_6625[]={0X04,0X80,0X40,0X20,0X10,0X08,0X02};//mp4,播放,暂停,DVD,CD,点,mp3 反
///////////////////////////////////////////////////////////////////////音量表格
/*unsigned char code vol_10db[]={0x00,0x08,0x10,0x18,
0x20,0x28,0x30,0x38};//10db增量
unsigned char code vol_1_25db[]={0x00,0x01,0x02,0x03,0x04,
0x05,0x06,0x07}; //1.25db增量
*/
unsigned char code vol_db[]={0x38|0x07,0x38|0x06,0x38|0x05,0x38|0x04,0x38|0x03,0x38|0x02,0x38|0x01,0x38|0x00,
0x30|0x07,0x30|0x06,0x30|0x05,0x30|0x04,0x30|0x03,0x30|0x02,0x30|0x01,0x30|0x00,
0x28|0x07,0x28|0x06,0x28|0x05,0x28|0x04,0x28|0x03,0x28|0x02,0x28|0x01,0x28|0x00,
0x20|0x07,0x20|0x06,0x20|0x05,0x20|0x04,0x20|0x03,0x20|0x02,0x20|0x01,0x20|0x00,
0x18|0x07,0x18|0x06,0x18|0x05,0x18|0x04,0x18|0x03,0x18|0x02,0x18|0x01,0x18|0x00,
0x10|0x07,0x10|0x06,0x10|0x05,0x10|0x04,0x10|0x03,0x10|0x02,0x10|0x01,0x10|0x00,
0x08|0x07,0x08|0x06,0x08|0x05,0x08|0x04,0x08|0x03,0x08|0x02,0x08|0x01,0x08|0x00,
0x00|0x07,0x00|0x06,0x00|0x05,0x00|0x04,0x00|0x03,0x00|0x02,0x00|0x01,0x00|0x00,
};
///////////////////////////////////////////////////////////////////////B/T调音声调表格
unsigned char code Tiaoyin[]={0x00,0x01,0x02,0x03,
0x04,0x05,0x06,0x07,
0x0f,0x0e,0x0d,0x0c,
0x0b,0x0a,0x09,0x08};
//////////////////////////////////////////////////////////32位编码接收存储
unsigned char Im[4]={0x00,0x00,0x00,0x00};
/////////////////////////////////////////////
unsigned long m,Tc;
unsigned char IrOK; // 码是否正确的标识符
unsigned char f;
unsigned char flag;
//unsigned char h;
unsigned char MenuChoosem;
unsigned char Numer;
unsigned char MenuRoadChoosem;
unsigned char Choose;
unsigned char UpDown;
unsigned char VolCutm;
unsigned char ppp;
///////////////////////////////////////
sbit m74HC1_DATA=P1^0;
sbit m74HC1_CLK=P1^1;
sbit Menu_high=P1^2;
sbit Menu_low=P1^3;
sbit Value_high=P1^4;
sbit Value_low=P2^5;
sbit Postion_Choose=P2^6;
//sbit P17=P1^7;
sbit a0=ACC^0; //累加器做模拟串口传输的数据位定义
//////////////////////////////
sbit K1=P2^0;
sbit K2=P2^1;
sbit K3=P2^2;
sbit K4=P2^3;
sbit K5=P2^4;
//////////////////////////////////////////
sbit SCL=P3^7;//总线端口设置
sbit SDA=P3^6;
////////////////////////////////////////////////////////////////
void Dely()
{
unsigned char m,n,s;
for(s=2;s>0;s--)
for(m=2;m>0;m--)
for(n=2;n>0;n--);
}
//定时函数
///////////////////////////////////////////
void DelayMs(unsigned int number) //红外延时
{
unsigned char temp;
for(;number!=0;number--)
{
for(temp=112;temp!=0;temp--) ;
}
}
//////////////////////////////////////////
void delay(unsigned char ms) //显示延时程序
{
unsigned char i;
while(ms--)
{
//for (i=0;i<125;i++);
for (i=0;i<30;i++);
}
}
///////////////////////////////////////////////////////PT2314 iic程序
//开总线
void Start()
{
SDA=1;
SCL=1;_nop_();_nop_();//_nop_();
SDA=0;_nop_();_nop_();//_nop_();
SCL=0;//_nop_();_nop_();_nop_();
}
///////////////////////////////////////////////////////////
//结束总线
void Stop()
{
SCL=0;
SDA=0;_nop_();_nop_();//_nop_();
SCL=1;_nop_();_nop_();//_nop_();
SDA=1;//_nop_();_nop_();_nop_();
}
///////////////////////////////////////////////////////
//测试ACK
bit TestAck()
{
bit ErrorBit;
SDA=1; _nop_();//_nop_();_nop_();
SCL=1;_nop_();//_nop_();_nop_();
ErrorBit=SDA;
SCL=0;
return(ErrorBit);
}
///////////////////////////////////////////////////
//写入8个bit到PT2314
Write8Bit(uchar input)
{
uchar temp;
for(temp=8;temp!=0;temp--)
{
SDA=(bit)(input&0x80);
SCL=1;_nop_();//_nop_();_nop_();_nop_();
SCL=0;_nop_();//_nop_();_nop_();_nop_();
input=input<<1;
}
}
////////////////////////////////////////////////////
//写入一个字节到PT2314中
void WritePT2314(uchar ch)
{
Start();
Write8Bit(WriteDeviceAddress);
TestAck();
Write8Bit(ch);
TestAck();
Stop();
//DelayMs(20);
}
/////////////////////////////////////////////////////////////////////
void change_all() /*数值处理分配到表格*/
{
switch(MenuChoosem)
{
case 0 : tab_display[2]=dis_code[Choose_vbt[0]/10];
tab_display[3]=dis_code[Choose_vbt[0]%10]; break; /*vol*/
case 1 : tab_display[2]=dis_code[Choose_vbt[1]/10];
tab_display[3]=dis_code[Choose_vbt[1]%10]; break; /*bass*/
case 2 : tab_display[2]=dis_code[Choose_vbt[2]/10];
tab_display[3]=dis_code[Choose_vbt[2]%10]; break; /*treble*/
}
/* IIC数据处理*/
if(VolCutm==0)
{
tab_display[4]=MR_6625[2]|MR_6625[5]|MR_6625[Choose];
vol_iic[4]=0xdf;//静音
vol_iic[5]=0xff;
}
else
{
tab_display[4]=MR_6625[1]|MR_6625[5]|MR_6625[Choose];
vol_iic[4]=0xc0;//开静音
vol_iic[5]=0xe0;
}
vol_iic[0]=vol_db[Choose_vbt[0]]|vol;
vol_iic[1]=Tiaoyin[Choose_vbt[1]]|bass;
vol_iic[2]=Tiaoyin[Choose_vbt[2]]|treble;
if(Choose==0)
{vol_iic[3]=0x5c;}
if(Choose==3)
{vol_iic[3]=0x5d;}
if(Choose==4)
{vol_iic[3]=0x5e;}
if(Choose==6)
{vol_iic[3]=0x5f;}
}
void out_74HC1(unsigned char data_buf) /*模拟传输到74HC1*/
{
unsigned char i;//y;
i=8;
ACC=data_buf;
do
{
m74HC1_DATA=a0;
m74HC1_CLK=0;
m74HC1_CLK=1;
ACC=ACC>>1;
}
while(--i!=0);
}
///////////////////////////////////////////////////////////
void display_74HC1()
{ unsigned char m;
for(m=0;m<3;m++)
{
Numer=tab_display[0]; //菜单高位显示
out_74HC1(Numer);
Menu_high=0;
delay(2);
Menu_high=1;
Numer=tab_display[1]; //菜单低位显示
out_74HC1(Numer);
Menu_low=0;
delay(2);
Menu_low=1;
Numer=tab_display[2]; //数值高位显示
out_74HC1(Numer);
Value_high=0;
delay(2);
Value_high=1;
Numer=tab_display[3]; //数值低位显示
out_74HC1(Numer);
Value_low=0;
delay(2);
Value_low=1;
Numer=tab_display[4]; //点位选择显示
out_74HC1(Numer);
Postion_Choose=0;
delay(2);
Postion_Choose=1;
}
m=0;
}
////////////////////////////////////////////////////////////////
void Vol_Cut_m() /*静音入口*/
{
VolCutm=~VolCutm ;
}
/////////////////////////////////////////////////////////////
void menu_road_Choose_m() //选择mp4,DVD,CD,mp3 /*输入选择*/
{ //Choose: 0 3 4 6
MenuRoadChoosem++;
if(MenuRoadChoosem==4)
{
MenuRoadChoosem=0;
}
switch(MenuRoadChoosem)
{
case 0: Choose=0; break; /*mp4*/
case 1: Choose=3; break; /*DVD*/
case 2: Choose=4; break; /*CD*/
case 3: Choose=6; break; /*mp3*/
}
}
/////////////////////////////////////////////////////////////////////
void menu_Choose_m() /*菜单控制选择*/
{
MenuChoosem++;
if(MenuChoosem==3)
{
MenuChoosem=0;
}
switch(MenuChoosem) //显示代码
{
case 0: tab_display[0]=0x7c;
tab_display[1]=0x3a; break; /*vol*/
case 1: tab_display[0]=0xfe;
tab_display[1]=0xee; break; /*bass*/
case 2: tab_display[0]=0x1e;
tab_display[1]=0x0e; break; /*treble*/
}
}
///////////////////////////////////////////////////////////////////////////////////
void up_m() /*数值调节+*/
{
switch(MenuChoosem)
{
case 0 : UpDown=Choose_vbt[0]; break; /*vol*/
case 1 : UpDown=Choose_vbt[1]; break; /*bass*/
case 2 : UpDown=Choose_vbt[2]; break; /*treble*/
}
UpDown++;
if(MenuChoosem==0) /*vol重新存入Choose_vbt[]*/
{ if(UpDown>)
{
UpDown=;
}
Choose_vbt[0]=UpDown;
}
if((MenuChoosem==1)|(MenuChoosem==2))
{
if(UpDown>16)
{
UpDown=16;
}
}
if(MenuChoosem==1) /*bass重新存入Choose_vbt[]*/
{
Choose_vbt[1]=UpDown;
}
if(MenuChoosem==2) /*treble重新存入Choose_vbt[]*/
{
Choose_vbt[2]=UpDown;
}
}
////////////////////////////////////////////////////////////////////////////////////
void down_m()/*数值调节-*/
{
switch(MenuChoosem)
{
case 0: UpDown=Choose_vbt[0]; break; /*vol*/
case 1: UpDown=Choose_vbt[1]; break; /*bass*/
case 2: UpDown=Choose_vbt[2]; break; /*treble*/
}
if(UpDown>1)
{
UpDown--;
}
else
{
UpDown=0;
}
if(MenuChoosem==0) /*vol重新存入Choose_vbt[]*/
{
Choose_vbt[0]=UpDown;
}
if(MenuChoosem==1) /*bass重新存入Choose_vbt[]*/
{
Choose_vbt[1]=UpDown;
}
if(MenuChoosem==2) /*treble重新存入Choose_vbt[]*/
{
Choose_vbt[2]=UpDown;
}
}
////////////////////////////////////////////////////////////////////////////////////////
void menu()
{ //unsigned char wait;
if(IrOK==1)
{
IrOK=0;
switch(Im[2])
{
case 0x08 : Vol_Cut_m(); break; /*静音入口*/
case 0x03 : menu_road_Choose_m(); break;/*输入选择*/
case 0x05 : menu_Choose_m(); break;/*菜单控制选择*/
case 0x07 : up_m(); break;/*数值调节+*/
case 0x0a : down_m(); break;/*数值调节-*/
default: break;
}
change_all();
//for(wait=0;wait<10;wait++)
// {
// display_74HC1();
// }
switch(MenuChoosem)
{ case 0 : WritePT2314(vol_iic[0]); break;
case 1 : WritePT2314(vol_iic[1]); break;
case 2 : WritePT2314(vol_iic[2]); break;
}
if(VolCutm==0)
{
WritePT2314(vol_iic[4]);
WritePT2314(vol_iic[5]);
}
else
{
WritePT2314(vol_iic[4]);
WritePT2314(vol_iic[5]);
}
WritePT2314(vol_iic[3]);
/* WritePT2314(vol_iic[0]);//DelayMs(30);
WritePT2314(vol_iic[1]);//DelayMs(30);
WritePT2314(vol_iic[2]);//DelayMs(30);
WritePT2314(vol_iic[3]);//DelayMs(30);
WritePT2314(vol_iic[4]);//DelayMs(30);
WritePT2314(vol_iic[5]);//DelayMs(30);
*/
}
}
//////////////////////////////////////////////////按键
void anjian(void)
{
if(K1==0)
{
Dely();
if(K1==0)
{
Im[2]=0x08;
IrOK=1;
do{
menu();
display_74HC1();
} while(K1==0);
}
}
if(K2==0)
{
Dely();
if(K2==0)
{ Im[2]=0x03;
IrOK=1;
do{
menu();
display_74HC1();
} while(K2==0);
}
}
if(K3==0)
{
Dely();
if(K3==0)
{ Im[2]=0x05;
IrOK=1;
do{
menu();
display_74HC1();
} while(K3==0);
}
}
if(K4==0)
{
Dely();
if(K4==0)
{ Im[2]=0x07;
IrOK=1;
do{
menu();
display_74HC1();
} while(K4==0);
}
}
if(K5==0)
{
Dely();
if(K5==0)
{
IrOK=1;
Im[2]=0x0a;
do{
menu();
display_74HC1();
} while(K5==0);
}
}
}
/////////////////////////////////////////////////////////////////////////////
void intersvr1(void) interrupt 2 using 1
{
Tc=TH0*256+TL0; //提取中断时间间隔时长
TH0=0;
TL0=0; //定时中断重新置零
if((Tc>Imin)&&(Tc m=0; f=1; return; } //找到启始码 if(f==1) { if(Tc>Inum1&&Tc Im[m/8]=Im[m/8]>>1|0x80; m++; //取1码 } if(Tc>Inum2&&Tc Im[m/8]=Im[m/8]>>1; m++; //取0码 } if(m==32) { m=0; f=0; if(Im[2]==~Im[3]) { IrOK=1; } else IrOK=0; //取码完成后判断读码是否正确 } //准备读下一码 } } //////////////////////////////////////////////////////////////////// 红外代码处理 分配到各相应表格 进行控制 void main() {m=0; f=0; VolCutm=0; MenuRoadChoosem=0; MenuChoosem=0;/*0为VOL*/ UpDown=15; EA=1; IT1=1;EX1=1; TMOD=0x11; TH0=0;TL0=0; TR0=1; P1=0x7F; change_all(); DelayMs(100); DelayMs(100); DelayMs(100); DelayMs(100); DelayMs(100); DelayMs(100); DelayMs(100); DelayMs(100); WritePT2314(vol_iic[0]); WritePT2314(vol_iic[1]); WritePT2314(vol_iic[2]); WritePT2314(vol_iic[3]); WritePT2314(vol_iic[4]); WritePT2314(vol_iic[5]); while(1) { // change_all(); display_74HC1(); menu(); //Dely(); anjian(); } } 外观: