C51单片机学习笔记(五)——数码管的静态显示和动态显示
文章目录
- C51单片机学习笔记(五)——数码管的静态显示和动态显示
- 1.数码管的显示原理
- 2.数码管的静态显示
- 3.数码管的动态显示(不用锁存器)
- 4.中断与数码管结合的计时器
1.数码管的显示原理
- 数码管有一位和多位一体两类,它是由8个LED(a,b,c,d,e,f,g,dp)排列组成,任意一个LED叫作一个“段”。通过给a,b,c,d,e,f,g,dp各个脚加上不同的控制电压可以使不同的LED导通发亮,从而显示0~9各个数字和ABCDEF各个字母。
- 由于8个LED共有16个引脚,为了减少引脚,形成了共阳极和共阴极两种数码管,如下图,如果是共阴极,点亮方法就是公共脚加低电平,引出脚加高电平,如果是共阳极,公共脚加高电平,引出脚加低电平即可。(我的数码管是共阳极,所以下面我就使用共阳极进行说明)
2.数码管的静态显示
- 所谓静态显示,就是数码管的笔画点亮后,这些笔画就一直处于点亮状态,而不是处于周期性点亮状态。下面我将以我的原理图为例说明如何点亮静态显示。
- 我的数码管的a,b,c,d,e,f,g,dp接在P0.0~P0.7脚,故我让哪一个二极管亮,就使其脚加低电平,几个LED组合在一起就可以拼出一个数字或字母,下面给出常用的字形码
- 例如要使用‘3’,则数码管的a,b,g,c,d应点亮,其引脚为低电平,其他引脚为高电平,二进制数为dp g f e d c b a 1011 0000,每四位转成十六进制就是b0,所以要先显示‘3’,给P0端口赋值0xb0即可,其他字符的编码类似。
#include
#define uchar unsigned char
#define uint unsigned int
sbit DI1=P1^0;
sbit DI2=P1^1;
sbit DI3=P1^2;
sbit DI4=P1^3;
unsigned char i = 0;
void delay(uint z)
{
uint x,y;
for(x = z;x>0;x--)
for(y = 110;y>0;y--);
}
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void main()
{
P0=0x00;
DI1=0;
while(1)
{
P0 = table[i];
delay(1000);
i++;
if(i>15)
i = 0;
}
}
3.数码管的动态显示(不用锁存器)
- 由于我的板子上没有锁存器。。。所以这里只介绍不用锁存器的动态显示,锁存器的好处只是可以节省I/O口,其实不用锁存器依然可以使数码管动态显示。
- 动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。这样一来,就没有必要每一位数码管配一个锁存器,从而大大地简化了硬件电路。选亮数码管采用动态扫描显示。
- 所谓动态扫描,即是通过分时轮流送出字形码和相应的位选,使各个数码管轮流受控显示。在轮流显示过程中,每位元数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O口,而且功耗更低。
#include
#define uchar unsigned char
sbit DI1=P1^0;
sbit DI2=P1^1;
sbit DI3=P1^2;
sbit DI4=P1^3;
void delay(uchar x)
{
uchar j;
while(x--)
{
for(j=0;j<125;j++)
{;}
}
}
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0xa0,0x83,0xc6,0xa1,0x84,0x8e,0x00};
void main()
{
P0=0x00;
DI1=0;
P0=table[0];
delay(5);
DI1=1;
DI2=0;
P0=table[1];
delay(5);
DI2=1;
DI3=0;
P0=table[2];
delay(5);
DI3=1;
DI4=0;
P0=table[3];
delay(5);
DI4=1;
4.中断与数码管结合的计时器
#include
#define uchar unsigned char
#define uint unsigned int
uchar num = 0;
sbit DI1=P1^0;
sbit DI2=P1^1;
sbit DI3=P1^2;
sbit DI4=P1^3;
uchar i4 = 0;
uchar i3 = 0;
uchar i2 = 0;
uchar i1 = 0;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code table2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
void delay(uint z)
{
uint x,y;
for(x = z;x>0;x--)
for(y = 110;y>0;y--);
}
void display()
{
P0=0x00;
DI1=0;
P0=table[i1];
delay(5);
DI1=1;
DI2=0;
P0=table2[i2];
delay(5);
DI2=1;
DI3=0;
P0=table[i3];
delay(5);
DI3=1;
DI4=0;
P0=table[i4];
delay(5);
DI4=1;
}
void main()
{
TMOD = 0x01;
TH0 = (65536-45872)/256;
TL0 = (65536-45872)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1)
{
if(num == 20)
{
num = 0;
if(i4 == 9)
{
i4 = 0;
if(i3 == 5)
{
i3 = 0;
if(i2 == 9)
{
i2 = 0;
i1++;
}
else
{
i2++;
}
}
else
{
i3++;
}
}
else
{
i4++;
}
}
display();
}
}
void T0time() interrupt 1
{
TH0 = (65536-45872)/256;
TL0 = (65536-45872)%256;
num++;
}