找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

關(guān)于單片機(jī)74hc595控制點(diǎn)陣程序dat<<=1; 移位的意義?

[復(fù)制鏈接]
ID:538271 發(fā)表于 2019-6-3 17:53 | 顯示全部樓層 |閱讀模式
單片機(jī)源程序如下:

#include "reg51.h"                         //此文件中定義了單片機(jī)的一些特殊功能寄存器
#include<intrins.h>

typedef unsigned int u16;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;

sbit SRCLK=P3^6;                  //595的11腳數(shù)據(jù)輸入時(shí)鐘線
sbit RCLK=P3^5;                    //595的12腳輸出存儲(chǔ)器鎖存時(shí)鐘線
sbit SER=P3^4;                      //595的14腳串行數(shù)據(jù)輸入


/*******************************************************************************
* 函數(shù)名         : Hc595SendByte(u8 dat)
* 函數(shù)功能                   : 向74HC595發(fā)送一個(gè)字節(jié)的數(shù)據(jù)
* 輸入           : 無(wú)
* 輸出                  : 無(wú)
*******************************************************************************/
void Hc595SendByte(u8 dat)
{
        u8 a;
        SRCLK=0;
        RCLK=0;
        for(a=0;a<8;a++)
        {
                SER=dat>>7;
                dat<<=1;

                SRCLK=1;
                _nop_();
                _nop_();
                SRCLK=0;        
        }

        RCLK=1;
        _nop_();
        _nop_();
        RCLK=0;
}void main()
{               
        Hc595SendByte(0x80);
        P0=0x7f;
        while(1);               
}

SER=dat>>7;
dat<<=1;      請(qǐng)問(wèn)這一步的 移位的意義具體是什么 ,為啥先啥最高位(最高位是啥?)然后又是次高位,為啥沒(méi)有第三位,第四位等


回復(fù)

使用道具 舉報(bào)

ID:277550 發(fā)表于 2019-6-3 21:15 | 顯示全部樓層
轉(zhuǎn)成二進(jìn)制顯示,就知道哪個(gè)是最高位、哪個(gè)是最低位了
SER=dat>>7;  ///SER得到是值,是最高位的

dat<<=1;//然后,數(shù)據(jù)往右移一位。。。。。。準(zhǔn)備下一次循環(huán)


1個(gè)unsign char是8 bits  。。。。。。。。。。。。。。
回復(fù)

使用道具 舉報(bào)

ID:415123 發(fā)表于 2019-6-3 21:19 | 顯示全部樓層
dat>>7;執(zhí)行結(jié)果就是將最高位移到了最低位,然后將最低位賦給SER,
dat<<=1;執(zhí)行結(jié)果就是將dat右移一位。
下一次循環(huán)時(shí),就相當(dāng)于將第7位賦給SER,循環(huán)8次,正好將1 byte數(shù)據(jù)按位發(fā)送出去了
回復(fù)

使用道具 舉報(bào)

ID:554215 發(fā)表于 2019-6-3 22:56 | 顯示全部樓層
SER=dat>>7;//這句的意思是,把dat最高位的值賦給SER
dat <<= 1;//這句意思是,剛才已經(jīng)把dat的最高位發(fā)送出去了,現(xiàn)在準(zhǔn)備發(fā)dat的下一位。
通過(guò)一個(gè)循環(huán)for(a=0;a<8;a++)分8次分別把dat的8位發(fā)送出去的。
回復(fù)

使用道具 舉報(bào)

ID:511890 發(fā)表于 2019-6-3 23:17 | 顯示全部樓層
SER=dat>>7; 將dat(二進(jìn)制數(shù))右移7位(正數(shù)左補(bǔ)0,右邊舍棄。負(fù)數(shù)左補(bǔ)1,右邊舍棄)所得到的結(jié)果(值)賦值給SER。dat自身值不變。
dat<<=1; 相當(dāng)于dat = dat<<1; 即dat(二進(jìn)制數(shù))本身左移1位(左邊的數(shù)舍棄,右邊補(bǔ)0),然后復(fù)制給自身。就是自身執(zhí)行左移。
回復(fù)

使用道具 舉報(bào)

ID:388197 發(fā)表于 2019-6-4 01:43 | 顯示全部樓層
最高位就是最左邊的一位,比如8位的二進(jìn)制數(shù)1100 1010最高位為1 然后依次往右數(shù),一般習(xí)慣稱最右邊的一位為第0位(2的0次方),或者最低位,所以對(duì)于8位二進(jìn)制數(shù),最高位就記作第7位.需要注意,比如8位二進(jìn)制數(shù) 11 0010的最高位為0而不是1.
因?yàn)?11 0010 = 0011 0010.
為什么是最高位,這個(gè)是595的規(guī)定(也有其他的器件規(guī)定為先最低位的),就跟中國(guó)的車方向盤(pán)在左邊,英國(guó)的車方向盤(pán)在右邊一個(gè)道理.
SER=dat>>7;就是把dat這個(gè)8位二進(jìn)制數(shù)右移7位后,賦值給SER,即將dat的最高位賦值給SER.注意是dat>>7,沒(méi)有賦值操作,所以執(zhí)行后,dat的值沒(méi)有改變,原來(lái)是什么,現(xiàn)在還是什么.
dat<<=1;就是把dat原來(lái)的值左移一位,再賦值給dat,(這次有賦值操作,所以會(huì)改變?cè)鹊闹?多出來(lái)的最低位自動(dòng)用0來(lái)填充,比如dat原來(lái)為 1101 0111,執(zhí)行了dat<<=1;后 dat為 1010 1110,其實(shí)就是將原數(shù)據(jù)的第6位(從左邊數(shù)第2位),移到第7位.等下次執(zhí)行 SER=dat>>7;時(shí),將之賦下一次的DAT,依此類推,直到執(zhí)行完循環(huán).
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2019-6-4 05:53 | 顯示全部樓層
HC595是8位串行輸入并行輸出器件,也就是從高到低逐位輸入8位數(shù)據(jù),待完成后同時(shí)輸出8位數(shù)據(jù)
void Hc595SendByte(u8 dat)
{
        u8 a;
        SRCLK=0;//移位時(shí)鐘清0
        RCLK=0;//鎖存輸出清0
        for(a=0;a<8;a++)//循環(huán)8次,從高到低逐位輸出8位數(shù)據(jù)
        {
                SER=dat>>7;//將變量dat右移7位,dat的最高位的值就到了最低位,并賦值數(shù)據(jù)輸出端SER
                   //此時(shí)變量dat的值并沒(méi)有改變
                dat<<=1;   //dat右移1位,最高位溢出舍棄,次高位成為最高位,最低位補(bǔ)0
                SRCLK=1;   //輸出移位時(shí)鐘信號(hào),HC595收到的數(shù)據(jù)從低到高移動(dòng)1位鎖存,鎖存器中最高位由Q7'溢出(級(jí)聯(lián))
                _nop_();
                _nop_();
                SRCLK=0;        
        }       
        RCLK=1;  //完成8位串行數(shù)據(jù)輸入后打開(kāi)HC595鎖存器輸出,8位數(shù)據(jù)同時(shí)輸出,在此之前HC595輸出端保持原態(tài)不變
        _nop_();
        _nop_();
        RCLK=0;
}
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2019-6-4 08:22 | 顯示全部樓層
結(jié)合電路圖看,一目了然!
回復(fù)

使用道具 舉報(bào)

ID:796973 發(fā)表于 2020-8-13 08:38 | 顯示全部樓層
wulin 發(fā)表于 2019-6-4 05:53
HC595是8位串行輸入并行輸出器件,也就是從高到低逐位輸入8位數(shù)據(jù),待完成后同時(shí)輸出8位數(shù)據(jù)
void Hc595Se ...

我想問(wèn)一下那個(gè)_nop_()空指令的作用是什么?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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