尝试使用异或和位移运算符切换随机 LED
Trying to toggle random LEDs with a XOR and bit shift operator
对于一个模型铁路项目,我正在尝试使用随机数生成器(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 标准]
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 尝试使用异或和位移运算符切换随机 LED