找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3159|回復(fù): 12
收起左側(cè)

單片機新手求教74HC595位移程序的執(zhí)行分析,百思不得其解

[復(fù)制鏈接]
ID:387946 發(fā)表于 2018-8-19 21:37 | 顯示全部樓層 |閱讀模式
在編寫74HC595芯片編程時,位移問題百思不得其解:
typedef unsigned char u8;
sbit SER=p3^4;

void SendTo595(u8 indata){
        u8 i=0;
        for(;i<8;i++){         
                SER=indata>>7;
                indata=indata<<1;
                }

如果我傳入的indata=1001 1001,將indata>>7,是不是變成0000 0001,再把移位后的數(shù)值賦值給SER,那不是SER=0嗎?但顯示結(jié)果是1,這是為什么呢?

回復(fù)

使用道具 舉報

ID:19198 發(fā)表于 2018-8-20 03:45 | 顯示全部樓層
10011001右移7位是0000001

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:19198 發(fā)表于 2018-8-20 03:47 | 顯示全部樓層
0000001是U8數(shù)據(jù),賦值給位數(shù)據(jù)取最后一位就是1

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:279667 發(fā)表于 2018-8-20 08:45 | 顯示全部樓層
1001 1001 右移7位后得到數(shù)值 0000 0001,這個數(shù)值是2進制數(shù),那最后一位代表2^0(2的0次方),也就是右移后得到一個2的0次方數(shù),那么最后的結(jié)果就是1了(2的0次方等于1)。

評分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:387946 發(fā)表于 2018-8-20 10:21 | 顯示全部樓層
trm999 發(fā)表于 2018-8-20 03:47
0000001是U8數(shù)據(jù),賦值給位數(shù)據(jù)取最后一位就是1

給位數(shù)據(jù)賦值,不是取第一位嗎?難道是取最后一位?
回復(fù)

使用道具 舉報

ID:387946 發(fā)表于 2018-8-20 10:24 | 顯示全部樓層
mrhan1992 發(fā)表于 2018-8-20 08:45
1001 1001 右移7位后得到數(shù)值 0000 0001,這個數(shù)值是2進制數(shù),那最后一位代表2^0(2的0次方),也就是右移 ...

0000 0001=2^0,這個我明白,我只是奇怪,為什么右移后是把末位賦值人SER,而不是首位賦值給SER
回復(fù)

使用道具 舉報

ID:164602 發(fā)表于 2018-8-20 13:01 | 顯示全部樓層
yanyongtom 發(fā)表于 2018-8-20 10:24
0000 0001=2^0,這個我明白,我只是奇怪,為什么右移后是把末位賦值人SER,而不是首位賦值給SER

很正常啊。
因為SER是一位,一個八位賦值給一位,自動取低位。同理,一個十六位賦值給八位,同樣,自動取低八位。以此可以類推的。
回復(fù)

使用道具 舉報

ID:388125 發(fā)表于 2018-8-20 14:32 | 顯示全部樓層
確實,一個字節(jié)的數(shù)值賦值給一個比特,選最低位賦值。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:388142 發(fā)表于 2018-8-20 14:52 | 顯示全部樓層
10011001右移7位是0000001

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:287739 發(fā)表于 2018-8-20 15:39 | 顯示全部樓層
indata右移7位等于00000001
回復(fù)

使用道具 舉報

ID:287739 發(fā)表于 2018-8-20 15:44 | 顯示全部樓層
10011001右移7位是0000001,取最后一位,所以SEG=1啊

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:388197 發(fā)表于 2018-8-20 16:38 | 顯示全部樓層
indata= 1001 1001;
SER = indata>>7;
可以這么理解
這兩句執(zhí)行后,indata右移7位后(0000 0001)的最低位賦值給SER,即SER = 1,
然后這兩句執(zhí)行過程中,indata并沒有重新賦值,indata的值仍然是1001 1001.
如需要移位操作后將移位后的值賦予原變量,
應(yīng)該是
indata >>= 7;
關(guān)于74HC595適合用來與74HC165配合來用做IO口擴展
我這有當(dāng)年我學(xué)習(xí)該芯片的一些程序,樓主可以參考下
bdata u8 out_data;
sbit ds = PX^X;               
sbit shcp = PX^X;          //74hc595時鐘引腳
sbit mr = PX^X;            //74HC595清零引腳,低電平有效,可直接接VCC
sbit stcp = PX^X;         //相當(dāng)于片選信號
sbit stcp2 = PX^X;
sbit buf = out_data^7;
void tran(u8 dat)
{
        u8 i = 0;
        shcp = 0;
        out_data = dat;
        while(i<8)
        {
                ds = buf;
                shcp = 1;
                _nop_();
                _nop_();
                shcp = 0;
                out_data<<=1;
                i++;
        }
}

void tran_data(u8 dat,u8 which)
{
        tran(dat);
        if(which == 0)
        {
                stcp = 0;
                _nop_();
                _nop_();
                stcp = 1;
        }

        if(which == 1)
        {
                stcp2 = 0;
                _nop_();
                _nop_();
                stcp2 = 1;
       
        }
}

74HC595可以多片并聯(lián),時鐘信號SHCP,串行數(shù)據(jù)DS端并在一起,用STCP腳作片選.

參考電路

參考電路
回復(fù)

使用道具 舉報

ID:388197 發(fā)表于 2018-8-20 16:41 | 顯示全部樓層
我以前用74HC595的代碼
bdata u8 out_data;
sbit ds = P4^0;
sbit shcp = P4^1;
sbit mr = P4^2;
sbit stcp = P4^3;
sbit stcp2 = P4^4;
sbit buf = out_data^7;

void tran(u8 dat)
{
        u8 i = 0;
        shcp = 0;
        out_data = dat;
        while(i<8)
        {
                ds = buf;
                shcp = 1;
                _nop_();
                _nop_();
                shcp = 0;
                out_data<<=1;
                i++;
        }
}

void tran_data(u8 dat,u8 which)
{
        tran(dat);
        if(which == 0)
        {
                stcp = 0;
                _nop_();
                _nop_();
                stcp = 1;
        }

        if(which == 1)
        {
                stcp2 = 0;
                _nop_();
                _nop_();
                stcp2 = 1;
       
        }
}
附件是參考電路
1.png

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表