尝试使用异或和位移运算符切换随机 LED



对于一个模型铁路项目,我正在尝试使用随机数生成器(rand())来切换LED,该生成器产生x,然后在PIC16F15325上的LATC寄存器上将1向左移动x。 (我是一个热情的业余爱好者,但仍然有很多东西要学,完全是自学成才。 我正在使用XC8和PICkit 3。

我正在使用 16F15325 图片,在我看来,以下代码应该

(
  • A)生成一个介于0和5之间的随机数(伪是可以的)(这是x),并且
  • (B) 切换位 C0 到 C5(每个位连接到 LATC 寄存器中的一个 LED),方法是将 1 位移位 x 位(即 0 到 5),并将异或施加到该引脚。

假设这是在无限循环中,那么每次代码循环时,它应该至少切换一个 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 会切换。

根据OP的研究,问题出在XC8环境中。这是 Rand() 函数中的一个错误,基于环境是为 C90 还是 C99 设置的(C99 导致了这个问题)。

描述该错误的Microchip网站链接在这里: https://www.microchip.com/forums/m1077569.aspx[Rand() 适用于当前项目中设置的 C90 标准,但不适用于 C99 标准]

最新更新