找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 2607|回复: 10
打印 上一主题 下一主题
收起左侧

求教:C51带参数的子函数其带返回值,如何调用问题

[复制链接]
回帖奖励 2 黑币 回复本帖可获得 2 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:970242 发表于 2021-11-5 09:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下为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;               
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

举报

沙发
ID:752974 发表于 2021-11-5 12:34 | 只看该作者
最笨的方法,把返回值给一个变量,再把变量传给函数。
回复

举报

板凳
ID:313048 发表于 2021-11-5 13:39 | 只看该作者
bool func(void)
{
   bool ret = false;
  //下面是你的处理函数  
//假如以A+B的结果做判读
   if((A+B)>0)  ret = true;
  else ret = false;
//上述为假设
   return ret ;
}
回复

举报

地板
ID:372579 发表于 2021-11-5 13:49 | 只看该作者
过来学习以下,看看怎么用
回复

举报

5#
ID:401564 发表于 2021-11-5 15:56 | 只看该作者
a=I2cSendByte(地址或者数据)
if(a==0){}
else..............
然后检测a的值就可以知道写入有没有成功了,可以用来提示IIC器件的写入状态
前期测试完成之后,代码没有问题的话,这个返回值可以用来判定24Cxx的好坏,不能写入的就是坏的
回复

举报

6#
ID:970242 发表于 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表示非应答,这句表达式要如何写
回复

举报

7#
ID:970242 发表于 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();
回复

举报

8#
ID:401564 发表于 2021-11-6 21:25 | 只看该作者
随风逐流 发表于 2021-11-6 17:24
谢谢,大概明白了,但是如果I2cSendByte(地址或者数据)中的地址或者数据也是变量,
如:其是一个数组, ...

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

举报

9#
ID:970242 发表于 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
回复

举报

10#
ID:166475 发表于 2021-11-6 23:14 来自触屏版 | 只看该作者
我的笨办法是定义一个全局标志位(bit    a)    在if (b>200)后的大括号里面把标志位a=1,如果标志位为1(未应答), 处理函数则判断标志位处理且把标志位置0  if(a==1)如果标志位为1 { a=0;//标志位重置为0 ……;//需要处理的内容 }  。如果应答,不操作标志位。处理函数因为标志位等于0,不进去函数,直接跳过          以上是我的办法,写法不是很专业,但是能用
回复

举报

11#
ID:401564 发表于 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();
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表