我写的一个PCA9535的一个驱动,mcu是P89V51RD2,结果驱动不起来,求帮助,不知道问题出在哪?
/***************************************************************** 功能描述:配置PCA9355的P0、P1口为输入 状 态:待测试 ******************************************************************/ #include<reg51f.h> sbit scl = P2^0; sbit sda = P2^1; sbit beep = P2^4; unsigned char temp[2] = {0x00,0x00}; //数据存储区 unsigned char setPA[2] = {0x00,0xff}; //配置P0 unsigned char setPB[2] = {0x00,0xff}; //配置P1 void delay5us(void) {;;} void delay_ms(unsigned int xms) { unsigned int i,j; for(i=0;i<xms;i++) for(j=0;j<110;j++); } /*启动信号*/ void iic_start(void) { sda = 1; delay5us(); scl = 1; delay5us(); sda = 0; delay5us(); scl = 0; delay5us(); } /*停止信号*/ void iic_stop(void) { sda = 0; delay5us(); scl = 1; delay5us(); sda = 1; delay5us(); scl = 0; delay5us(); } /************************************************* 函数功能:ack=1,发送应答信号;ack=0,发送非应答信号 输 入:ack 输 出:void **************************************************/ void iic_ack(unsigned char ack) { unsigned char i; scl = 1; delay5us(); while((sda == ack)&&(i<255)) i++; scl = 0; delay5us(); } /*初始化函数*/ void iic_init(void) { scl = 1; delay5us(); sda = 1; delay5us(); } /*************************************************** 函数功能:向sda端口连续写入一个字节的数据 输 入:date 输 出:无 ****************************************************/ void write_byte(unsigned char date) //写一个字节 { unsigned char i,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1; scl=0;//拉低SCL,因为只有在时钟信号为低电平期间按数据线上的高低电平状态才允许变化;并在此时和上一个循环的scl=1一起形成一个上升沿 delay5us(); sda=CY; delay5us(); scl=1; //拉高SCL,此时SDA上的数据稳定发送出去 delay5us(); } scl=0;//拉低SCL,为下次数据传输做好准备 delay5us(); sda=1;//释放SDA总线,接下来由从设备控制,比如从设备接收完数据后,在SCL为高时,拉低SDA作为应答信号 delay5us(); } /*************************************************** 函数功能:从sda端口连续读一个字节的数据 输 入:无 输 出:k ****************************************************/ unsigned char read_byte(void) { unsigned char i,k; scl=0; delay5us(); //sda=1; 这条语句可要可不要,这句话有什么意义??? //delay(); for(i=0;i<8;i++) { scl=1;//上升沿时,IIC设备将数据放在sda线上,并在高电平期间数据已经稳定,可以接收啦 delay5us(); k=(k<<1)|sda; //或运算 scl=0;//拉低SCL,使发送端可以把数据放在SDA上 delay5us(); } return k; } /***************************************************** 函数功能:配置端口 输 入:sla 设备地址sla, sub 设备子地址, *s 发送内容的指针 dataSize 发送字节数 输 出:无 ******************************************************/ void write_add(unsigned int sla,unsigned char sub,unsigned char *s,unsigned char dataSize) { unsigned char i; iic_start(); //启动 write_byte(sla); //发送从设备地址 (写) iic_ack(1); //等待从设备的响应 write_byte(sub); //发送芯片内地址 iic_ack(1); //等待从设备的响应 for(i=0;i<dataSize;i++) { write_byte(*s); //发送数据 iic_ack(1); //等待从设备的响应 } iic_stop(); //停止 delay_ms(5); } /***************************************************** 函数功能:读取多个字节的值 输 入:sla 设备地址 sub 设备子地址 *s 读取的数据 dataSize 字节数 输 出:无 ******************************************************/ void read_add(unsigned int sla,unsigned int sub,unsigned int *s,unsigned int dataSize) { unsigned char i; iic_start(); //启动I2C总线 write_byte(sla); //发送从设备地址写操作 iic_ack(1); //等待从设备的响应 write_byte(sub); //发送芯片内地址 iic_ack(1); //等待从设备的响应 iic_start(); //再次启动I2C总线 write_byte(sla+1); //发送从设备地址 读操作 iic_ack(1); //等待从设备的应答响应 for(i=0;i<dataSize-1;i++) { *s = read_byte(); //获取数据 s++; iic_ack(1); //等待主机设备的应答 } *s = read_byte(); //获取数据 iic_ack(0); //最后一字节等待主设备给出的非应答信号 iic_stop(); //停止 } void main() { iic_init(); beep =0; write_add(0x40,0x07,setPB,2);//配置PB口为输入口 write_add(0x40,0x06,setPA,2);//配置PA口为输出口 delay_ms(100); read_add(0x40,0x01,temp,2); //读取PB口的值 read_add(0x40,0x02,temp,2); //把PB口的值输出到PA口 while(1); }