当我执行这个程序时,LED闪烁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;
}
}
但是当我执行这个程序时,发生了两件事:
如果我在执行完前一个程序后立即执行此程序,LED 会闪烁 1 秒,然后熄灭 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; } }
所以我想知道这种行为与我在本地和全局声明变量有什么关系。
最佳答案
就所有实际目的而言,这两个程序是完全等效的。您无需在本地声明变量,也无需在全局声明变量; count 变量在两个程序中都是全局变量。唯一的区别是计数变量在第一个程序中由指令设置为零。但它已经为零,因为它是全局的,并且全局变量在加载时初始化为零。如果您从第一个程序中省略 count = 0 语句,它们就会变得相同。
由于它们相同但表现出不同的行为,因此问题一定出在 mplab 仿真器中。使用模拟器/IDE的step功能来检查check函数中count的值。
问题评论中的所有建议都可以改进代码,但都不是必需的:
- 没有类型的参数默认为 int。所以count参数是一个int;
- return 语句将确保返回正确的值,但携带函数返回值的寄存器显然仍然保存计数的递增值,在英特尔汇编器中,这是 ax 寄存器:
mov ax, [计数]
斧头
mov [计数], ax
关于c - 使用 MPLAB 在 C 中声明全局变量和局部变量有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28397513/