『壹』 單片機C語言右移指令怎麼用
用這種移位語句,就是這種結果。
你試試:_crol_()和_cror_()移位函數。
需要先加上頭文件:
#include<intrins.h>
『貳』 51單片機執行循環右移指令的問題
我是這樣想的,每個單元右移8位,然後四個單元右移,就是33H-30H,32H-33H,31H-32H,30H-31H,再左移8位,再單元左移,重復4次。
『叄』 單片機 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
(3)單片機右環移擴展閱讀:
控制轉移類指令還包括以下:
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語言和單片機中的左移右移
# include "reg51.h" // 包含頭文件
#define uchar unsigned char
void delay02s(void) // 延時0.2s子程序
{
unsigned char i,j,k;
for ( i=2;i>0;i-- )
for (j=200;j>0;j-- )
for (k=250;k>0;k-- );
}
void main (void) // 主函數
{
uchar i,j;
while (1) // 死循環
{
j=0x01; // j初始化為0x01,左移初始值
for(i=0;i<8;i++) // for循環語句,完成8個循環
{
P1= ~ j; // 對變數j 中的值按位取反後,從P1口輸出
delay02s( ); // 延時0.2s
j= j<<1; // 左移1位
}
j=0x80; // 設置右移初始值j為0x80
for (i=0;i<8;i++)
{
P1= ~ j;
delay02s( );
j= j>>1; // 右移1位
}
}
}