数码管相关电路

数码管(其中com 1~8对应段选,a~dp对应位选。)

动态显示数码管需要进行位选与段选,位选即选定点亮的位置,段选确定需要点亮的数码管区段。分为共阳与共阴数码管,CT107D上使用的即为共阳数码管,即阳极连接在一起,当段选输入低电平时二极管连通点亮数码管对应段。段选位选速度足够快时,即可显示出稳定的数据。

例如:

  • 点亮数字0时,共阳数码管位选输入从高位写到低位1100 0000即为0XC0,共阴数码管取反为(~0XC0)。
  • 点亮数字7时,共阳数码管位选输入从高位写到低位1111 1000即为0XF8,共阴数码管取反为(~0XF8)。
  • 点亮字母F时,共阳数码管位选输入从高位写到低位1000 1110即为0X8E,共阴数码管取反为(~0X8E)。
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

#include<reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
uchar code dig_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

void select(uchar channel)
{
switch(channel)
{
case 4: P2=(P2&0X1F)|0X80;break;
case 5: P2=(P2&0X1F)|0XA0;break;
case 6: P2=(P2&0X1F)|0XC0;break;
case 7: P2=(P2&0X1F)|0XE0;break;
}
}
void init()
{
select(5);
P0=0X00;
}

void delay_tube(uint t)
{
while(t--);
}

void display(uchar channel,uchar value)
{
select(6);
P0=0X01<<channel;//位选,选择数码管点亮的位置
select(7);
P0=dig_code[value];//段选,选择需要点亮的段
}


void main()
{
init();
while(1)
{
display(0,0);
delay_tube(200);
P0=0X00;//消隐
display(1,1);
delay_tube(200);
P0=0X00;
}
}