数码管的介绍
一.数码管原理图
注:数码管共有 a、b、c、d、e、f、g、dp 8 段,而实际上,这 8 个段每一段都是一个 LED 小灯,所以一个数码管就是由 8个 LED 小灯组成的。
二.数码管的真值表
字符 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
数值 | 0x3f | 0x06 | 0x5b | 0x4f | 0x66 | 0x6d | 0x7d | 0x07 |
字符 | 8 | 9 | A | B | C | D | E | F |
数值 | 0x7f | 0x6f | 0x77 | 0x7c | 0x39 | 0x5e | 0x79 | 0x71 |
1.要知道的几个概念
a).段选(P2^6)
控制里面发光二极管亮灭来显示字符。
b).位选(P2^7)
数码管公共端,控制哪个数码管亮灭。
2.数码管的连接方式
共阴极,所以给高电平数码管不会亮,给低电平并控制段选后才会亮。
三.数码管的静态显示
1.概念
每个数码管的段选必须接一个8位数据线来保持显示的字形码,当送入一次字形码后,现实的字形可一直保持到下一次字形码的送入。
2.优缺点
优点:占用CPU时间少,显示便于检测和控制。
缺点:硬件电路比较复杂,成本较高。
3.数码管静态显示的例子
用定时器每隔一秒循环显示0-F的字形
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uint t=0,num=0;
void main()
{
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-50000)/2556;
TL0=(65536-50000)%256;
dula=1;
P0=0x00;
dula=0;
wela=1;
P0=0xc0;
wela=0;
while(1)
{
if(t==20)
{
t=0;
if(num==16)
num=0;
dula=1;
num++;
P0=table[num];
dula=0;
}
}
}
void timer() interrupt 1
{
TH0=(65536-50000)/2556;
TL0=(65536-50000)%256;
t++;
}
四.数码管的动态显示
1.概念
将所有位数码管的段选线连接到一起,由为选线控制是哪一位数码管有效。
2.动态扫描显示
轮流向各位数码管送出字形码和相应的位选,利用余晖和人的视觉暂留现象,给人的印象就是一组稳定的显示数据。
3.数码管动态显示的例子
同时在数码管上显示012345
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay()
{
uint i,j;
for(i=5;i>0;i--)
for(j=60;j>0;j--);
}
void main()
{
while(1)
{
dula=1;
P0=table[0];
dula=0;
wela=1;
P0=0xfe;
wela=0;
delay();
dula=1;
P0=table[1];
dula=0;
wela=1;
P0=0xfd;
wela=0;
delay();
dula=1;
P0=table[2];
dula=0;
wela=1;
P0=0xfb;
wela=0;
delay();
dula=1;
P0=table[3];
dula=0;
wela=1;
P0=0xf7;
wela=0;
delay();
dula=1;
P0=table[4];
dula=0;
wela=1;
P0=0xef;
wela=0;
delay();
dula=1;
P0=table[5];
dula=0;
wela=1;
P0=0xdf;
wela=0;
delay();
}
}