根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
① 静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的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(); }