求大神帮忙,单片机C语言问题,用一个开关控制单一灯的左移右移,开关按下灯右移,正常左移 ,求帮助

求大神帮忙,单片机C语言问题,用一个开关控制单一灯的左移右移,开关按下灯右移,正常左移 ,求帮助,第1张

#include unsigned char S1; unsigned int a; void int5() interrupt 0 { if(INT0==0) { S1++; if(S1>1) S1=0; } } main() { char i; EA=1; IT0=1;//外部中断设定为边沿触发 EX0=1;//开外部中断 while(1) { switch(S1)//根据S1按键的次数来确定功能 { {case 0: for(i=7;i>=0;i--) //八次循环 { P1=xianshi[i]; //控制流水灯左移 for(a=0;a<30000;a++);//延时 }break; {case 1: for(i=0;i<8;i++)//八次循环 { P1=xianshi[i]; //控制流水灯右移 for(a=0;a<30000;a++);//延时 }break; } } } }

C语言中没有提供循环移位的 *** 作符,但可以通过简洁的方式实现循环移位
设一个 *** 作数x有s位则循环左移n位的 *** 作为:
(x << n) | (x >> (s - n));
同理右移n位位:
(x >> n) | (x << (s - n));
你可以#define XX (x<<n) | (x>>(s-n)
。。。
补充下:上面是当 n<=s的情况 当n>s的话 只要把n改为 (n%s)就可以了

左移
右移都是位运算
a<<=1相当于a=a<<1
a>>=1相当于a=a>>1
左移一位相当于所有二进制依次左移一位
低位补0
高位抹去
比如3<<1
二进制11左移后为110=6
对于无符号数
右移一位类似左移
最低位抹去
最高位补0
如3>>1

1
对于有符号数右移
当为正(最高位为0)
同无符号数右移相同
当为负
(最高位为1)
右移时最低位抹去
最高位补1

0x89二进制10001001
右移一位为11000100(二进制)

char ledmove[]={0x01,0x02,0x04,0x08};
void set_led(char p,char mode)
{
char ip;
ip = ledmove[p&0x03];
if((ip&0x01)==0) deng1 = 0;//管脚置o置1
else deng1 = 1;
if((ip&0x03)==0) deng2 = 0;
else deng2= 1;
if((ip&0x01)==0) deng3= 0;
else deng3 = 1;
if((ip&0x01)==0) deng4 = 0;
else deng4 = 1;
}
void main()
{
int i;
while(1)
{
for(i=0;i<4;i++)
{ if(anjian==0)//判断按键
setled(i);
else setled(3-i);
delay(1);//移动的速度
}
if(i>=4) i = 0;
}
}
应该是可以实现的吧,你去试试看


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10252517.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存