51单片机学习——4--数码管显示

数码管静态显示原理

显示器及其接口

单片机系统中常用的显示器有:
发光二极管LED(Light Emitting Diode)显示器、液晶LCD(Liquid Crystal Display)显示器、TFT液晶显示器等。LED显示器有两种显示结构:段显示(7段、米字型等)和点阵显示(5×8、8×8点阵等)。
LED数码管根据LED的不同接法可以分为2类:共阴和共阳。
在这里插入图片描述
使用LED显示器时,要注意区分这两种不同的接法。为了显示数字或字符,必须对数字或字符进行编码。七段数码管加上一个小数点,共计8段。因此为LED显示器提供的编码正好是一个字节。我们实验板用共阴LED显示器,根据电路连接图显示16进制数的编码已列在下表。
0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d
0 1 2 3 4 5
0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c
6 7 8 9 A B
0x39 , 0x5e , 0x79 , 0x71 , 0x00
C D E F 无显示
dp g f e d c b a 对应0000 0000
右四位为低位,左四位为高位

如果我们想让某一段点亮,即令这一位为1,再转化为十六进制,按照这个规律我们就可以得到上述对应表
LED显示器工作方式有两种:静态显示方式和动态显示方式。静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高。

数码管动态显示原理

动态显示的特点是将所有数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
在这里插入图片描述
在这里插入图片描述

74HC138译码器

主要特性
� 采用 CMOS 工艺
� 低功耗
� 工作电压:3.0V—5.0V
� 封装形式:SOP16
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现

#include<reg52.h>

typedef unsigned char u8;
typedef unsigned int u16;

sbit LSA=P2^2; //定义管脚
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 code smg[]={
    
    0x3f  , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d ,0x7d , 0x07 , 0x7f  , 0x6f , 0x77 , 0x7c ,0x39 , 0x5e , 0x79 , 0x71};
//数码管段选数据即显示的数字

void delay(u16 i)//延时函数
{
    
    
   while(i--);
}
//数码管位选数据即让哪个灯亮
void choice(u8 i)
{
    
    
	switch(i)
	{
    
    
		case(0):LSA=0;LSB=0;LSC=0;break;//对应最右边的数码管LSC LSB LSA  000 之和为0
		case(1):LSA=1;LSB=0;LSC=0;break;//对应从右边数第二个数码管LSC LSB LSA  001 之和为1
		case(2):LSA=0;LSB=1;LSC=0;break;//对应从右边数第三个数码管LSC LSB LSA  010 之和为2
		case(3):LSA=1;LSB=1;LSC=0;break;//对应从右边数第四个数码管LSC LSB LSA  011 之和为3
		case(4):LSA=0;LSB=0;LSC=1;break;//对应从右边数第五个数码管LSC LSB LSA  100 之和为4
		case(5):LSA=1;LSB=0;LSC=1;break;//对应从右边数第六个数码管LSC LSB LSA  101 之和为5
		case(6):LSA=0;LSB=1;LSC=1;break;//对应从右边数第七个数码管LSC LSB LSA  110 之和为6
		case(7):LSA=1;LSB=1;LSC=1;break;//对应从右边数第八个数码管LSC LSB LSA  111 之和为7

	}
}

void main()
{
    
    
      u8 i;
	 while(1)
	{
    
    
	  	for(i=0;i<8;i++)
		{
    
    
			choice(i);
			P0=smg[i];//接收段选数据
			delay(100);//利用视觉暂留效应
			P0=0x00;//消影,避免上一次数据的残留
		}
	}
	 
}

猜你喜欢

转载自blog.csdn.net/Joker15517/article/details/113779053