#include "STC15W4K.H"
#define MAIN_Fosc 24000000L //定义主时钟
#define uchar unsigned char
#define uint unsigned int
#define SCL_1 P41=1
#define SCL_0 P41=0
#define SDA_1 P42=1
#define SDA_0 P42=0
//#define RESET_1 P43=1
//#define RESET_0 P43=0 //Active_low reset input
#define SDA_val (P4 & 0x04)
//#define delay_time 60
#define FALSE 0
#define TRUE 1
void delay_us(uint us);
void DAC7571_PORT_Init(void);
void I2C_Start(void);
void I2C_Stop(void);
void Send_1(void);
void Send_0(void);
uchar Check_Acknowledge(void);
void Send_Acknowledge(void);
void Send_NAcknowledge(void);
void WriteI2CByte(uchar dat);
uchar ReadI2CByte(void);
void Write_One_Byte(uchar Slave_addr,uchar Command_Byte,uchar reg1_data);
uint Read_One_Byte(uchar Slave_addr);//,uchar Command_Byte);
void main(void)
{
uint dat;
P0M1 = 0; P0M0 = 0; //设置为准双向口
P1M1 = 0; P1M0 = 0; //设置为准双向口
P2M1 = 0; P2M0 = 0; //设置为准双向口
P3M1 = 0; P3M0 = 0; //设置为准双向口
P4M1 = 0; P4M0 = 0; //设置为准双向口
P5M1 = 0; P5M0 = 0; //设置为准双向口
P6M1 = 0; P6M0 = 0; //设置为准双向口
P7M1 = 0; P7M0 = 0; //设置为准双向口
DAC7571_PORT_Init();
while(1)
{
Write_One_Byte(0x9A,0x0c,0x1f);
delay_us(150);
dat = Read_One_Byte(0x9A);
//if(dat)
//{
//P32=0;
//}
}
}
/*
* 函数名:Write_One_Byte()
* 输入:Slave_addr:从设备地址,最后一位是R/W控制位
* Command_Byte:控制命令,选择要写的寄存器地址
* reg1_data:Command_Byte寄存器的数据
* reg2_data:与Command_Byte寄存器配对寄存器的数据
* 输出:无
*
*/
void Write_One_Byte(uchar Slave_addr,uchar Command_Byte,uchar reg1_data)
{
I2C_Start();
WriteI2CByte(Slave_addr);
if(Check_Acknowledge())
WriteI2CByte(Command_Byte);
if(Check_Acknowledge())
WriteI2CByte(reg1_data);
I2C_Stop();
}
uint Read_One_Byte(uchar Slave_addr)//,uchar Command_Byte)
{
uint temp,dat;
I2C_Start();
WriteI2CByte(Slave_addr);
if(Check_Acknowledge())
//WriteI2CByte(Command_Byte);
//if(Check_Acknowledge())
I2C_Start();
WriteI2CByte(Slave_addr+1);
if(Check_Acknowledge())
temp = ReadI2CByte();
// temp <<= 8;
Send_Acknowledge();
// temp = temp | ReadI2CByte();
dat = ReadI2CByte(); //这个对应的寄存器的值不需要,是由线路板硬件决定的
Send_NAcknowledge();
I2C_Stop();
return temp;
}
void DAC7571_PORT_Init(void) /*引脚初始化*/
{
SCL_1;
SDA_1;
}
void I2C_Start(void) /*启动I2C总线的函数,当SCL为高电平时使SDA产出一个负跳变*/
{
SDA_1;
SCL_1;
delay_us(5);
SDA_0;
delay_us(5);
SCL_0;
delay_us(5);
}
void I2C_Stop(void) /*终止I2C总线的函数,当SCL为高电平时使SDA产出一个正跳变*/
{
SDA_0;
SCL_1;
delay_us(5);
SDA_1;
delay_us(5);
SCL_0;
delay_us(5);
}
void Send_1(void) /*发送1,在SCL为高电平时使SDA信号为高*/
{
SDA_1;
delay_us(5);
SCL_1;
delay_us(5);
SCL_0;
delay_us(5);
}
void Send_0(void) /*发送0,在SCL为高电平时使SDA信号为低*/
{
SDA_0;
delay_us(5);
SCL_1;
delay_us(5);
SCL_0;
delay_us(5);
}
uchar Check_Acknowledge(void) /*检查从设备的应答信号*/
{
uchar temp;
SCL_1;
//SDA_input;
delay_us(2);
SCL_1;
temp = SDA_val;
delay_us(2);
SCL_0;
delay_us(5);
//SDA_output;
if(temp)
return FALSE;
return TRUE;
}
void Send_Acknowledge(void) /*主机应答操作*/
{
SDA_0;
delay_us(5);
SCL_1;
delay_us(5);
SCL_0;
delay_us(5);
SDA_1;
delay_us(5);
}
void Send_NAcknowledge(void) /*主机无应答操作*/
{
SDA_1;
delay_us(5);
SCL_1;
delay_us(5);
SCL_0;
delay_us(5);
SDA_0;
delay_us(5);
}
void WriteI2CByte(uchar wdata) /*向I2C总线写一个字节*/
{
uchar i;
//SDA_output;
for(i=8;i>0;i--)
{
if(wdata & 0x80)
Send_1();
else
Send_0();
wdata <<=1;
}
}
uchar ReadI2CByte(void) /*向I2C总线读一个字节*/
{
uchar result=0,i;
//SDA_input;
for(i=8;i>0;i--)
{
SCL_1;
delay_us(5);
SCL_0;
result <<= 1;
if(SDA_val)
result |= 0x01;
// result=result+1;
}
//SDA_output;
return result;
}
//========================================================================
// 函数:void delay_us(u16 us)
// 描述: 延时函数。
// 参数: 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期:
// 备注:
//========================================================================
void delay_us(uint us)
{
uint i;
do{
i = MAIN_Fosc / 13000000;
while(--i) ; //14T per loop
}while(--us);
}
|