Linux下C51开发7:八位数码管

系列文章索引:Linux下C51开发系列教程索引

今天,我们来学习八位数码管的开发。

首先,你应该理解一位数码管的开发

八位数码管开发,其实就是控制8个一位数码管。那么就涉及到两个问题:一是选择8个中的一个,二是设置一位数码管的值。前者称为位选,即8位中的哪一位,后者为段选,即8个字段中的哪一段。

段选就是第6篇的一位数码管控制,那么重点就是位选。

位选就是从需要控制的8位数码管中进行选择,选择的方式有两种:一为P[0123](正则表达式语法,表示匹配0123中的任意一个)口直接选择,二为前面提到的译码器。

P口

首先,看一下8位数码管的型号为:CL3641AH。根据上一篇教程我们可以知道这是共阳极数码管。

然后,看一下官方电路图:

J12用来设置单位数码管的数值(和上一篇一样),J10用来设置数码管显示等位,与J12共用一个接地端.并且J10部分没有VCC端,也就是说电流是共用J12流过来的VCC(20)端.那么数码管此时变成了共阴极.

这里我们用P0接J12,P1接J10.

第一步,我们点亮LED2最右侧的一个数码管.

J10.12345678=00000001=P1.01234567

P1.76543210=10000000

取反为:01111111=0x7f

P0就设置为0.

代码为:

1
2
3
4
5
6
7
8
#include "mcs51/8051.h"

int main(){
while(1){
P0=0x3f;//数值
P1=0x7f;//位置
}
}

效果如图:

第二步,我们设置两个,选右数1/3位,显示数字0.

P1=0x5f,P0=0x3f;

代码为:

1
2
3
4
5
6
7
8
#include "mcs51/8051.h"

int main(){
while(1){
P0=0x3f;//数值
P1=0x5f;//位置
}
}

效果如下:

第三步,上一步中的两个数码管动态显示数字.

根据代码,我们可以知道,P1,P0口的设置对所有的数码管都有效,不可能同时设置两个数码管.那么,我们一次设置一个数码管,间隔一段时间设置第二个.欺骗视觉就是动态设置了.

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
#include "mcs51/8051.h"

void delay(unsigned int i); //函数声名

//此表为 LED 的字模, 共阴数码管 0-9 -
unsigned char Disp_Tab[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d,
0x7d, 0x07, 0x7f, 0x6f, 0x40}; //段码控制

//此表为8个数码管位选控制, 共阴数码管 1-8个 -
unsigned char dispbit[ 8 ] = {0xfe, 0xfd, 0xfb, 0xf7,
0xef, 0xdF, 0xbF, 0x7F}; //位选控制 查表的方法控制

int main(){
unsigned int i,LedNumVal=1;
int count=0;
while(1){
if(count>=200){
count=0;
LedNumVal++;
}
for(i=0;i<9;i++){
if(i==0){
P0=Disp_Tab[LedNumVal%8];
P1=0x7f;
}
if(i==2){
P0=Disp_Tab[LedNumVal%8];
P1=0xdf;
}
delay(1);//扫描间隔时间 太长会数码管会有闪烁感
count++;
}
}
}

/*******************延时函数**********************************************/
void delay(unsigned int i) {
char j;
for (i; i > 0; i--)
for (j = 200; j > 0; j--)
;
}

效果:

八位数码管动态显示效果-B站

译码器

见代码,很简单的代码.