本帖最后由 watercici 于 2018-5-3 15:07 编辑 我又一个IIC的读函数如下; u8 I2C_Read_Byte(unsigned char ack) { //unsigned char i,receive=0; u8 i,receive = 0; SDA_IN(); for(i=0;i<8;i++ ) { SCL_H(); delay_us(5); receive<<=1; if(READ_SDA())receive++; delay_us(5); SCL_L(); delay_us(5); } if (!ack) I2C_NACK(); else I2C_ACK(); return receive; } 他的上一层是:void I2C_Read_Function(u8 ReadAddr,u8 ReData) { I2C_START(); I2C_Send_Byte(PCF8563_ADDR_W); if(I2C_Wait_ACK())return; I2C_Send_Byte(ReadAddr); if(I2C_Wait_ACK())return; I2C_START(); I2C_Send_Byte(PCF8563_ADDR_R); if(I2C_Wait_ACK())return; ReData = I2C_Read_Byte(0); I2C_STOP(); } 而这个函数的上一层是: I2C_Read_Function(PCF8563_SECOND_REGISTER,R_date.Second_Time); 这个函数在调试的时候发现,receive是有读取到值,当我顶层调用的时候,ReData也是有值的,可是顶层R_date.Second_Time的值一直都是0x00 这个是什么原因呢,数据类型都是U8没有问题啊? |
评分
查看全部评分
void I2C_Read_Function(u8 ReadAddr,u8 *ReData)
I2C_Read_Function(PCF8563_SECOND_REGISTER,&R_date.Second_Time);
函数参数是局部变量,只在函数内有效
评分
查看全部评分
你的意思参数必须得定义成指针吗,是这样吗,我之前也有直接传递变量的时候啊
如果,你是需要往函数里传入值,可以直接传递变量,如果你要从函数返回值,要么直接返回,要么通过参数的指针来操作函数外层的参数
那下面这个函数呢:
R_date.Second_Time = (u8)BCDToDec(R_date.Second_Time & 0x7f);
unsigned char BCDToDec(unsigned char _BCD)
{
unsigned char temp = 0;
unsigned char temp1 = 0;
temp = ((unsigned char)(_BCD & (unsigned char)0xF0) >> (unsigned char)0x04) * 10;
temp1 = temp + (_BCD & (unsigned char)0x0F);
return temp1;
}
这个是temp1的返回值给不了R_date.Second_Time,这个是怎么回事??
在线等,谢谢,有点儿着急
你这个函数是对的呀,你在PC上单独测试这个函数是正确的
评分
查看全部评分
老铁 黑皮男说的对
你坚持值传递也可以如下
u8 I2C_Read_Function(u8 ReadAddr)
{
u8 ReData ;
I2C_START();
I2C_Send_Byte(PCF8563_ADDR_W);
if(I2C_Wait_ACK())return;
I2C_Send_Byte(ReadAddr);
if(I2C_Wait_ACK())return;
I2C_START();
I2C_Send_Byte(PCF8563_ADDR_R);
if(I2C_Wait_ACK())return;
ReData = I2C_Read_Byte(0);
I2C_STOP();
return ReData ;
}
R_date.Second_Time=I2C_Read_Function(PCF8563_SECOND_REGISTER);
评分
查看全部评分
可是,我的值传不上来,现在也不能调试,一点运行按钮,就停止,PC指针指向0x00000000
你的BCDToDec函数是对的,返回值可以正确的返回,你可以通过PC来测试
可以看到num的值是变了的,至于你说的在单片机上,值传不上来是其他的问题。
评分
查看全部评分
入口的内容是什么,如果是0返回0是正常的。
评分
查看全部评分
对,这个问题弄明白了,是形参实参的问题
对,这个问题弄明白了,是形参实参的问题