数码管的显示

根据数码管的驱动方式的不同,可以分为静态式和动态式两类。


① 静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。

#include<reg51.h>
sbit dula=P2^6;//段选
sbit wela=P2^7;//位选
void main()
{
	wela=1;
	P0=0xFE;
	wela=0;
	
	dula=1;
	P0=0x7f;
	dula=0;
	while(1);


}
#include<reg51.h>
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char code table[]={};
void delay()
{
	unsigned int i,j;
	for(i=50;i>=0;i--)
	  for(j>=110;j>=0;j--)
	    ;

}
void main()
{	
	wela=1;
	P0=0xc0;
	wela=0;
	while(1)
	{
	    unsigned char i;
		for(i=0;i<16;i++)
		{
		    dula=1;
			P0=table[i];
			dula=0;
			delay();

		
		}
	
	
	}

}//数码管静态显示


② 动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。


#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,.........
}
void delay()
void main()
{
   dula=1;
   P0=table[1];
   dula=0;
   P0=0xff;
   wela=1;
   P0=0xfe;
   wela=0;
   delay();


   dula=1;
   P0=table[2];
   dula=0;
   P0=0xff;  
   wela=1;
   P0=0xfd;
   wela=0;
   delay();


   dula=1;
   P0=table[3];
   dula=0;
   P0=0xff;
   wela=1;
   P0=0xfb;
   wela=0;
   delay();




   .........




}  //数码管动态显示


//

用定时器0的方式1实现第一个发光管200ms间隔闪烁,定时器1的方式1实现数码管前两位59s循环计时

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit led1=P1^0;
uchar code table[]={0x3f,0x06..........};//显示数码管0~F的地址
void delay(uint);
void display(uchar,uchar);
uchar num,num1,num2,shi,ge;
void main()
{
	TMOD=0x11;
	TH0=(65536-45872)/256;
	TL0=(65536-45872)%256;
	TH1=(65536-45872)/256;
	TL1=(65536-45872)%256;
	EA=1;
	ET0=1;
	ET1=1;
	TR0=1;
	TR1=1;
	while(1)
	{
		display(shi,ge);
	
	}

}
void delay(uint x)
{
	uint i,j;
	for(i=x;i>0;i--)
	 for(j=110;j>0;j--)
	   ;
}
void time() interrupt 1
{
	TH0=(65536-45872)/256;
	TL0=(65536-45872)%256;
	num1++;
	if(num==4)
	{
		num1=0;
		led1=~led1;
			
	}	

}
void time2() interrupt 3
{
	 TH1=(65536-45872)/256;
     TL1=(65536-45872)%256;
	 num2++;
	 if(num2==20)//二十次 约1s时间
	 {
	   num2=0;
	   num++;
	   if(num==60)
	    num=0;

		shi=num/10;
		ge=num%10;	 	 
	 }
}
void display(shi,ge)
{
	dula=1;
	P0=table[shi];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfe;//1111 1110
	wela=0;
	delay(5);

	dula=1;
	P0=table[ge];
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfd;//1111 1101
	wela=0;
	delay();

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值