Ⅰ 单片机里不引用_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位也保持为零(视编译器而定,这个得看编译器手册),有些编译器提供了循环移位的函数;
还有什么不明白的补充问题就是