在学习单片机点亮数码管的时候,为实现0-9数字的依次显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;

// #define P0 P0
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;

void delay(unsigned int ms) //@12.000MHz
{
unsigned char i, j;
while (ms--)
{
/* code */
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}

int toBin(unsigned char n)
{
int binaryNumber = 0;
int remainder, i = 1, step = 1;

while (n != 0)
{
remainder = n % 2;
n /= 2;
binaryNumber += remainder * i;
i *= 10;
}
return binaryNumber;
}

/**
* 显示指定的 LED管
*/
void showLed(unsigned char loc, unsigned char num) {
code const int NUMBER[] = {
0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X07, 0X7F, 0X6F
};

// v1 = 7 - v1; // 将顺序翻转
int b = toBin(loc);
P24 = b / 100;
P23 = b / 10 % 10;
P22 = b % 10;
P0 = NUMBER[num];
delay(1);
P0 = 0X00;
}

void main() {
while (1) {
int i;
for (i = 0; i < 10; i++)
{
showLed(2, i);
delay(1000);
/* code */
}
}
}

其中NUMBER中定义的是0-9数字在单片机中二进制的表示
toBin()是将十进制数转为二进制,方便我们在调用的时候直接通过十进制数就能指定到对应的数码管

通用大部分STC89c5xx的单片机
数码管模块及编译器模块原理图