1、数码管显示原理
数码管一般是由led组成的,常见的LED如下所示,我们通过搭接led就可以实现类似数码管的效果
数码管如下所示,一般的数码管都是8位的(7个数字位加上一个小数点的位就是8位):
1、单个数码管显示
可以看一个数码管的原理图,一共是十个引脚,其中有两个是一样的,实际上就是9个,一般那个引脚决定是共阳还是共阴极,如下所示:
那么这样我们来进行排序的话,按照上面提到的方式,如果是显示一个0的话,就是
那么对这8个io口就需要写入:0XFC
不过这里其实是高位在后,应该是:
如果对整段数码管赋值,就是:
unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳极
unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极
2、多个数码管显示
但是在实际情况下,如果一个数码管就要花掉8个IO口,那也太浪费了,所以一般使用多个数码管的时候,都是通过级联的方式来实现的,原理图如下所示:
上图中的led部分通过138译码器来连接实现,如下所示:
这里的数码管采用的共阴极的方式,阴极都连在LED的这个部分,通过138译码器来控制,其实138译码器也很好理解的,就是译码器的三个引脚的高低电平变化可以决定这8个位的状态变化,因为是三个,就是2^3=8中状态,就可以实现了。
2、静态数码管显示
1、138译码器
下面是138译码器的真值表,如下所示:
管脚定义如下所示:
A0、 A1、 A2 输入就相当于 3 位 2 进制数, A0 是低位, A1 是次高位, A2 是高位。 而 Y0-Y7 具体哪一个输出有效电平, 就看输入二进制对应的十进制数值。 比如输入是 101(A2, A1, A0) , 其对应的十进制数是 5, 所以 Y5 输出有效电平(低电平) 。
2、点亮数码管
所以编写程序如下所示:
其中数码管的数组这里贴一下:
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管0-f
下载,可以看到数码管被点亮
3、动态数码管显示
1、数码管动态显示
编写数码管动态显示函数如下:
加入到主函数中来执行
下载到开发板,可以看到效果如下所示:
可以看到这里是一个个的执行的,我们如果想要数码管同时显示怎么办的,只要修改延时时间即可了,这里利用了人眼的视觉暂留作用来实现的,最终效果如下,可以看到基本看不出数码管的切换
2、编写自己的数码管驱动函数
根据前面提到的原理,可以设计自己的数码管函数如下所示,输入数码管位置还有数字
源码如下所示:
void smg_show(u8 num,u8 aaaa)
{
switch(num)//位选
{
case 0: LSC=1;LSB=1;LSA=1;break;
case 1: LSC=1;LSB=1;LSA=0;break;
case 2: LSC=1;LSB=0;LSA=1;break;
case 3: LSC=1;LSB=0;LSA=0;break;
case 4: LSC=0;LSB=1;LSA=1;break;
case 5: LSC=0;LSB=1;LSA=0;break;
case 6: LSC=0;LSB=0;LSA=1;break;
case 7: LSC=0;LSB=0;LSA=0;break;
}
SMG_Port=gsmg_code[aaaa];
}
下载到开发板,最终显示效果如下所示:
发表评论