使用MPLAB在C中声明全局变量和局部变量有什么区别?

时间:2015-02-08 18:12:49

标签: c mplab

执行此程序时,指示灯闪烁1秒,然后闪烁2秒,然后循环:

#include <htc.h>
#include <pic16f877.h>

#define _XTAL_FREQ 4e6

int count;
int check(int count);

void main(void){
    count = 0;
    TRISD = 0xBF;
    count=check(count);
    count=check(count);
}

int check(count){
    if(count == 0){
        /* blink an led for 1s */
        ++count;
    }else if(count == 1){
        /* blink an led for 2s */
        ++count;
    }
}

但是当我执行这个程序时,会发生两件事:

  1. 如果我在执行完前一个程序后立即执行此程序,则指示灯闪烁1秒,然后2秒闪烁。

  2. 如果我在任何其他时间执行此程序,一旦它不在前一个程序之后,则led保持关闭;甚至不会眨眼。

    #include <htc.h>
    #include <pic16f877.h>
    
    #define _XTAL_FREQ 4e6
    
    int check(int count);
    int count = 0;
    
    void main(void){
        TRISD = 0xBF;
        count=check(count);
        count=check(count);
    }
    
    int check(count){
        if(count == 0){
            /* blink an led for 1s */
            ++count;
        }else if(count == 1){
            /* blink an led for 2s */
            ++count;
        }
    }
    
  3. 所以我想知道这种行为与我在本地和全局声明我的变量有什么关系。

1 个答案:

答案 0 :(得分:1)

出于所有实际目的,这两个程序完全相同。您不会在本地与全局声明变量; count变量在两个程序中都是全局的。唯一的区别是count变量在第一个程序中被一条指令设置为零。但它已经为零,因为它是全局的,全局变量在加载时被初始化为零。如果你从第一个程序中省略count = 0语句,它们就会变得相同。

由于它们相同但显示不同的行为,因此问题必须出在mplab模拟器中。使用模拟器/ IDE的步骤功能检查检查功能中的计数值。

对您的问题的评论中的所有建议都会改进代码,但不需要:

  • 没有类型的参数是defaut的int。所以count参数是一个int;
  • 一个return语句将确保返回正确的值,但是函数返回值所在的寄存器显然仍然保持count的递增值,在Intel汇编程序中这是ax寄存器:

mov ax, [count] inc ax mov [count], ax