欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
關于單片機74hc595控制點陣程序dat<<=1; 移位的意義?
[打印本頁]
作者:
zzh985514474
時間:
2019-6-3 17:53
標題:
關于單片機74hc595控制點陣程序dat<<=1; 移位的意義?
單片機源程序如下:
#include "reg51.h" //此文件中定義了單片機的一些特殊功能寄存器
#include<intrins.h>
typedef unsigned int u16; //對數據類型進行聲明定義
typedef unsigned char u8;
sbit SRCLK=P3^6; //595的11腳
數據輸入時鐘線
sbit RCLK=P3^5; //595的12腳
輸出存儲器鎖存時鐘線
sbit SER=P3^4; //595的14腳
串行數據輸入
/*******************************************************************************
* 函數名 : Hc595SendByte(u8 dat)
* 函數功能 : 向74HC595發送一個字節的數據
* 輸入 : 無
* 輸出 : 無
*******************************************************************************/
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; 請問這一步的 移位的意義具體是什么 ,為啥先啥最高位(最高位是啥?)然后又是次高位,為啥沒有第三位,第四位等
作者:
devcang
時間:
2019-6-3 21:15
轉成二進制顯示,就知道哪個是最高位、哪個是最低位了
SER=dat>>7; ///SER得到是值,是最高位的
dat<<=1;//然后,數據往右移一位。。。。。。準備下一次循環
1個unsign char是8 bits 。。。。。。。。。。。。。。
作者:
honey_teck
時間:
2019-6-3 21:19
dat>>7;執行結果就是將最高位移到了最低位,然后將最低位賦給SER,
dat<<=1;執行結果就是將dat右移一位。
下一次循環時,就相當于將第7位賦給SER,循環8次,正好將1 byte數據按位發送出去了
作者:
y309976659
時間:
2019-6-3 22:56
SER=dat>>7;//這句的意思是,把dat最高位的值賦給SER
dat <<= 1;//這句意思是,剛才已經把dat的最高位發送出去了,現在準備發dat的下一位。
通過一個循環for(a=0;a<8;a++)分8次分別把dat的8位發送出去的。
作者:
幻劍心
時間:
2019-6-3 23:17
SER=dat>>7; 將dat(二進制數)右移7位(正數左補0,右邊舍棄。負數左補1,右邊舍棄)所得到的結果(值)賦值給SER。dat自身值不變。
dat<<=1; 相當于dat = dat<<1; 即dat(二進制數)本身左移1位(左邊的數舍棄,右邊補0),然后復制給自身。就是自身執行左移。
作者:
cjm82
時間:
2019-6-4 01:43
最高位就是最左邊的一位,比如8位的二進制數1100 1010最高位為1 然后依次往右數,一般習慣稱最右邊的一位為第0位(2的0次方),或者最低位,所以對于8位二進制數,最高位就記作第7位.需要注意,比如8位二進制數 11 0010的最高位為0而不是1.
因為 11 0010 = 0011 0010.
為什么是最高位,這個是595的規定(也有其他的器件規定為先最低位的),就跟中國的車方向盤在左邊,英國的車方向盤在右邊一個道理.
SER=dat>>7;就是把dat這個8位二進制數右移7位后,賦值給SER,即將dat的最高位賦值給SER.注意是dat>>7,沒有賦值操作,所以執行后,dat的值沒有改變,原來是什么,現在還是什么.
dat<<=1;就是把dat原來的值左移一位,再賦值給dat,(這次有賦值操作,所以會改變原先的值)多出來的最低位自動用0來填充,比如dat原來為 1101 0111,執行了dat<<=1;后 dat為 1010 1110,其實就是將原數據的第6位(從左邊數第2位),移到第7位.等下次執行 SER=dat>>7;時,將之賦下一次的DAT,依此類推,直到執行完循環.
作者:
wulin
時間:
2019-6-4 05:53
HC595是8位串行輸入并行輸出器件,也就是從高到低逐位輸入8位數據,待完成后同時輸出8位數據
void Hc595SendByte(u8 dat)
{
u8 a;
SRCLK=0;//移位時鐘清0
RCLK=0;//鎖存輸出清0
for(a=0;a<8;a++)//循環8次,從高到低逐位輸出8位數據
{
SER=dat>>7;//將變量dat右移7位,dat的最高位的值就到了最低位,并賦值數據輸出端SER
//此時變量dat的值并沒有改變
dat<<=1; //dat右移1位,最高位溢出舍棄,次高位成為最高位,最低位補0
SRCLK=1; //輸出移位時鐘信號,HC595收到的數據從低到高移動1位鎖存,鎖存器中最高位由Q7'溢出(級聯)
_nop_();
_nop_();
SRCLK=0;
}
RCLK=1; //完成8位串行數據輸入后打開HC595鎖存器輸出,8位數據同時輸出,在此之前HC595輸出端保持原態不變
_nop_();
_nop_();
RCLK=0;
}
作者:
yzwzfyz
時間:
2019-6-4 08:22
結合電路圖看,一目了然!
作者:
人類第一步
時間:
2020-8-13 08:38
wulin 發表于 2019-6-4 05:53
HC595是8位串行輸入并行輸出器件,也就是從高到低逐位輸入8位數據,待完成后同時輸出8位數據
void Hc595Se ...
我想問一下那個_nop_()空指令的作用是什么?
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1