标题: 求教:C51带参数的子函数其带返回值,如何调用问题 [打印本页]

作者: 随风逐流    时间: 2021-11-5 09:24
标题: 求教:C51带参数的子函数其带返回值,如何调用问题
以下为IIC总线其发送一个字节等待应答,成功1,失败0,请问我的其它函数需要引用其结果是0或者1,要怎么引用,刚接触请各位大神指点下,万分感谢,最好举个列子,好理解点,谢谢了
/*******************************************************************************
* 函数名         : I2cSendByte(unsigned char dat)
* 函数功能                 : 通过I2C发送一个字节。在SCL时钟信号高电平期间,保持发送信号SDA保持稳定
* 输入           : num
* 输出                  : 0或1。发送成功返回1,发送失败返回0
* 备注           : 发送完一个字节SCL=0,SDA=1
*******************************************************************************/

unsigned char I2cSendByte(unsigned char dat)
{
        unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。               
        for(a=0;a<8;a++)//要发送8位,从最高位开始
        {
                SDA=dat>>7;         //起始信号之后SCL=0,所以可以直接改变SDA信号
                dat=dat<<1;
                Delay10us();
                SCL=1;
                Delay10us();//建立时间>4.7us
                SCL=0;
                Delay10us();//时间大于4us               
        }
        SDA=1;
        Delay10us();
        SCL=1;
        while(SDA)//等待应答,也就是等待从设备把SDA拉低
        {
                b++;
                if(b>200)         //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束
                {
                        SCL=0;
                        Delay10us();
                        return 0;
                }
        }
        SCL=0;
        Delay10us();
        return 1;               
}


作者: munuc_w    时间: 2021-11-5 12:34
最笨的方法,把返回值给一个变量,再把变量传给函数。
作者: AUG    时间: 2021-11-5 13:39
bool func(void)
{
   bool ret = false;
  //下面是你的处理函数  
//假如以A+B的结果做判读
   if((A+B)>0)  ret = true;
  else ret = false;
//上述为假设
   return ret ;
}
作者: aide51    时间: 2021-11-5 13:49
过来学习以下,看看怎么用
作者: Y_G_G    时间: 2021-11-5 15:56
a=I2cSendByte(地址或者数据)
if(a==0){}
else..............
然后检测a的值就可以知道写入有没有成功了,可以用来提示IIC器件的写入状态
前期测试完成之后,代码没有问题的话,这个返回值可以用来判定24Cxx的好坏,不能写入的就是坏的
作者: 随风逐流    时间: 2021-11-6 17:24
Y_G_G 发表于 2021-11-5 15:56
a=I2cSendByte(地址或者数据)
if(a==0){}
else..............

谢谢,大概明白了,但是如果I2cSendByte(地址或者数据)中的地址或者数据也是变量,
如:其是一个数组,含四个数据,
while(n--)//n表示数量
        {
                *buf++=I2cReadByte();
        当n=0时,I2cReadByte()发送0表示非应答,这句表达式要如何写
作者: 随风逐流    时间: 2021-11-6 17:38
munuc_w 发表于 2021-11-5 12:34
最笨的方法,把返回值给一个变量,再把变量传给函数。

但 I2cSendByte(unsigned char dat)中的dat是个数组或者是变量时,如何定义呢?在连续读取字节时:
        //读取任意长度字节               
void NC_Read(unsigned char addr,unsigned char n,unsigned char *buf)
  {
//                unsigned char num;
        I2cStart();
        I2cSendByte(0xa0); //发送写器件地址
        I2cSendByte(addr); //发送要读取的地址
        I2cStart();
        I2cSendByte(0xa1); //发送读器件地址
        while(n--)
        {
                *buf++=I2cReadByte();
       
                {
                      当N=0时
                         要使函数I2cSendByte(unsigned char dat)返回0,这个表达式怎么写;
                }

        }
        I2cStop();
作者: Y_G_G    时间: 2021-11-6 21:25
随风逐流 发表于 2021-11-6 17:24
谢谢,大概明白了,但是如果I2cSendByte(地址或者数据)中的地址或者数据也是变量,
如:其是一个数组, ...

不明白你要表达什么
就说你想要干嘛吧,操作器件的型号是什么?

作者: 随风逐流    时间: 2021-11-6 22:21
Y_G_G 发表于 2021-11-6 21:25
不明白你要表达什么
就说你想要干嘛吧,操作器件的型号是什么?

但 I2cSendByte(unsigned char dat)中的dat是个数组或者是变量时,如何定义呢?在连续读取字节时:
        //读取任意长度字节               
void NC_Read(unsigned char addr,unsigned char n,unsigned char *buf)
  {
//                unsigned char num;
        I2cStart();
        I2cSendByte(0xa0); //发送写器件地址
        I2cSendByte(addr); //发送要读取的地址
        I2cStart();
        I2cSendByte(0xa1); //发送读器件地址
        while(n--)
        {
                *buf++=I2cReadByte();
      
                {
                      当N=0时
                         要使函数I2cSendByte(unsigned char dat)返回0,这个表达式怎么写;
                }
        }
        I2cStop();
红色部分要如何书写,90c51+24c02+pcf8591
作者: 1314520jieber    时间: 2021-11-6 23:14
我的笨办法是定义一个全局标志位(bit    a)    在if (b>200)后的大括号里面把标志位a=1,如果标志位为1(未应答), 处理函数则判断标志位处理且把标志位置0  if(a==1)如果标志位为1 { a=0;//标志位重置为0 ……;//需要处理的内容 }  。如果应答,不操作标志位。处理函数因为标志位等于0,不进去函数,直接跳过          以上是我的办法,写法不是很专业,但是能用
作者: Y_G_G    时间: 2021-11-7 12:26
void NC_Read(unsigned char addr,unsigned char n,unsigned char *buf)
你把这个函数改一下不就可以了吗?
unsigned char I2cSendByte(unsigned char dat)
这个函数是有返回值的,你在写入IIC器件的时候,得使用这个返回值呀,你得让这个返回值派上用场呀
如果都不用这个返回值,那还返回干嘛,直接等待不就行了
void NC_Read(unsigned char addr,unsigned char n,unsigned char *buf)
  {
//                unsigned char num;
        unsigned char a;
        I2cStart();
        a=I2cSendByte(0xa0); //发送写器件地址
if(a==0).................................//a==0时,器件是没有正常应答的,这里要处理
        a=I2cSendByte(addr); //发送要读取的地址

        I2cStart();
        a=I2cSendByte(0xa1); //发送读器件地址

        while(n--)
        {
                *buf++=I2cReadByte();
      
                {
                      当N=0时
                         要使函数I2cSendByte(unsigned char dat)返回0,这个表达式怎么写;
                }
        }
        I2cStop();





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1