关于delay()函数的问题

[复制链接]
6464|15
 楼主| whywhy89713 发表于 2012-7-20 20:01 | 显示全部楼层 |阅读模式
#include <msp430x14x.h>
#define Duan P6OUT            //段选
#define Wei P4OUT            //位选
const unsigned char SMG[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
const unsigned char BIT[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
void delay(volatile unsigned int);
int main()
{
  unsigned int j;
  WDTCTL = WDTPW + WDTHOLD;// Stop watchdog timer to prevent time out reset
  //端口初始化
  P6DIR=0xff; //P6为输出模式
  P4DIR=0xff;//P4做为输出端口
  P6OUT=0x00;
  P4OUT=0xff;
while(1)   
{     
       for(j=0;j<8;j++)
              {
                P6OUT=SMG[j];
                P4OUT=BIT[j];
                delay(200);
              }
           
         
      
  }   
}
void delay(volatile unsigned int k)
{
  unsigned int i,m;
  for(i=0;i<k;i++)
  {  for(m=0;m<25;m++)
      {;}
  }
}


现在的问题是只要有delay函数程序就无法继续运行了,比如现在把delay放在了for函数里边数码管就只显示0,如果放在for函数外边就只显示7了;我试过用for直接做延时可以完美显示,主要就是搞不懂delay的作用机理,按理说都是一样的啊为什么就不行呢?
望大虾们指教!
figo20042005 发表于 2012-7-20 20:54 | 显示全部楼层
这个就很难解释了
tianm 发表于 2012-7-21 09:02 | 显示全部楼层
两种方法的延时长短一样吗?
 楼主| whywhy89713 发表于 2012-7-21 17:33 | 显示全部楼层
作用时间都是一样的
目前我的解决办法就是直接调用IAR内部延时函数
IAR 软件430的编译器里面我们可以利用它内部的延时子程序来实现我们想要的高精度软件延时,方法如下:

(1):将以下这段代码复制到你的.C源文件中。

#define CPU_F                               ((double)8000000)
#define delay_us(x)                       __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x)                      __delay_cycles((long)(CPU_F*(double)x/1000.0))
(2):修改

在 #define CPU_F              ((double)8000000) 语句里 8000000 修改成你当前MSP430 CPU的主频频率,即CPU的MCLK。

单位为HZ。本例中的8000000为MCLK=8MHZ 的意思。

(3):使用范例

delay_us(1);        //1 微秒的延时

delay_ms(1);       //1 毫秒的延时

delay_us(3.5);     //延时3.5微秒

delay_ms(3.5);    //延时3.5毫秒

delay_ms(1000); //延时1秒

直接调用,如:__delay_cycles(100),就延时100个时钟周期.

只能是常数,因为编译器会重新编译为汇编代码
 楼主| whywhy89713 发表于 2012-7-21 17:36 | 显示全部楼层
还有一个很有意思的问题是,我定义的两个数组,前边必须加const限定,如果不加的话数码管也无**常显示,希望大侠们具体讲讲其中的原理
益友电子 发表于 2012-7-21 18:04 | 显示全部楼层
可以使用定时器来实现延时!
永远的不知 发表于 2012-7-26 16:53 | 显示全部楼层
5# whywhy89713
你把iar的优化等级设到最低试试。
vivilzb1985 发表于 2012-7-26 18:00 | 显示全部楼层
问下四楼的大虾,MCLK不同时,#define delay_us(x)  定义出来的如delay_us(1)也是一样的??
 楼主| whywhy89713 发表于 2012-7-27 10:18 | 显示全部楼层
8# vivilzb1985
一样的,但是需要将首句中
#define CPU_F                               ((double)8000000)
的8000000修改成你当前MSP430 CPU的主频频率,即CPU的MCLK
 楼主| whywhy89713 发表于 2012-7-27 10:19 | 显示全部楼层
一样的,但是需要将首句中
#define CPU_F                               ((double)8000000)
的8000000修改成你当前MSP430 CPU的主频频率,即CPU的MCLK
阿尔法99 发表于 2012-7-27 16:04 | 显示全部楼层
是编译器优化导致的。在变量前加volatile修饰符即可搞定。
peter_zheng 发表于 2012-8-12 12:10 | 显示全部楼层
需要把编译器的优化条件改变一下,或者在变量加上volatile不需要被优化
hawksabre 发表于 2012-8-31 18:52 | 显示全部楼层
iar版本高了会将他认为无用的代码优化掉   建议将版本降低   同时在会被优化的代码前面加上volatile   希望帮到你
hawksabre 发表于 2012-8-31 18:55 | 显示全部楼层
稍微补充一下   
volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.   简单地说就是防止编译器对代码进行优化.    volatile应该解释为“直接存取原始内存地址”比较合适
happy啦啦啦 发表于 2012-9-14 20:01 | 显示全部楼层
程序进入延迟函数没有出来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

52

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部