c++ - 尝试使用XOR和移位运算符切换随机LED

标签 c++ random embedded xc8

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

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

  • (A)生成一个介于0到5(这是x)之间的随机数(伪可以),
  • (B)通过将x移位1(即0到5)并将XOR应用于该引脚来切换位C0至C5(每个均连接到LATC寄存器中的LED)。

  • 假设这是一个无限循环,那么每次代码循环时,它都应切换至少一个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环境中。根据环境是针对C90还是C99设置的,这是Rand()函数中的错误(C99导致了此问题)。

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

    关于c++ - 尝试使用XOR和移位运算符切换随机LED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56351855/

    相关文章:

    ruby - 如何在 Ruby 中获取具有给定离散分布的随机数

    java - 在android中使用串口RS-232?

    无法识别 Windows Embedded XP tskill 和 taskkill

    c++ - 如何在给定间隔内更改数组的值

    c++ - 无法引用库项目 (DLL),因为缺少 .lib 文件

    c++ - 声明一个 const 变量作为引用

    linux - 如何从文件中选择随机行

    php - 如何在PHP中随机组合两个数组

    c - 使用函数指针移植通用 C 驱动程序

    c++ - 在 Qt 的 emit() 中传递指向自身的指针