对于一个铁路模型项目,我试图使用产生x的随机数发生器(rand())来切换LED,然后在PIC16F15325的LATC寄存器上将x左移1。 (我是一个狂热的业余爱好者,但仍然有很多东西要学,完全是自学成才的。)我正在使用XC8和PICkit 3。
我正在使用16F15325图片,在我看来,以下代码应(A)生成一个介于0到5(这是x)之间的随机数(伪可以),以及(B)切换位C0到C5 (每个都连接到LATC寄存器中的LED)(通过将x移位1(即0到5))并将XOR应用于该引脚来实现。假设这是一个无限循环,那么每次代码循环时,它都应切换至少一个LED。这大约有90%的时间有效,但有时并不会导致切换,这让我发疯了。
#include <xc.h>
#include <stdint.h> /* For uint8_t definition */
#include <stdbool.h> /* For true/false definition */
#include "configs.c"
void main(void) {
InitProgram(); // THIS SETS UP THE TRIS AND SETS THE C PORT TO OUTPUT
// DECLARE AND SET VARIABLES
int x; // GENERAL PURPOSE VARIABLE TO USE ON THE FLY
LATC = 0b00111111;
while(1)
{
x = rand() % 6; // SHOULD GENERATE 0 THROUGH 5 B/C NO "+ 1"
LATC = LATC ^ 1 << x;
// I HAVE ALSO TRIED LATC = LATC ^ 1 << (char) x;
// THERE IS A ONE SECOND DELAY HERE
}
}
如前所述,这通常在循环中的每次运行中都有效,但是大约有10%的时间,没有LED会触发。在90%的时间内,其中一个LED会切换。
答案 0 :(得分:0)
根据OP的研究,问题出在XC8环境中。这是Rand()函数中的一个错误,具体取决于是否为C90或C99设置了环境(C99导致了此问题)。
描述该错误的Microchip网站链接位于: https://www.microchip.com/forums/m1077569.aspx [Rand()适用于C90 Standard,但不适用于当前项目中设置的C99 Standard]