久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2660|回復: 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;               
}

回復

使用道具 舉報

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 | 顯示全部樓層
過來學習以下,看看怎么用
回復

使用道具 舉報

ID:401564 發表于 2021-11-5 15:56 | 顯示全部樓層
a=I2cSendByte(地址或者數據)
if(a==0){}
else..............
然后檢測a的值就可以知道寫入有沒有成功了,可以用來提示IIC器件的寫入狀態
前期測試完成之后,代碼沒有問題的話,這個返回值可以用來判定24Cxx的好壞,不能寫入的就是壞的
回復

使用道具 舉報

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表示非應答,這句表達式要如何寫
回復

使用道具 舉報

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();
回復

使用道具 舉報

ID:401564 發表于 2021-11-6 21:25 | 顯示全部樓層
隨風逐流 發表于 2021-11-6 17:24
謝謝,大概明白了,但是如果I2cSendByte(地址或者數據)中的地址或者數據也是變量,
如:其是一個數組, ...

不明白你要表達什么
就說你想要干嘛吧,操作器件的型號是什么?
回復

使用道具 舉報

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
回復

使用道具 舉報

ID:166475 發表于 2021-11-6 23:14 來自觸屏版 | 顯示全部樓層
我的笨辦法是定義一個全局標志位(bit    a)    在if (b>200)后的大括號里面把標志位a=1,如果標志位為1(未應答), 處理函數則判斷標志位處理且把標志位置0  if(a==1)如果標志位為1 { a=0;//標志位重置為0 ……;//需要處理的內容 }  。如果應答,不操作標志位。處理函數因為標志位等于0,不進去函數,直接跳過          以上是我的辦法,寫法不是很專業,但是能用
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品一区二区三区在线观看 | 99视频免费 | 国产精品福利久久久 | 久久精品一区二区三区四区 | 久久影院一区 | 亚洲成人免费视频 | 91久久精品一区二区三区 | 国产成人精品一区二区三区在线 | julia中文字幕久久一区二区 | 亚洲福利一区二区 | 国产1区2区 | 黑人巨大精品欧美黑白配亚洲 | 人人草天天草 | 一级黄色在线 | 久久五月婷 | 久久久精品影院 | 精品日韩一区 | 在线观看精品视频网站 | 欧美日韩综合视频 | 日韩av免费看 | 精品久久久久久久久久 | 成人国产a| 国产精品久久久久久久免费观看 | 久久久久一区二区三区四区 | 久久99深爱久久99精品 | 高清国产一区二区 | 国产黄色精品在线观看 | 亚洲一区二区三区高清 | 久久精品久久久 | 中文视频在线 | 国产视频久久久 | 天天躁日日躁狠狠的躁天龙影院 | 一级毛片色一级 | 成年免费大片黄在线观看岛国 | 玖玖在线免费视频 | 成人自拍av | 亚洲欧美日韩一区二区 | 亚洲小视频 | 成人一区二区在线 | 久久久久久久久久久久久久av | 久久久久久久久久毛片 |