执行此程序时,指示灯闪烁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秒,然后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;
}
}
所以我想知道这种行为与我在本地和全局声明我的变量有什么关系。
答案 0 :(得分:1)
出于所有实际目的,这两个程序完全相同。您不会在本地与全局声明变量; count变量在两个程序中都是全局的。唯一的区别是count变量在第一个程序中被一条指令设置为零。但它已经为零,因为它是全局的,全局变量在加载时被初始化为零。如果你从第一个程序中省略count = 0语句,它们就会变得相同。
由于它们相同但显示不同的行为,因此问题必须出在mplab模拟器中。使用模拟器/ IDE的步骤功能检查检查功能中的计数值。
对您的问题的评论中的所有建议都会改进代码,但不需要:
mov ax, [count]
inc ax
mov [count], ax