[求助] 菜鸟求助啦!

wuyanyanke   2011-12-9 14:31 楼主
朋友们!这段Code有问题吗?
板子F5438
想让LED1闪呀闪呀闪!

#include
void main(void)
{
  unsigned char i;
  WDTCTL = WDTPW + WDTHOLD;                     //关看门狗
P1DIR |= BIT0;

  while(1)
  {
    i = 50000;
     
     while(i--);
    P1OUT ^= BIT0;
   
  }
}

症状:
i改成5单步调试正常,
现在直接全速就一直处于亮的状态!求真像!

回复评论 (10)

延时够不够
点赞  2011-12-9 14:41
i 怎么是unsigned  char  =>unsigned int
点赞  2011-12-9 14:42
变量i定义的是unsigned char型,8位(<=255),所以延时太,到不了50000
点赞  2011-12-9 14:56
谢谢各位不吝指教:

我以前试过unsigned int和把延时改成200一类的!症状一样也是一直处于亮的状态!

再附上一个问题哈!
适时时间是怎么计算的?比如说我现在想延时一小时,应该怎么做?想延时23小时59分钟呢!?

求高手指教!
点赞  2011-12-9 16:15
引用: 原帖由 wuyanyanke 于 2011-12-9 16:15 发表
谢谢各位不吝指教:

我以前试过unsigned int和把延时改成200一类的!症状一样也是一直处于亮的状态!

再附上一个问题哈!
适时时间是怎么计算的?比如说我现在想延时一小时,应该怎么做?想延时23小时59分钟呢 ...

延时时间太短就看清闪烁,这就是视觉暂留效果。
如果做延时1小时或者更久的话,最好用定时器做较为精确的延时,或者像23小时59分钟你就直接用时钟芯片好了
点赞  2011-12-9 17:12
引用: 原帖由 wstt 于 2011-12-9 17:12 发表 延时时间太短就看清闪烁,这就是视觉暂留效果。 如果做延时1小时或者更久的话,最好用定时器做较为精确的延时,或者像23小时59分钟你就直接用时钟芯片好了


void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                     //关看门狗
 
  while(1)
  {
    P1DIR |= BIT0;
    for(int i=5000;i>0;i--);
    for(int i=5000;i>0;i--);
    P1OUT ^= BIT0;  
  }
}

搞定!
谢谢大家!

wstt 兄,你的意思“23小时59分钟你就直接用时钟芯片好了”是要另加芯片吗?还是使用430现有的?!

点赞  2011-12-9 18:03
加个volatile
变成volatile unsigned char i;
点赞  2011-12-9 20:27

引用: 原帖由 鸵鸟蝈蝈 于 2011-12-9 20:27 发表 加个volatile 变成volatile unsigned char i;

 

加个volatile是啥意思????

http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2011-12-9 21:16
引用: 原帖由 ddllxxrr 于 2011-12-9 21:16 发表

 
加个volatile是啥意思????

不知道楼主的闪呀闪呀,是什么意思。
我是觉得有可能编译器将while(i--);优化了。。。
所以让他加个volatile试试,因为之前我遇到过类似的情况。
加volatile就是不让编译器去优化。
to楼主:要注意数据的位数,char是8位,改为unsigned int。
另外MCLK大概位1M左右。如果是i=50000,那么一秒钟也能闪个20次,肉眼可以识别。
点赞  2011-12-10 09:46

回复 10楼 鸵鸟蝈蝈 的帖子

谢谢鸵鸟蝈蝈兄!
刚拿到板子,什么都没看,想做个简单的让LED过几秒亮再过几秒灭!所以就是闪呀闪!哈哈哈!
unsigned char i;确实是一个很白的计数类型,谢谢指教!
点赞  2011-12-12 12:59
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复