最开始本来是想着让 i 循环 10000 次,然后通过
dp[i % 10]
dp[i / 10 % 10]
dp[i / 100 % 10]
dp[i / 1000 % 10]
来取到每位数码管上的要展示的数字,但是写完代码发现数码管上的数字变化的特变快,然后就想着在最后加一个delay(500)进行延迟但结果是四位数字一起闪烁(就像快速的眨眼睛)。消影的延迟又不能动于是就想到了让i扩大同时扩大取每位数的方式使得循环总次数增加,经过不断调试找到了比较好的实现方式
代码如下:
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
//定义0-9的16进制
uchar code dp[10] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
// 延迟函数
void delay(uchar ms) {
uchar i, j;
for (i = 0; i < ms; ++i) {
for (j = 0; j < 120; ++j);
}
}
void main() {
uint i = 0;
while(1){
P1 = 0xfe;
P2 = dp[i / 20 % 10];
delay(5);
P1= 0xff;
P1 = 0xfd;
P2 = dp[(i / 200) % 10];
delay(5);
P1= 0xff;
P1 = 0xfb;
P2 = dp[(i / 2000) % 10];
delay(5);
P1= 0xff;
P1 = 0xf7;
P2 = dp[(i / 20000) % 10];
delay(5);
P1= 0xff;
delay(100);
if(i <= 200000) i++;
}
}
仿真电路图: