当多个数码管应用于一个系统时,他的位选是可以独立控制的,而段选是连接在一起的。
573芯片 OE为使能端,LE为锁存控制端,D口为输入口,Q口为输出
如图当 OE为使能端,当他为低电平的时候, 锁存器开始工作 VCC和GND为电源和地端 LE为锁存端,当LE为高电平的时候,Q0~Q7都跟D0~D7状态一样 当LE为低电平的时候,Q0~Q7都锁存数据,无论D0~D7怎么变化,Q0~Q7都保持锁存之前的那个状态。一般情况下是默认锁存的。 段选也要有74LS138芯片控制: 138上的1,2,3个口就是通过输入高低电平的搭配,构成8个数码管的工作与否 比如P22=0,pP23=0,P24=0则第一个数码管工作,再对这个数码管输入位选信息,就点亮了一个数码管 动态显示的特点是将所有数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于 静态显示电路中的。 所以依次点亮数码管,就能够达到动态的效果了 该芯片在51开发板上锁存端是P2^6,所以如果想实现数码管显示动态: 当然看到这里有些同学会有疑问了,如果直接把位选的8个控制口直接接到单片机I\O口不行吗,为啥要多装一个573????? 这里其实是这样的:74hc573的目的就是提高驱动电流,因为51单片机输出拉电流太小了,而三极管驱动电路太多复杂,所以采用74hc573。 当然也是可以直接I\O控制的,但是这里就不说了 锁存器: 锁存器(Latch)是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态。锁存,就是把信号暂存以维持某种电平状态。锁存器的最主要作用是缓存,其次完成高速的控制器与慢速的外设的不同步问题,再其次是解决驱动的问题,最后是解决一个 I/O 口既能输出也能输入的问题。 #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的值 /******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,i=1时,大约延时10us *******************************************************************************/ void delay(u16 i) { while(i--); } /******************************************************************************* * 函 数 名 : DigDisplay * 函数功能 : 数码管动态扫描函数,循环扫描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;//消隐 } } /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { while(1) { DigDisplay(); //数码管显示函数 } }
