Ⅰ 單片機里不引用_crol_(a,1)函數的循環左移和右移的程序是什麼樣的
左移: Data<<=1;
右移: Data>>=1;
循環左移:Data=(Data<<1) | ((Data & 0x80)>>7);
循環右移:Data=(Data>>1) | ((Data & 0x01)<<7);
Ⅱ 請問C51單片機的循環左移和循環右移函數中的「循環」是指什麼
C51單片機的循環左移函數是,_crol_(變數名,n),循環右移函數是,_cror_(變數名,n),函數中的「循環」是指變數的8位二進制數依次向左移一位,或向右移一位。
你比如的,取8位數,讓1111 1110循環左移一位,就是在1111 1110、1111 1101、1111 1011、1111 0111、1110 1111,等等,每移位一次,8位數向左或向右移一位。繼續移位,就會循環重復的。
Ⅲ 為什麼89C51單片機的P2口不能實現循環右移
這個問題不能這么一概而言下結論。
因為,循環移位,首先是讀P2口,問題就出在讀P2口上,是讀P2的外部引腳。
移位後再寫到P2口,是寫到P2的寄存器中。
當有外部引腳被拉低了,那麼讀出P2的狀態與原寄存器P2的狀態是不同的,再移位就不是想要的結果了。
如果沒有猜錯的話,你這是數碼管顯示模擬電路吧,或者是流水燈吧,用P2輸出位碼,就會出現不能循環右移的現象。
解決辦法,用一個變數,如ledbit,對變數移位,左移或者右移都可以,然後再把變數送到P2口,就OK了。
Ⅳ 利用51單片機某個埠實現:首先讓LED燈 每兩位循環左移8次,循環右移8
#include <reg52.h>
#include <intrins.h>
sbit LED7 = P1^7;
sbit LED0 = P1^0;
#define N 1000
//-------------------------------------------------------
//延時Z個ms
//-------------------------------------------------------
void delay(unsigned int z)
{
unsigned int x,y;
for(x = z; x > 0; x--)
for(y = 120; y > 0 ; y--);
}
void main()
{ unsigned int i,j;
while(1)
{
P1 = 0xfc;
for(i=0;i<8;i++) //循環左移
{
P1 =_crol_(P1,2);
delay(N);
}
for(i=0;i<8;i++) //循環右移
{
P1 =_cror_(P1,2);
delay(N);
}
for(i=1;i<=10;i++) //奇、偶交替閃爍10次
{
P1 = 0xaa; //奇數0xaa
delay(N);
P1 = 0x55; //偶數0x55
delay(N);
}
for(j=0;j<8;j++) // 循環左移
{ P1 = 0xfe;
P1 =_crol_(P1,1);
delay(N);
}
for(i=0;i<8;i++) //循環右移
{ P1 = 0x7f;
P1 =_cror_(P1,2);
delay(N);
}
}
}
Ⅳ 51單片機執行循環右移指令的問題
我是這樣想的,每個單元右移8位,然後四個單元右移,就是33H-30H,32H-33H,31H-32H,30H-31H,再左移8位,再單元左移,重復4次。
Ⅵ 單片機循環右移,用c怎麼表示
那裡用樓上兩位那樣羅嗦。
#include <intrins.h>
加入上述的頭文件,不光解決了循環右移,還有循環左移的函數,8位、16位的都有。
Ⅶ 單片機 RRC右移 指令的用法
RRC指令就是帶進位累加器循環右移。舉例說明:
C =1,A=1100 1100B,
執行RRC A後,C=0,A=1110 0110B(A的最低位移給C,並且C原來的值移給A的最高位。)
SETB C(cy=1)
XCH A,R2(兩數交換R2=54H,A=C2H)
JB A.7 , ELSE(若A的最高位為1,則轉至else)
CLR C
ELSE: RRC A(帶進位位右移A=1110 0 001B=E1H Cy=0)
XCH A ,R2(兩數交換後,R2=E1H,A=54H)
RRC A(帶進位位右移A=0010 1 010B=2AH Cy=0)
所以,最終(R2)=E1H,(A)=2AH
(7)單片機循環右移擴展閱讀:
控制轉移類指令還包括以下:
1、無條件轉移指令 AJMP addrll (2位元組指令),2K(地址211)位元組范圍內的無條件跳轉指令。64K程序存儲器空間分為32個區,每區2K位元組,轉移的目標地址必須與AJMP下一條指令的地址高5位地址碼A15-A11相同。
指令執行時,先PC加2,然後把addrll送入PC.10~PC.0,PC.15~PC.11保持不變,程序轉移到目標地址。注意:轉移目標首地址必須在AJMP指令下一條指令地址(PC+2)的2KB范圍內。
2、長跳轉指令 LJMP addr16 (3位元組指令),64K位元組范圍內的無條件跳轉指令。指令執行時,把指令的第二和第三位元組分別裝入PC的高位和低位位元組中,無條件地轉向addr16指出的目標地址。
目標地址可以在64K程序存儲器地址空間的任何位置。注意:短跳轉、長跳轉指令中addrll、addr16直接寫上要轉向的目標地址標號(即符號地址)就可以。
3、相對轉移指令 SJMP rel (雙位元組),rel為8位帶符號二進制補碼數(-128~+127),實現程序的雙向轉移。在編寫程序時,直接寫上要轉向的目標地址標號就可以。
4、間接跳轉(散轉)指令JMP @A+DPTR (三位元組),由A中8位無符號數與DPTR的16位數內容之和來確定。以DPTR內容作為基址,A的內容作變址。
5、條件轉移指令 (雙位元組)
JZ rel ; 如果累加器為「0」,則轉移
JNZ rel; 如果累加器非「0」,則轉移
Ⅷ 單片機 移位操作 右移 C語言
先說第一個問題:
比如用查表法將結果保存到變數i中,查表變數為x,則i=table[x],記住c語言裡面數組是從0開始的,比如說上面的0x01就是table[0],0x02是table[1],以此類推。
再說第二個問題:
比如說從p1.0口發送出去,則可以寫為
sbitout=p1^0;//定義out為p1.0口,這樣今後好寫程序
chari;
for(i=0;i<8;i++)
{
out=data&0x80;//因為高位在前,將它寫成二進制就明白了
data<<=1;
}
上面的程序就能搞定了;
應該是所有的單片機都有cy位(不知道浮點dsp有沒有);
c語言中左移和右移之後低位或高位自動補零,cy位也保持為零(視編譯器而定,這個得看編譯器手冊),有些編譯器提供了循環移位的函數;
還有什麼不明白的補充問題就是