这是一篇 2017–2018 年的嵌入式学习笔记,保留当时的工具、代码和实验过程。 查看系列目录

数码管静态显示:

这个是一个共阳的数码管例子:

注意电阻排的阻值选用200欧姆

原图(暂不可用)

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
#include <reg51.h>

#define uint unsigned int
#define uchar unsigned char

uchar code seg[] = {0x40,0x79,0x24,0x30,0x19,
0x12,0x02,0x78,0x00,0x10};

void delay(uint timer)
{
uchar j = 124;
while(timer--)
{
while(j--);
}
}


void main()
{
uchar i=0 ;
while(1)
{
P2 = seg[i];
delay(500);
i = (i+1)%10;
}
}

动态显示

原图(暂不可用)

动态显示

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
#include <reg51.h>

#define uint unsigned int
#define uchar unsigned char

uchar code seg[] = {0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90};

void delay(uint timer)
{
uchar j = 124;
while(timer--)
{
while(j--);
}
}

void main()
{
uchar i=0 ;
while(1)
{
for(i = 0;i<4;i++)
{
P1 = (1<<i);
P2 = seg[i];
delay(500);
}
}
}

共阴数码管的拓展

共阴和共阳数码管的程序移植,在P1.P2同时取非即可,不用更换段码表。

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
#include <reg51.h>

#define uint unsigned int
#define uchar unsigned char

uchar code seg[] = {0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90};

void delay(uint timer)
{
uchar j = 124;
while(timer--)
{
while(j--);
}
}

void main()
{
uchar i=0 ;
while(1)
{
for(i = 0;i<4;i++)
{
P1 = ~(1<<i);
P2 = ~seg[i];
delay(500);
}
}
}

共阴数码管段码

1
2
3
4
uchar code segD[] = {
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x00,0xf3};

使用74138节约IO口

注意:一定要先选同138的地址端,再送段码。
否则字码会混乱(也可以使用74ls48+74ls138)

原图(暂不可用)

使用74138节约IO口

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
69
70
71
72
73
74
#include <reg51.h>

#define uint unsigned int
#define uchar unsigned char


uchar code seg[] = {
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x00,0xf3};


void delay(uint timer)
{
uchar j = 124;
while(timer--)
{
while(j--);
}
}

void display(uint year, uchar month, uchar day)
{
uint tmp;
tmp=year/1000%10;

P3=0;
P2=seg[tmp];
delay(1);

tmp=year/100%10;
P3=1;
P2=seg[tmp];
delay(1);

tmp=year/10%10;
P3=0x02;
P2=seg[tmp];
delay(1);

tmp=year%10;
P3=0x03;
P2=seg[tmp];
delay(1);

tmp=month/10%10;
P3=0x04;
P2=seg[tmp];
delay(1);

tmp=month%10;
P3=0x05;
P2=seg[tmp];
delay(1);

tmp=day/10%10;
P3=0x06;
P2=seg[tmp];
delay(1);

tmp=day%10;
P3=0x07;
P2=seg[tmp];
delay(1);
}


void main()
{
while(1)
{
display(2017, 12, 29);
}
}

使用74ls48+74ls138

原图(暂不可用)

使用74ls48+74ls138

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
69
70
71
72
73
74
#include <reg51.h>

#define uint unsigned int
#define uchar unsigned char


uchar code seg[] = {
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x00,0xf3};


void delay(uint timer)
{
uchar j = 124;
while(timer--)
{
while(j--);
}
}

void display(uint year, uchar month, uchar day)
{
uint tmp;
tmp=year/1000%10;

P3=0;
P2=tmp;
delay(1);

tmp=year/100%10;
P3=1;
P2=tmp;
delay(1);

tmp=year/10%10;
P3=0x02;
P2=tmp;
delay(1);

tmp=year%10;
P3=0x03;
P2=tmp;
delay(1);

tmp=month/10%10;
P3=0x04;
P2=tmp;
delay(1);

tmp=month%10;
P3=0x05;
P2=tmp;
delay(1);

tmp=day/10%10;
P3=0x06;
P2=tmp;
delay(1);

tmp=day%10;
P3=0x07;
P2=tmp;
delay(1);
}


void main()
{
while(1)
{
display(2017, 12, 29);
}
}