单片机灯的移位问题?
kuaidi.ping-jia.net 作者:佚名 更新日期:2024-08-30
单片机C语言流水灯移位指令
这个很简单的程序,你要是想不出来
可以用KEIL仿真看看他们的数值变化,在想
不出来,咱们可以自己画啊,自己仔细写出每一步值的变话!
初值temp=0xfe;也就是二进制的1111 1110
a=temp>>i;然后 temp右移1位也就是 0111 1111
b=temp<<(8-i);第一次i=0哦,temp左移动7为,temp还是0xfe哦,
所以b为0000 0000
P0=a|b;0111 1111 或上0000 0000 你不要告诉不知道是多少?
是0111 1111 第一次循环就是P0.7亮。
这道算法的思想是要让P0亮的灯从P0.7向P0.0移动,一次只亮一个,
但是temp每右移一位最高位就要多出现一个0。
就是第一次 temp 移动后为 0111 1111 第二次为0011 1111 以此类推。
但是我每次只要亮另一个啊,所以b=temp<<(8-i); 第一次移动为0000 0000
第二次为1000 0000 以此类推。那P0=a|b第一次是不是=0111 1111|0000 000
=0111 1111,P0.7亮。第二次=1000 0000|0011 1111 =1011 1111 P0.6亮。
这样讲你懂了么?
a=temp>>i;
b=temp<<(8-i);
P0=a|b;
是将temp中的值右移i位后送给a;是将temp中的值左移8-i位后送给b,然后a、b相或后输出到P0口。楼主需要明白,这里移位靠的是temp的初值在计数器i的控制下移位,而a、b仅仅是中间变量,这段程序甚至可以直接写成:
P0 = (temp>>i) | (temp<<(8-i));
根本不需要a、b这两个中间变量。
for(i=1;i<8;i++)
循环,每次移动8次
b=temp《《(8-i)
把TEMP 向左移动(8-I)个位,移动完了放在b中
单片机流水灯 左右循环位移程序问题,哪里有错误?
答:void main(){ //……初始化 while(1) { if(num >= 20) { num = 0;a++;if (a <= 7) b = _crol_(b, 1);else if (a < 14) b = _cror_(b, 1);else a = 0;P1 = b;} } } 试试看。
单片机点亮一个灯泡时,为什么要进行左移一个单位呢,这里有点不懂还望...
答:这个是为了让时间长一点,单片机运行速度还是比较快的。你看只有led8_one的最高位是1,才点亮灯。其他的时间是关闭灯的。每次移位就是为了让led8_one的那个1向最高位动一次。
灯光移位控制程序(单片机程序)
答:8031单片机是该系统的核心部件,其主要功能:(1)灯光控制的软件编程;(2)干扰信号的处理及复位;(3)光强及时间定时的检测及控制。单片机的控制程序通过对光强或时间的检测,自动开启(夜间)或关闭(白天)灯光系统,每1路灯光设备与8031内存控制位相对应,单片机通过P3.0(RXD)和P3.1(TXD)多功能...
求大神帮忙,单片机C语言问题,用一个开关控制单一灯的左移右移,开关按...
答: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; } } } } ...
单片机汇编语言用外部中断0控制流水灯的移位方向,一开始灯向左移动第...
答:用外部中断引脚做按键检测脚, 假设上升沿产生中断 ,开机时初始化标志变量等于0, 当第一次按下时 置标志(随便设置一个变量)为1,第二次按下时,置标志为0, 第三次按下时标志又为1 ,第四次按下时标志为0...以此类推。在while(1) 里 检测变量等于0,灯左移,等于1灯右移 ...
单片机流水灯用循环左右移动出现问题,仿真时候看不出来是正向移动还是...
答:P1 = _cror_(temp, 1);应为:temp = _cror_(temp, 1);
单片机C语言流水灯移位指令
答:void main(void){ unsigned char circledata=0x01,i=0;while(1){ for(i=0;i<4;i++) //显示范围 P_LED.0:P_LED3 { P_LED=circledata<=0;i--) //显示范围 P_LED.3:P_LED.0 { P_LED=circledata<
关于单片机流水灯0x7e的控制问题
答:>>是移位操作,在被操作数是无符号数时,每移动一位,最高位就会被置零,所以当移动8次以后,temp就等于零了,然后是temp再次赋值0x7e,依次循环。如果你想实现的是带进位的循环,可以自己写一个函数,也可以使用库函数_cror_(x,i)(右移)或者_crol_(x,i)(左移),但是如果使用这两个库函数...
急!!51单片机P3。3口输入,P1。1口输出,将灯左移问题
答:下面对你的程序做了简单修改,默认是高电平输出点亮你的led,如果你的p1输出的是低电平点亮的话,只需要将第二行的赋值语句改为:MOV A,#0feH就可以了,呵呵,你自己对比一下吧。如果我写的不对或者有疑问可以给我留言 http://hi.baidu.com/xiaozhishmily 呵呵。ORG 0810H J100: MOV A,#...
关于单片机流水灯的问题,求高手求解
答:如果是的话,在开始,P1已经设置成0xfe了,也就是最低位的灯是亮着的,设想一下,要是没有P1|0X01,那么,在第一次左移之后,P1=1111 1100 ,因为P1<<=1之后最低位变成0,而不是1,所以要P1|0X01。在第二次移位之后,P1=1111 1010,此时也要|0x01,则P1=1111 1011。依次循环。当右移的...
//没有编译过,大概思路就这样
#define P_LED P1; //定义到你自己的端口
void main(void)
{
unsigned char circledata=0x01,i=0;
while(1)
{
for(i=0;i<4;i++) //显示范围 P_LED.0:P_LED3
{
P_LED=circledata<<i;
Delay_ms(1000);//根据自己的晶振写延时1S的函数
}
circledata=0xfe;
for(i=3;i>=0;i--) //显示范围 P_LED.3:P_LED.0
{
P_LED=circledata<<i;
Delay_ms(1000);//根据自己的晶振写延时1S的函数
}
}
return;
}
for(i=0;i<8;i++)
{
delay(200)----这里少了分号。
P1<<=1;
P1|=0x01;
}
这个很简单的程序,你要是想不出来
可以用KEIL仿真看看他们的数值变化,在想
不出来,咱们可以自己画啊,自己仔细写出每一步值的变话!
初值temp=0xfe;也就是二进制的1111 1110
a=temp>>i;然后 temp右移1位也就是 0111 1111
b=temp<<(8-i);第一次i=0哦,temp左移动7为,temp还是0xfe哦,
所以b为0000 0000
P0=a|b;0111 1111 或上0000 0000 你不要告诉不知道是多少?
是0111 1111 第一次循环就是P0.7亮。
这道算法的思想是要让P0亮的灯从P0.7向P0.0移动,一次只亮一个,
但是temp每右移一位最高位就要多出现一个0。
就是第一次 temp 移动后为 0111 1111 第二次为0011 1111 以此类推。
但是我每次只要亮另一个啊,所以b=temp<<(8-i); 第一次移动为0000 0000
第二次为1000 0000 以此类推。那P0=a|b第一次是不是=0111 1111|0000 000
=0111 1111,P0.7亮。第二次=1000 0000|0011 1111 =1011 1111 P0.6亮。
这样讲你懂了么?
a=temp>>i;
b=temp<<(8-i);
P0=a|b;
是将temp中的值右移i位后送给a;是将temp中的值左移8-i位后送给b,然后a、b相或后输出到P0口。楼主需要明白,这里移位靠的是temp的初值在计数器i的控制下移位,而a、b仅仅是中间变量,这段程序甚至可以直接写成:
P0 = (temp>>i) | (temp<<(8-i));
根本不需要a、b这两个中间变量。
for(i=1;i<8;i++)
循环,每次移动8次
b=temp《《(8-i)
把TEMP 向左移动(8-I)个位,移动完了放在b中
答:void main(){ //……初始化 while(1) { if(num >= 20) { num = 0;a++;if (a <= 7) b = _crol_(b, 1);else if (a < 14) b = _cror_(b, 1);else a = 0;P1 = b;} } } 试试看。
答:这个是为了让时间长一点,单片机运行速度还是比较快的。你看只有led8_one的最高位是1,才点亮灯。其他的时间是关闭灯的。每次移位就是为了让led8_one的那个1向最高位动一次。
答:8031单片机是该系统的核心部件,其主要功能:(1)灯光控制的软件编程;(2)干扰信号的处理及复位;(3)光强及时间定时的检测及控制。单片机的控制程序通过对光强或时间的检测,自动开启(夜间)或关闭(白天)灯光系统,每1路灯光设备与8031内存控制位相对应,单片机通过P3.0(RXD)和P3.1(TXD)多功能...
答: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; } } } } ...
答:用外部中断引脚做按键检测脚, 假设上升沿产生中断 ,开机时初始化标志变量等于0, 当第一次按下时 置标志(随便设置一个变量)为1,第二次按下时,置标志为0, 第三次按下时标志又为1 ,第四次按下时标志为0...以此类推。在while(1) 里 检测变量等于0,灯左移,等于1灯右移 ...
答:P1 = _cror_(temp, 1);应为:temp = _cror_(temp, 1);
答:void main(void){ unsigned char circledata=0x01,i=0;while(1){ for(i=0;i<4;i++) //显示范围 P_LED.0:P_LED3 { P_LED=circledata<=0;i--) //显示范围 P_LED.3:P_LED.0 { P_LED=circledata<
答:>>是移位操作,在被操作数是无符号数时,每移动一位,最高位就会被置零,所以当移动8次以后,temp就等于零了,然后是temp再次赋值0x7e,依次循环。如果你想实现的是带进位的循环,可以自己写一个函数,也可以使用库函数_cror_(x,i)(右移)或者_crol_(x,i)(左移),但是如果使用这两个库函数...
答:下面对你的程序做了简单修改,默认是高电平输出点亮你的led,如果你的p1输出的是低电平点亮的话,只需要将第二行的赋值语句改为:MOV A,#0feH就可以了,呵呵,你自己对比一下吧。如果我写的不对或者有疑问可以给我留言 http://hi.baidu.com/xiaozhishmily 呵呵。ORG 0810H J100: MOV A,#...
答:如果是的话,在开始,P1已经设置成0xfe了,也就是最低位的灯是亮着的,设想一下,要是没有P1|0X01,那么,在第一次左移之后,P1=1111 1100 ,因为P1<<=1之后最低位变成0,而不是1,所以要P1|0X01。在第二次移位之后,P1=1111 1010,此时也要|0x01,则P1=1111 1011。依次循环。当右移的...