本帖最后由 大明狐 于 2024-1-12 09:55 编辑
////////////////////////////////////////////////////////////////
//// 现象1
////////////////////////////////////////////////////////////////
最近在STC8H8K64U上用OLED做小动画的时候,用到了随机数,让画面里的雪花和猫头在随机的位置出现。
程序调用的是 stdlib.h 里的 rand() 函数,而且并没有配置随机数种子。
结果突然发现,每次给单片机重新上电,雪花和猫头并没有在相同的地方出现,而是每次都不一样。
然后单独写了一个随机数显示程序试了一下
while( i < 8 )
{
RandomNum = rand() % 100;
OLED_ShowNum( i % 2 * 64 , i / 2 * 2, RandomNum, 5, 16);
i ++;
}
结果同样也是每次生成的数列都不一样。
这跟印象里的随机函数的用法有很大不同。
同样的程序,再在STC8A、STC32G、STC32F上试了下,同样也是真随机的。
////////////////////////////////////////////////////////////////
//// 现象2
////////////////////////////////////////////////////////////////
然后发现,随机数真随机的这四个单片机,用的都是在官方提供的带USB-HID自动下载功能的程序模板的基础上写的程序。
另外还配置了硬件I2C和硬件SPI。
1、
于是尝试把硬件I2C和硬件SPI改回模拟I2C和模拟SPI,
结果 -> 产生的随机数依旧随机
2、
继续尝试把模板里的
stc32_stc8_usb.h 去掉
P_SW2 = 0x80; 删掉
usb_init 和 EA = 1 也都删掉
结果 -> 产生的随机数依旧随机
3、
新建一个空白工程,运行随机数函数
结果 -> 产生的随机数不随机了
////////////////////////////////////////////////////////////////
//// 疑问
////////////////////////////////////////////////////////////////
所以可以确定是某一个功能,导致了随机函数生成的随机数真的变随机了。
但是查资料却找不到具体是那个功能产生的这个效果。
比如可以通过配置哪个寄存器,或者执行哪条命令,可以开启这个真随机数的功能。
以下是能产生随机数的程序源码
20240109_1OLED8H_USB下载_硬件IIC_随机数有效.rar
(62.27 KB, 下载次数: 124)
好奇的闹心好几天了,特来求教。

|