3、数码管相关(静态、动态)

一、显示器及其接口
        1.1单片机系统中常用的显示器有:
            发光二极管LED(Light Emitting Diode)显示器、液晶LCD(Liquid Crystal Display)显示器、TFT液晶显示器等。LED显示器有两种显示结构:段显示(7段、米字型等)和点阵显示(5×8、8×8点阵等)。
            LED数码管根据LED的不同接法可以分为2类:共阴和共阳。
    
 

 

          1.2、使用LED显示器时,要注意区分这两种不同的接法。为了显示数字或字符,必须对数字或字符进行编码。七段数码管加上一个小数点,共计8段。因此为LED显示器提供的编码正好是一个字节。我们实验板用共阴LED显示器,根据电路连接图显示16进制数的编码已列在下表。

二、静态显示原理
        LED显示器工作方式有两种:静态显示方式和动态显示方式。静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高。
 

 

 

//静态数码管显示实验												  
//实现现象:下载程序后数码管静态显示0。
//注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。																				  


#include "reg52.h"		

typedef unsigned int u16;
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
		    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

void main()
{	
	LSA=0;
	LSB=0;
	LSC=0;	//控制38译码器的Y0输出低电平
	P0=smgduan[0];
	while(1);
}

  

三、74H573锁存器的使用
        3.1.OE为使能端,当他为低电平的时候,锁存器开始工作
        3.2.VCC和GND为电源和地端
        3.3.LE为锁存端,当LE为高电平的时候,Q0~Q7都跟D0~D7状态一样,当LE为低电平的时候,Q0~Q7都锁存数据,无论D0~D7怎么变化,Q0~Q7都保持锁存之前的那个状态。

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

    4.2 74HC138译码器的使用

 

 

// 动态数码管显示实验												
//实现现象:下载程序后数码管从右至左显示0-7。
//注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。																				  


#include "reg52.h"	

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
		    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

//延时函数,i=1时,大约延时10us

void delay(u16 i)
{
	while(i--);	
}


// 数码管动态扫描函数,循环扫描8个数码管显示

void DigDisplay()
{
	u8 i;
	for(i=0;i<8;i++)
	{
		switch(i)	 //位选,选择点亮的数码管,
		{
			case(0):
				LSA=0;LSB=0;LSC=0; break;//显示第0位
			case(1):
				LSA=1;LSB=0;LSC=0; break;//显示第1位
			case(2):
				LSA=0;LSB=1;LSC=0; break;//显示第2位
			case(3):
				LSA=1;LSB=1;LSC=0; break;//显示第3位
			case(4):
				LSA=0;LSB=0;LSC=1; break;//显示第4位
			case(5):
				LSA=1;LSB=0;LSC=1; break;//显示第5位
			case(6):
				LSA=0;LSB=1;LSC=1; break;//显示第6位
			case(7):
				LSA=1;LSB=1;LSC=1; break;//显示第7位	
		}
		P0=smgduan[i];//发送段码
		delay(100); //间隔一段时间扫描	
		P0=0x00;//消隐
	}
}


void main()
{	
	while(1)
	{	
		DigDisplay();  //数码管显示函数	
	}		
}

猜你喜欢

转载自blog.csdn.net/GUA8122HOU/article/details/86658561