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

標題: 單片機IO口擴展(并轉串)編程疑問 [打印本頁]

作者: 分享請教    時間: 2018-11-11 21:00
標題: 單片機IO口擴展(并轉串)編程疑問
哪位大神能幫我看看,以下程序中  下劃線黑體加粗的問題  
/**************************************************************************************
*                              單片機IO擴展--74HC165實驗                                                                                                  *
實現現象:下載程序后,按下獨立按鍵可以點亮對應的led
                        K1--led1
***************************************************************************************/
#include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
#include "intrins.h"
typedef unsigned int u16;          //對數據類型進行聲明定義
typedef unsigned char u8;
//--定義使用的IO口--//
#define GPIO_LED P0
sbit    IN_PL   = P1^6;   
sbit    IN_Data = P1^7;    //數據通過P1.7腳移進單片機內處理
sbit    SCK    = P3^6;
/*******************************************************************************
* 函 數 名         : Read74HC165
* 函數功能: 使用165讀取一個字節數據
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
u8 Read74HC165(void)
{  
  u8 i;
  u8 indata;
               
   IN_PL = 0;
   _nop_();        //短暫延時 產生一定寬度的脈沖
   IN_PL = 1;           //將外部信號全部讀入鎖存器中
   _nop_();

   indata=0;   //保存數據的變量清0  
   for(i=0; i<8; i++)
    {
          indata = indata<<1;           //左移一位
          SCK = 0;   //時鐘置0         
      _nop_();
          indata |= IN_Data;   //為什么要有或運算,不能直接賦值嗎?????
      SCK = 1;   //時鐘置1         
        }

   return(indata);         
}


/*******************************************************************************
* 函 數 名       : main
* 函數功能                 : 主函數
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void main()
{        
        u8 h165Value;

        GPIO_LED = 0;
        while(1)
        {
                h165Value = Read74HC165();
                if(h165Value != 0xFF)
                {
                        GPIO_LED = ~h165Value;
                }        
        }                        
}



作者: zl2168    時間: 2018-11-12 08:49
本帖最后由 zl2168 于 2018-11-13 23:15 編輯

給你介紹幾個165參考案例
實例25  74HC165串行輸入8/16數據信號

Proteus仿真一下,確認有效
實例25 74HC165串行輸入8-16位數據信號.rar (78.82 KB, 下載次數: 20)


實例70  74HC165串行輸入8位按鍵狀態 實例70 74HC165串行輸入8位按鍵狀態.7z (18.29 KB, 下載次數: 11)
以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil CProteus》清華大學出版社ISBN 978-7-302-41682-1內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。書中電路和程序設計有詳細說明,程序語句條條有注解。



作者: diy1997    時間: 2018-11-12 09:30
比如,indata接收了第1位數據,值為“1” ,這時,indata值為#00000001;

然后向左移1位,為接收下一個數據做準備,這時,indata值為#00000010;

indata開始接收了第2位數據,值為“1” 。

如果直接賦值,indata值為#00000001,接收的第1位數據就沒有了;

如果 indata |= IN_Data;  indata值為#00000011,成功接收第二位;

后面重復,直到接收完8位數據。
作者: ktymm    時間: 2018-11-12 13:44
給你幾個例子參考看看,不難的
作者: 分享請教    時間: 2018-11-12 16:10
diy1997 發表于 2018-11-12 09:30
比如,indata接收了第1位數據,值為“1” ,這時,indata值為#00000001;

然后向左移1位,為接收下一個 ...

謝謝,謝謝!
我有一個疑問,將值“1”賦值給一個字節,就是將00000001付給這個字節,不是說只把1賦給字節的最后一位(不會影響其他的前七位),對吧,我之前一直覺得一個管腳的0和1只會影響所改字節的最后一位,所以之前想的是錯的。



作者: 分享請教    時間: 2018-11-14 10:18
zl2168 發表于 2018-11-12 08:49
給你介紹幾個165參考案例
實例25  74HC165串行輸入8/16位數據信號

謝謝!

作者: 消逝的青盞    時間: 2020-4-15 16:37
不能直接賦值,以下為個人理解,IN_Data一次只能輸出一個狀態的值,和indata進行“或”運算后將狀態保存在最低位,之后進行移位,最低位的值移到次低位,最低位補零,上升沿后,IN_Data輸出下一個狀態的值,和indata“或”運算后接著保存在最低位,,以此類推,得到8位狀態值。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1