#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P1^0;
sbit scl=P1^1;
sbit key=P1^2;
uint bdata move_data;
sbit move_data7=move_data^7;
void delay1ms(int t);
void write_data_to_PT2314(uchar volume_data);
void initial_PT2314();
void stop_PT2314();
void ack_PT2314();
void SomeNOP(uint k) ;
main()
{
uchar volume_data;
volume_data=1;
while(1)
{
if(key==0)
{
delay1ms(10);
while(key==0);
volume_data++;//音量加
if(volume_data>63)
{
volume_data=0;
} //超过最大音量归零
initial_PT2314();//启动 pt2314,写地址,应答
write_data_to_PT2314(volume_data);//将音量值写入PT2314
stop_PT2314();
sda=1;
scl=1;
}
}
}
/************************
延时子函数
************************/
void delay1ms(int t)
{
int i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}
/************************
将音量值写入PT2314子函数
************************/
void write_data_to_PT2314(uchar volume_data)
{
int i;
move_data=volume_data;
for(i=0;i<8;i++)
{
scl=0;
SomeNOP(150);
delay1ms(10);
if(move_data&0x80)
sda=1;
else
sda=0;
SomeNOP(100);
delay1ms(10);
scl=1;
move_data=move_data<<1;
SomeNOP(400);
delay1ms(10);
}
ack_PT2314();
SomeNOP(200);
delay1ms(10);
}
/************************
停止PT2314子函数
************************/
void stop_PT2314()
{
scl=1;
SomeNOP(10);
delay1ms(1);
sda=0;
SomeNOP(200);
delay1ms(10);
sda=1;
SomeNOP(300);
delay1ms(10);
scl=0;
}
/************************
应答信号
************************/
void ack_PT2314()
{
int erro;
scl=0;
SomeNOP(200);
delay1ms(10);
scl=1;
SomeNOP(200);
delay1ms(10);
erro=sda;
if(erro==1)
{
scl=0;
}
else
{
scl=0;
}
}
/************************
初始化PT2314
************************/
void initial_PT2314()
{
scl=1;
sda=1;
SomeNOP(2);
delay1ms(1);
sda=0;
SomeNOP(500);
delay1ms(10);
scl=0;
write_data_to_PT2314(0x88);
write_data_to_PT2314(0x45);
}
/**********************
延时
**********************/
void SomeNOP(uint k)
{
uint j;
j=k;
for(j;0<j;j--)
{
_nop_();
}
}