导航:首页 > 操作系统 > 单片机循环右移

单片机循环右移

发布时间:2022-07-27 18:01:36

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

阅读全文

与单片机循环右移相关的资料

热点内容
华为如何将app移到桌面 浏览:597
阿里安卓面试算法题 浏览:705
语文知识手册pdf 浏览:841
为什么安卓手机oled屏很白很亮 浏览:252
如何找回iphone手机隐藏的app 浏览:21
linuxc多进程 浏览:649
android飞行游戏 浏览:965
数据挖掘常见算法 浏览:134
python单实例化 浏览:351
str中python 浏览:89
java的equals用法 浏览:845
奥维云服务器怎么开通 浏览:171
js取得服务器地址 浏览:812
起点中文网小说缓存在哪个文件夹 浏览:216
java疯狂讲义pdf 浏览:300
推有钱app在哪里 浏览:745
宁波鲍斯压缩机 浏览:93
新建文件夹电影2完整版演员表 浏览:988
空调压缩机为什么不能放到冷库用 浏览:89
江西云服务器节点虚拟主机 浏览:997