欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2917|回復: 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 單片機教程網

快速回復 返回頂部 返回列表