5628|18

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

LED左右循环程序 [复制链接]

各位大侠帮忙!小弟才疏学浅,一个LED从左循环到右边,再从右循环到左!!一直走不停!!
问题是现在程序左右一并走了,没有达到理想的效果!!各位师傅指点指点!!

#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar temp;
uint temp1;
void delay();
void main()
{
                temp=0xfe;
                temp1=0x7f;
while(1)
        {
                P0=temp;
                temp=_crol_(temp,1);
                delay();
                P0=temp1;
                temp1=_cror_(temp1,1);
                delay();
                P0=temp;
        }
}
void delay()
{
        uint x,y;
                for(x=50;x>0;x--)
                        for(y=100;y>0;y--);
}

最新回复

lz的程序写的不错  详情 回复 发表于 2010-6-29 20:43
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
楼主,用我的程序吧。 随便你想怎么走 都可以,流水灯,左-右,右-左,无限走,呵呵

  1. #include"reg51.h"
  2. #include"51usb.h"                   //51USB实验板的头文件

  3. #define  uchar unsigned char
  4. #define  uint  unsigned int

  5. void delay(uint ticks);// 延时程序的声明

  6. void Left(void);                //向左移动
  7. void Right(void);                //向右移动
  8. void Left_A(void);                //向左移动增亮
  9. void Right_A(void);                //向左动减灭
  10. void Left_B(void);                //向右移动增亮
  11. void Right_B(void);                //向右动减灭

  12. void main()
  13. {
  14. P1=0x0C;//选通LED,74HC138的Y6=0;请看原理图
  15. while(1)
  16. {
  17.   Left();
  18.   Right();
  19.   Left_A();
  20.   Right_A();
  21.   Left_B();
  22.   Right_B();
  23. }
  24. }
  25. //////////// 延时程序的实现////////////////////
  26. void delay(uint ticks)
  27. {
  28. uchar i;
  29. for(;ticks!=0;ticks--)
  30.         for(i=1000;i!=0;i--);
  31. }

  32. void Left()
  33. {
  34. unsigned char i,temp;
  35. temp=0xfe;                                
  36. LED=0xff;                                //灭所有LED
  37. delay(100);                        //延时
  38. for(i=8;i!=0;i--)
  39. {
  40.    LED=temp;                        //输出LED数据
  41.    temp<<=1;                        //LED数据左移动一位
  42.    temp++;                                //加一,为了熄灭最后一位LED
  43.    delay(100);                          //延时
  44. }

  45. }

  46. void Right()
  47. {
  48. unsigned char i,temp;
  49. temp=0x7f;
  50. LED=0xff;                                  //灭所有LED
  51. delay(100);
  52. for(i=8;i!=0;i--)
  53. {
  54.    LED=temp;                         //输出LED数据
  55.    temp>>=1;                         //LED数据右移动一位
  56.    temp|=0x80;
  57.    delay(100);          
  58. }

  59. }

  60. void Left_A(void)
  61. {
  62. unsigned char i,temp;
  63. temp=0xff;
  64. LED=0xff;                                  //灭所有LED
  65. delay(100);
  66. for(i=8;i!=0;i--)
  67. {
  68.    temp<<=1;                          //LED数据左移动一位
  69.    LED=temp;                          //输出LED数据
  70.    delay(100);          
  71. }
  72. }

  73. void Right_A(void)
  74. {
  75. unsigned char i,temp;
  76. temp=0;
  77. LED=0;                                           //亮所有
  78. delay(100);
  79. for(i=8;i!=0;i--)
  80. {
  81.    temp<<=1;                           //LED数据左移动一位
  82.    temp++;                                   //加一,为了熄灭最后一位LED
  83.    LED=temp;                           //输出LED数据
  84.    delay(100);          
  85. }
  86. }

  87. void Left_B(void)
  88. {
  89. unsigned char i,temp;
  90. temp=0xff;
  91. LED=0xff;                                   //灭所有LED
  92. delay(100);
  93. for(i=8;i!=0;i--)
  94. {
  95.    temp>>=1;                           //LED数据右移动一位
  96.    LED=temp;                           //输出LED数据
  97.    delay(100);          
  98. }
  99. }

  100. void Right_B(void)
  101. {
  102. unsigned char i,temp;
  103. temp=0xFF;
  104. LED=0;                                           //亮所有LED
  105. delay(100);
  106. for(i=8;i!=0;i--)
  107. {
  108.    temp>>=1;                           //LED数据右移动一位
  109.    temp|=0x80;                           //最高位置一,为了熄灭最高一位LED
  110.    LED=temp;                           //输出LED数据
  111.    delay(100);          
  112. }
  113. }
复制代码
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
谢谢啦!!!
不过C语言里不是有_crol_和_cror_ 循环命令吗!!我就是想搞明白这两个是如何实现的!!而且用他代码较简单!
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

4
 
你的代码:
  1. P0=temp;
  2. temp=_crol_(temp,1);
  3. delay();
  4. P0=temp1;
  5. temp1=_cror_(temp1,1);
  6. delay();
复制代码


赋值2次,肯定是一并走到中间
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
看看这个 :
http://blog.sina.com.cn/s/blog_521471a501009n2v.html
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
你需要做的是从左移到右,需要一个判断,然后调用另外一个函数,让它从右移到左。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
_crol_  字符循环左移
_cror_ 字符循环右移

楼主 你这样的用功能 用查表最方便了,呵呵

void main()
{ int i=0;


while(1)
{   
  temp=0xfe;
for(i=0;i<8;i++)
{
  P0=temp;
  temp=_crol_(temp,1);
  delay();
}

for(i=0;i<8;i++)
{
  P0=temp;
  temp=_cror_(temp,1);
  delay();
}

}
}
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

8
 
P0=temp;
temp=_crol_(temp,1);  //这儿temp值只左移了一位,只执行了一次
delay();
P0=temp1;             //这又立即换成右移的值了,所以你只会看到两边灯向中间移
temp1=_cror_(temp1,1);
delay();
P0=temp;
这样解决吧,可能你容易理解
uint i;
temp=0xfe;
temp1=0x7f;
while(1)
{
P0=temp;
for(i=0;i++;i<8)
{
  temp=_crol_(temp,1);
  delay();             //用FOR,让其循环8次
  }
P0=temp1;
  for(i=0;i++;i<8)
  {
   temp1=_cror_(temp1,1);
   delay();
   }  
}
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 
MARK
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

10
 
while(1)
{
P0=temp;
temp=_crol_(temp,1);
delay();
P0=temp1;
temp1=_cror_(temp1,1);
delay();
P0=temp;
}
我觉得是你delay()里面没有写延时的时间。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

11
 
有时C语言,都忘了。。。。。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

12
 
mark,我一般用左移右移运算符 ,混合编程方便的话,直接用汇编带进位移动
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

13
 
直接模拟“循环队列”
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

14
 
挖坟、不结贴、以及明明解决问题还不满意结贴的行为
都要受到鄙视!!
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

15
 
分析的很好,你要循环一次再循环下一次,要用循环。你的程序稍微更改一下就很好。这样改一下。

#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar temp;
uint temp1;
uchar i;
void delay();
void main()
{
temp=0xfe;
temp1=0x7f;
while(1)
{

for(i=0;i<8;i++)
{
P0=temp;
temp=_crol_(temp,1);
delay();
}
for(i=0;i<8;i++)
{
P0=temp1;
temp1=_cror_(temp1,1);
delay();
P0=temp;
}
}
}  
void delay()
{
uint x,y;
for(x=50;x>0;x--)
for(y=100;y>0;y--);
}


 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

16
 
  一楼的代码不错~~我做实验就用的和一楼差不多的代码~~~
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

17
 
如果用for语句,建议移位的时候用<<和>>,因为用_crol_和_cror_虽然写的时候简单,但是调试的时候看汇编指令就知道比<<  >>复杂的多了。建议改为
void main()
{

while(1)
{
temp=0xfe;
temp1=0x7f;

for(i=0;i<8;i++)
{
P0=temp;
temp=_crol_(temp,1);
delay();
}
for(i=0;i<8;i++)
{
P0=temp1;
temp1=_cror_(temp1,1);
delay();
P0=temp;
}
}
}   
其实就是上面的程序把temp和temp1的赋值拿到while循环中来而已
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

18
 
#include
unsigned char i;
unsigned char temp;
unsigned char a,b;

void delay(void)
{
unsigned char m,n,s;
for(m=20;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
void main(void)
{
while(1)
{
temp=0xfe;
P1=temp;
delay();
for(i=1;i<8;i++)
{
a=temp< b=temp>>(8-i);
P1=a|b;
delay();
}
for(i=1;i<8;i++)
{
a=temp>>i;
b=temp<<(8-i);
P1=a|b;
delay();
}
}
}
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

19
 
lz的程序写的不错
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表