单片机 移位操作 右移 C语言

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-08-30
单片机 移位操作 右移 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位也保持为零(视编译器而定,这个得看编译器手册),有些编译器提供了循环移位的函数;
还有什么不明白的补充问题就是

用这种移位语句,就是这种结果。

你试试:_crol_()和_cror_()移位函数。

需要先加上头文件:
#include

C51系列单片机中_crol_指令是循环左移函数,_cror_是循环右移函数,这是51中特有的指令,别的类型单片机就不能使用了。易于程序的移植和通用性考虑个人比较推荐用<< 左移, 右移>>这两个C中的移位符号。

楼主:
看我给你修改一下,作为给你参考:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delayms(uint);
uchar aa;
void main()
{
aa=0xfe;
//你原来的
while(1)
{
P1=aa;
delayms(500);
aa=_crol_(aa,1);
}
//下面我写的
//右移1位
while(1)
{
P1=aa;
delayms(500);
aa=aa<<1; //右移1位
}
//左移1位
while(1)
{
P1=aa;
delayms(500);
aa=aa>>1; //左移1位
}

//右移8位
while(1)
{
unsigned char i;
for(i=0;i<8;i++)
{
P1=aa;
delayms(500);
aa=aa>>1;
}
}

}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//这个是做流水灯时候 运用系统文件里自带的_crol_函数进行移位 此函数是左移函数 什么函数能是此程序右移?或者如何编写 谢谢

_crol_是左移函数,_cror_是右移函数;
我建议使用<<左移或>>右移,这样会容易理解;

_cror_这个是右移
#include<reg52.h>//从D0---D7依次点亮
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp;
void delay(uint);
void main()
{

temp=0xfe;
while(1)
{
for(int num=0;num<8;num++)
{
P1=temp;
delay(100);
temp=_crol_(temp,1);
P1=0xff;
delay(100);
}

}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--)
;
}