这个流水灯居然不行?
时间:10-02
整理:3721RD
点击:
#include<reg52.h>
void delay(void)
{
unsigned int n;
for(n=0;n<60000;n++) ;
}
void main(void)
{
unsigned char i;
while(1)
{
P0=0xff;
delay();
for(i=0;i<8;i++)//设置循环次数为8
{
P0=P0>>1; //每次循环P0的各二进位右移1位,高位补0
delay(); //调用延时函数
}
}
}
程序来自论坛内《十天学会单片机实例100》的实例18 我只把P1口改为了P2口 试验时只有最高位那个灯闪烁 但是做软件仿真时 发现在第一个循环8次内 P0的值会发生一位变化 在第二次while循环内 P0赋为0xff,接着for循环一次 P0就变成0x00了,之后一直为0x00,直到重新进行下一个while循环
void delay(void)
{
unsigned int n;
for(n=0;n<60000;n++) ;
}
void main(void)
{
unsigned char i;
while(1)
{
P0=0xff;
delay();
for(i=0;i<8;i++)//设置循环次数为8
{
P0=P0>>1; //每次循环P0的各二进位右移1位,高位补0
delay(); //调用延时函数
}
}
}
程序来自论坛内《十天学会单片机实例100》的实例18 我只把P1口改为了P2口 试验时只有最高位那个灯闪烁 但是做软件仿真时 发现在第一个循环8次内 P0的值会发生一位变化 在第二次while循环内 P0赋为0xff,接着for循环一次 P0就变成0x00了,之后一直为0x00,直到重新进行下一个while循环

不要直接用P0移位,定义一个变量用移位后再赋给P0
没有吧 你确定? 我记得是可以的啊
嘿 还真是
我改成这个居然可以了 m=m>>1; P0=m; 但是我依稀记得可以直接赋的啊 我笔记上都这样记的
囧 我以前的程序都这样写了 P0>>=1 都是可以的 凌乱了...
难道是读端口之前要写高?
P0=_crol_(P0,1); /*循环左移
变量=_crol_(变量名,移动位数)
_cror_是循环右移,用法一样,都是是库函数*/
或者你用这个循环移位的函数试试
#include<intrins.h>中包含这些函数
我一般是用P0++ 自动循环,比楼上的好
这个跟MCU与开发环境有关系
不好意思 请你将具体一点
小编要继续加油啊。
那必须的 活到老学到老
呵呵呵呵呵
什么回事?
QQASDFGH
对的 我们的编译环境不一样 这个程序在我的实验板上就能达到和程序的一眼的效果 全灭到一个亮 两个亮三个亮...
也遇到过,偏要设置个变量=P口才可以,没搞懂为什么,能解决就行吧
正解,哈哈。貌似循环左移和右移是比较简单的。
