静态数码管的显示实验
数码管的简介
数码管是一种半导体发光器件,其基本单元是发光二极管,也称之为LED数码管。**按照发光二极管的单元连接方式,可以分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时,应该将公众极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就会被点亮。
对于共阴极数码管而言,在应用的时候应该将公共极COM接到地线GND上。当某一字段的发光二极管的阳极为高电平时,其相应的字段就会被点亮。
这里就举个例子说下如何去点亮,也就是去显示一些数字。
如上图当中,其实可以清楚看到共阴和共阳数码管的结构。对于共阳极而言,当我们要显示数字0的时候,只需要使“a,b,c,d,e,f”这几个二极管的阴极为低电平时,g和dp为高电平,就会显示出这个数字。
同理,对于共阴极数码管而言,如果想要显示数字0,只需要使“a,b,c,d,e,f”这几个二极管的阳极为高电平,g和dp为低电平就可以了。
下面附上共阴和共阳数码管的码表。这对于编程的时候,数码管显示什么内容可以说是至关重要的。
那么问题就来了:上图当中显示0为什么他的码表是0x3f呢?这其实就比较简单了。对于共阴数码管而言,要想显示数字,只需要使得该显示的二极管亮就可以了,也就是输入高电平就可以了,其余的输入低电平。
在之前的时候就提到过,如果要想显示0,必须要给a,b,c,d,e,f这几个二极管输入高电平,也就是说这几位全部都是1,而g和dp为0。那么结合在一起的话,就成了00111111,也就是十六进制数0x3f。
而共阳显示数字的原理和共阴差不多,并且由于输入电平之间的相反,还使得他们输入同一个数字的十六进制数是相反的,比如0x3f和0xC0。
这里需要注意的是:在计算十六进制数的时候,是将a段作为最低位来处理的,b为次低位,以此类推,dp为最高位,不要搞错,切记!
上图为静态数码管的硬件显示图。从图中可以看出,电路是独立的,静态数码管的八个引脚,并没有直接接到单片机的IO口上,而是接到了J8端子。这在连线的时候,就需要单片机的IO口去控制J8端子的输出,并且顺序不能错。至于中间的电阻,作用是限流用的。
下面是静态数码管显示0的程序:
#include<reg51.h>
#include<intrins.h>
typedef unsigned char u8;
u8 code gh[1]={
0xC0};
void main()
{
P0=gh[0];
while(1);
}
这个程序就比较简单了。我这边用的是共阳极的静态数码管,市面上比较常用的一种。所以在定义了一个无符号字符型的数组,并且这个数组里面也只有一个元素,那就是0xC0,也就是共阳极数码管0的十六进制数。
这里需要注意的是:因为数组的下标都是从0开始的,所以在给P0口赋值的时候,需要使用P0=gh[0]。这个时候的gh[0]=0xC0。切记这个点!
之后的话,我个人又做一个类似的实验,就是用共阳极的静态数码管去循环的显示0-F这16个数。下面分享下实验程序:
#include<reg51.h>
#include<intrins.h>
typedef unsigned char u8;
u8 code gh[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; // 这是共阴极数码管0-F的值,下面用的时候取反就ok
void delay1s(void) //误差 1s
{
unsigned char a,b,c;
for(c=167;c>0;c--)
for(b=171;b>0;b--)
for(a=16;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
void main()
{
unsigned char i;
for