打印

关于delay()函数的问题

[复制链接]
5724|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个时钟周期.

只能是常数,因为编译器会重新编译为汇编代码

使用特权

评论回复
5
whywhy89713|  楼主 | 2012-7-21 17:36 | 只看该作者
还有一个很有意思的问题是,我定义的两个数组,前边必须加const限定,如果不加的话数码管也无**常显示,希望大侠们具体讲讲其中的原理

使用特权

评论回复
6
益友电子| | 2012-7-21 18:04 | 只看该作者
可以使用定时器来实现延时!

使用特权

评论回复
7
永远的不知| | 2012-7-26 16:53 | 只看该作者
5# whywhy89713
你把iar的优化等级设到最低试试。

使用特权

评论回复
8
vivilzb1985| | 2012-7-26 18:00 | 只看该作者
问下四楼的大虾,MCLK不同时,#define delay_us(x)  定义出来的如delay_us(1)也是一样的??

使用特权

评论回复
9
whywhy89713|  楼主 | 2012-7-27 10:18 | 只看该作者
8# vivilzb1985
一样的,但是需要将首句中
#define CPU_F                               ((double)8000000)
的8000000修改成你当前MSP430 CPU的主频频率,即CPU的MCLK

使用特权

评论回复
10
whywhy89713|  楼主 | 2012-7-27 10:19 | 只看该作者
一样的,但是需要将首句中
#define CPU_F                               ((double)8000000)
的8000000修改成你当前MSP430 CPU的主频频率,即CPU的MCLK

使用特权

评论回复
11
阿尔法99| | 2012-7-27 16:04 | 只看该作者
是编译器优化导致的。在变量前加volatile修饰符即可搞定。

使用特权

评论回复
12
peter_zheng| | 2012-8-12 12:10 | 只看该作者
需要把编译器的优化条件改变一下,或者在变量加上volatile不需要被优化

使用特权

评论回复
13
hawksabre| | 2012-8-31 18:52 | 只看该作者
iar版本高了会将他认为无用的代码优化掉   建议将版本降低   同时在会被优化的代码前面加上volatile   希望帮到你

使用特权

评论回复
14
hawksabre| | 2012-8-31 18:55 | 只看该作者
稍微补充一下   
volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.   简单地说就是防止编译器对代码进行优化.    volatile应该解释为“直接存取原始内存地址”比较合适

使用特权

评论回复
15
happy啦啦啦| | 2012-9-14 20:01 | 只看该作者
程序进入延迟函数没有出来

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

52

帖子

0

粉丝