数码管
1、数码管可以分为共阴极数码管和共阳极数码管
两者区别为:共阴极数码管,每个数码管的阴极接到一起(共地),给某个LED灯信号为低电平0时,LED灯点亮。
共阳极数码管,每个数码管的阳极接到一起,给某个LED灯信号为低电平0时,LED灯点亮。
本原理图使用为共阳极数码管。
2、段选和位选
(1)段选
没一位数码管可有8个发光二极管组成,其中编号如下:
其中,a~g的7个发光二极管经过组合可以组成不同的数字,常用数字为0~9。而dp端可表示小数点。
注:(十六进制,' - ',' .')
共阳极数码管编码表:unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
共阴极数码管编码表:unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x80};
(2)位选
如果说每一位数码管经过段选,可以组成任一数字,那么如果要组成多位数字就需要进行位选操作。
以上述为例,com1、com2、com3、com4分别为第一组4位数码管的位选,当com1=1时,则最左边的数码管进行显示,即位选高电平1有效。
原理图
(位选锁存器)
(段选锁存器)
由原理图可知,令Y6=0时,可操作P0组IO口对数码管进行位选;令Y7=0时,可操作P0组IO口对数码管进行段选(内容)。
静态数码管显示
静态数码管配置较为简单。使用时,将段选与位选进行设置后,锁存器会对数据进行锁存。
有如下例子:
void showSMG(uchar dat,uchar pos) { HC138(6); //数码管位选 P0=0x01 << pos; //位选左移,当令第3位数码管亮时,赋值pos为2(编号从0开始) HC138(7); //数码管段选 P0=table[dat];
} void main() { HC138(5); P0=0x00; showSMG(4,2); //在第3位数码管上静态显示4 while(1) { } }
使用时,可根据数码管显示位置和内容,更改dat和pos的值。
动态数码管显示
动态数码管显示实质上就是轮流点亮单个数码管,在视觉上实现多个数码管同时点亮不同数字。
即:在配置时,令每个数码管点亮时间为1~2ms,只要闪烁的速度足够快, 就能给人一组稳定的显示数据感受。
动态显示作用:节约IO口。若使用静态显示4位数码管,需要段选8*4+4个com端,共计36个;动态显示,需8个段选+4个com端,共计12个。
配置:
按照正常静态数码管显示配置,但是为使多位数码管点亮不同数字,需要不断改变数码管的显示
即:将第一位配置为一个数(位选第一位,令第一位显示这个数),再关闭第一位位选,开启第二位位选,配置第二位。一直循环重复,即可完成动态数码管显示。
注意每个显示间隔可为1~2ms。
(1)静态数码管显示基础下,进行for循环
uchar t=0; uchar show[8]={1,2,3,4,5,6,7,8};//内部元素可以更改更新 void main() { while(1) { for(t=0;t<8;t++)//使用for循环,将show[]内元素依次显示到数码管1~8位上 { ShowSMG(show[t],t); Delay2ms(); } } }
(2)重复的循环显示循环显示
//动态数码管显示部分 void Show_calendar() { ShowSMG(year/1000,0); Delay2ms(); ShowSMG(year%1000/100,1); Delay2ms(); ShowSMG(year%100/10,2); Delay2ms(); ShowSMG(year%10,3); Delay2ms(); ShowSMG(mon/10,4); Delay2ms(); ShowSMG(mon%10,5); Delay2ms(); ShowSMG(day/10,6); Delay2ms(); ShowSMG(day%10,7); Delay2ms(); }
(3)放置于定时器服务函数下,在定时器内进行数码管动态显示
优点:显示稳定,主程序内各种代码都不会影响数码管显示
缺点:耗费定时器资源
void Timer2Init() //2??@12.000MHz { AUXR |= 0x04; T2L = 0x40; T2H = 0xa2; AUXR |= 0x10; IE |= 0x40; EA = 1; } void SMG_Showing()//根据数码管显示要求不同,更改对应位的显示值 { switch(pos_bit) { case 1:Display_bit =dat%1000/100;break; case 2:Display_bit = dat%100/10;break; case 3:Display_bit = dat%10;break; case 6:Display_bit = dat_AD/10;break; case 7:Display_bit = dat_AD%10;break; default:Display_bit = 10;break; } } void Sever_Timer2() interrupt 12//数码管显示精度要求不高,也可以在里面进行一些简单的计时 { SMG_Showing(); SMG_Show_com(pos_bit,Display_bit); if(++pos_bit == 8) pos_bit = 0; }
总结:
1、数码管进行静态、动态显示需要控制相应的段选(亮什么)与位选(亮哪位);
2、位选时,需要令138译码器Y6=0;
3、段选时,需要令138译码器Y7=0;
4、数码管动态显示,还需要注意每一位的停留时间,建议为1~2ms;
5、可将数码管动态显示放入定时器内,使数码管稳定显示,而不会被主程序内的延时函数影响。